diff options
author | Dag-Erling Smørgrav <des@FreeBSD.org> | 1999-01-10 05:33:43 +0000 |
---|---|---|
committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 1999-01-10 05:33:43 +0000 |
commit | 302a1102073f95934112f7a8367fed5ecc6f7fbe (patch) | |
tree | d96e6f0f12e77772c476b15dff8597fcc396f516 /sys/kern/kern_sysctl.c | |
parent | e4329c99422f5bc02d2d75eff70a6ad600499480 (diff) | |
download | src-302a1102073f95934112f7a8367fed5ecc6f7fbe.tar.gz src-302a1102073f95934112f7a8367fed5ecc6f7fbe.zip |
Add kernel support for sysctl descriptions. The NO_SYSCTL_DESCRIPTIONS option
disables them if they're not wanted; in that case, sysctl_sysctl_descr will
always return an empty string.
Apporved by: jkh
Notes
Notes:
svn path=/head/; revision=42466
Diffstat (limited to 'sys/kern/kern_sysctl.c')
-rw-r--r-- | sys/kern/kern_sysctl.c | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index 55e583bf9931..26dade42cd2b 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -37,7 +37,7 @@ * SUCH DAMAGE. * * @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94 - * $Id: kern_sysctl.c,v 1.80 1998/12/13 07:18:54 truckman Exp $ + * $Id: kern_sysctl.c,v 1.81 1998/12/27 18:03:29 dfr Exp $ */ #include "opt_compat.h" @@ -155,9 +155,10 @@ sysctl_order_all(void) * * {0,0} printf the entire MIB-tree. * {0,1,...} return the name of the "..." OID. - * {0,2,...} return the next OID. + * {0,2} return the next OID. * {0,3} return the OID of the name in "new" * {0,4,...} return the kind & format info for the "..." OID. + * {0,5,...} return the description for the "..." OID. */ static void @@ -489,9 +490,53 @@ found: return (error); } - SYSCTL_NODE(_sysctl, 4, oidfmt, CTLFLAG_RD, sysctl_sysctl_oidfmt, ""); +static int +sysctl_sysctl_descr SYSCTL_HANDLER_ARGS +{ +#ifndef NO_SYSCTL_DESCRIPTIONS + int *name = (int *) arg1; + u_int namelen = arg2; + int i, j, error = 0; + struct sysctl_oid **oidpp; + struct linker_set *lsp = &sysctl_; + + if (!lsp || !namelen) + return (SYSCTL_OUT(req, "", 1)); + + while (namelen) { + oidpp = (struct sysctl_oid **) lsp->ls_items; + j = lsp->ls_length; + lsp = 0; + for (i = 0; i < j; i++, oidpp++) { + if (*oidpp && ((*oidpp)->oid_number != *name)) + continue; + + namelen--; + name++; + + if (((*oidpp)->oid_kind & CTLTYPE) != CTLTYPE_NODE) + break; + + if ((*oidpp)->oid_handler) + break; + + lsp = (struct linker_set*)(*oidpp)->oid_arg1; + break; + } + } + + error = SYSCTL_OUT(req, (*oidpp)->oid_descr, + strlen((*oidpp)->oid_descr) + 1); + return (error); +#else + return (SYSCTL_OUT(req, "", 1)); +#endif /* !NO_SYSCTL_DESCRIPTIONS */ +} + +SYSCTL_NODE(_sysctl, 5, descr, CTLFLAG_RD, sysctl_sysctl_descr, ""); + /* * Default "handler" functions. */ |