Description framework for user-level sysctl nodes. Still haven't

written the descriptions.
This commit is contained in:
atatat 2004-03-24 19:31:46 +00:00
parent 0c0dadc4d9
commit ce0d7254d4
1 changed files with 76 additions and 32 deletions

View File

@ -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
*/