From ce0d7254d4dc6f81531b1b920e9793d924bbf125 Mon Sep 17 00:00:00 2001 From: atatat Date: Wed, 24 Mar 2004 19:31:46 +0000 Subject: [PATCH] Description framework for user-level sysctl nodes. Still haven't written the descriptions. --- lib/libc/gen/sysctl.c | 108 +++++++++++++++++++++++++++++------------- 1 file changed, 76 insertions(+), 32 deletions(-) diff --git a/lib/libc/gen/sysctl.c b/lib/libc/gen/sysctl.c index c5f96f1670e1..2572259f75a4 100644 --- a/lib/libc/gen/sysctl.c +++ b/lib/libc/gen/sysctl.c @@ -1,4 +1,4 @@ -/* $NetBSD: sysctl.c,v 1.19 2004/03/24 17:21:02 atatat Exp $ */ +/* $NetBSD: sysctl.c,v 1.20 2004/03/24 19:31:46 atatat Exp $ */ /*- * Copyright (c) 1993 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)sysctl.c 8.2 (Berkeley) 1/4/94"; #else -__RCSID("$NetBSD: sysctl.c,v 1.19 2004/03/24 17:21:02 atatat Exp $"); +__RCSID("$NetBSD: sysctl.c,v 1.20 2004/03/24 19:31:46 atatat Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -112,13 +112,14 @@ user_sysctl(name, namelen, oldp, oldlenp, newp, newlen) const void *newp; size_t *oldlenp, newlen; { -#define _INT(s, n, v) { \ +#define _INT(s, n, v, d) { \ .sysctl_flags = CTLFLAG_IMMEDIATE|CTLFLAG_PERMANENT| \ CTLTYPE_INT|SYSCTL_VERSION, \ .sysctl_size = sizeof(int), \ .sysctl_name = (s), \ .sysctl_num = (n), \ - .sysctl_un = { .scu_idata = (v), }, } + .sysctl_idata = (v), \ + .sysctl_desc = (d), } /* * the nodes under the "user" node @@ -137,60 +138,61 @@ user_sysctl(name, namelen, oldp, oldlenp, newp, newlen) .sysctl_name = "cs_path", .sysctl_num = USER_CS_PATH, .sysctl_data = _PATH_STDPATH, + .sysctl_desc = NULL, }, - _INT("bc_base_max", USER_BC_BASE_MAX, BC_BASE_MAX), - _INT("bc_dim_max", USER_BC_DIM_MAX, BC_DIM_MAX), - _INT("bc_scale_max", USER_BC_SCALE_MAX, BC_SCALE_MAX), - _INT("bc_string_max", USER_BC_STRING_MAX, BC_STRING_MAX), + _INT("bc_base_max", USER_BC_BASE_MAX, BC_BASE_MAX, NULL), + _INT("bc_dim_max", USER_BC_DIM_MAX, BC_DIM_MAX, NULL), + _INT("bc_scale_max", USER_BC_SCALE_MAX, BC_SCALE_MAX, NULL), + _INT("bc_string_max", USER_BC_STRING_MAX, BC_STRING_MAX, NULL), _INT("coll_weights_max", USER_COLL_WEIGHTS_MAX, - COLL_WEIGHTS_MAX), - _INT("expr_nest_max", USER_EXPR_NEST_MAX, EXPR_NEST_MAX), - _INT("line_max", USER_LINE_MAX, LINE_MAX), - _INT("re_dup_max", USER_RE_DUP_MAX, RE_DUP_MAX), - _INT("posix2_version", USER_POSIX2_VERSION, _POSIX2_VERSION), + COLL_WEIGHTS_MAX, NULL), + _INT("expr_nest_max", USER_EXPR_NEST_MAX, EXPR_NEST_MAX, NULL), + _INT("line_max", USER_LINE_MAX, LINE_MAX, NULL), + _INT("re_dup_max", USER_RE_DUP_MAX, RE_DUP_MAX, NULL), + _INT("posix2_version", USER_POSIX2_VERSION, _POSIX2_VERSION, NULL), #ifdef POSIX2_C_BIND - _INT("posix2_c_bind", USER_POSIX2_C_BIND, 1), + _INT("posix2_c_bind", USER_POSIX2_C_BIND, 1, NULL), #else - _INT("posix2_c_bind", USER_POSIX2_C_BIND, 0), + _INT("posix2_c_bind", USER_POSIX2_C_BIND, 0, NULL), #endif #ifdef POSIX2_C_DEV - _INT("posix2_c_dev", USER_POSIX2_C_DEV, 1), + _INT("posix2_c_dev", USER_POSIX2_C_DEV, 1, NULL), #else - _INT("posix2_c_dev", USER_POSIX2_C_DEV, 0), + _INT("posix2_c_dev", USER_POSIX2_C_DEV, 0, NULL), #endif #ifdef POSIX2_CHAR_TERM - _INT("posix2_char_term", USER_POSIX2_CHAR_TERM, 1), + _INT("posix2_char_term", USER_POSIX2_CHAR_TERM, 1, NULL), #else - _INT("posix2_char_term", USER_POSIX2_CHAR_TERM, 0), + _INT("posix2_char_term", USER_POSIX2_CHAR_TERM, 0, NULL), #endif #ifdef POSIX2_FORT_DEV - _INT("posix2_fort_dev", USER_POSIX2_FORT_DEV, 1), + _INT("posix2_fort_dev", USER_POSIX2_FORT_DEV, 1, NULL), #else - _INT("posix2_fort_dev", USER_POSIX2_FORT_DEV, 0), + _INT("posix2_fort_dev", USER_POSIX2_FORT_DEV, 0, NULL), #endif #ifdef POSIX2_FORT_RUN - _INT("posix2_fort_run", USER_POSIX2_FORT_RUN, 1), + _INT("posix2_fort_run", USER_POSIX2_FORT_RUN, 1, NULL), #else - _INT("posix2_fort_run", USER_POSIX2_FORT_RUN, 0), + _INT("posix2_fort_run", USER_POSIX2_FORT_RUN, 0, NULL), #endif #ifdef POSIX2_LOCALEDEF - _INT("posix2_localedef", USER_POSIX2_LOCALEDEF, 1), + _INT("posix2_localedef", USER_POSIX2_LOCALEDEF, 1, NULL), #else - _INT("posix2_localedef", USER_POSIX2_LOCALEDEF, 0), + _INT("posix2_localedef", USER_POSIX2_LOCALEDEF, 0, NULL), #endif #ifdef POSIX2_SW_DEV - _INT("posix2_sw_dev", USER_POSIX2_SW_DEV, 1), + _INT("posix2_sw_dev", USER_POSIX2_SW_DEV, 1, NULL), #else - _INT("posix2_sw_dev", USER_POSIX2_SW_DEV, 0), + _INT("posix2_sw_dev", USER_POSIX2_SW_DEV, 0, NULL), #endif #ifdef POSIX2_UPE - _INT("posix2_upe", USER_POSIX2_UPE, 1), + _INT("posix2_upe", USER_POSIX2_UPE, 1, NULL), #else - _INT("posix2_upe", USER_POSIX2_UPE, 0), + _INT("posix2_upe", USER_POSIX2_UPE, 0, NULL), #endif - _INT("stream_max", USER_STREAM_MAX, FOPEN_MAX), - _INT("tzname_max", USER_TZNAME_MAX, NAME_MAX), - _INT("atexit_max", USER_ATEXIT_MAX, -1), + _INT("stream_max", USER_STREAM_MAX, FOPEN_MAX, NULL), + _INT("tzname_max", USER_TZNAME_MAX, NAME_MAX, NULL), + _INT("atexit_max", USER_ATEXIT_MAX, -1, NULL), #endif /* !lint */ }; #undef _INT @@ -232,6 +234,48 @@ user_sysctl(name, namelen, oldp, oldlenp, newp, newlen) return (0); } + if (name[0] == CTL_DESCRIBE) { + char buf[128]; + struct sysctldesc *d1 = (void *)&buf[0], *d2 = oldp; + size_t d; + + node = newp; + if (node != NULL && + (SYSCTL_VERS(node->sysctl_flags) < SYSCTL_VERS_1 || + newlen != sizeof(struct sysctlnode))) + return (EINVAL); + + sz = 0; + for (ni = 0; ni < clen; ni++) { + memset(&buf[0], 0, sizeof(buf)); + if (node != NULL && + node->sysctl_num != sysctl_usermib[ni].sysctl_num) + continue; + d1->descr_num = sysctl_usermib[ni].sysctl_num; + d1->descr_ver = sysctl_usermib[ni].sysctl_ver; + if (sysctl_usermib[ni].sysctl_desc == NULL) + d1->descr_len = 1; + else { + strncpy(d1->descr_str, + sysctl_usermib[ni].sysctl_desc, + sizeof(buf) - sizeof(*d1)); + buf[sizeof(buf) - 1] = '\0'; + d1->descr_len = strlen(d1->descr_str) + 1; + } + d = (size_t)__sysc_desc_adv(NULL, d1->descr_len); + if (d2 != NULL) + memcpy(d2, d1, d); + sz += d; + if (node != NULL) + break; + } + *oldlenp = sz; + if (sz == 0 && node != NULL) + return (ENOENT); + return (0); + + } + /* * none of these nodes are writable */