Date: Mon, 21 Apr 2003 01:01:16 +0100 (BST) From: Andy Gilligan <andy@evo6.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/51201: [PATCH] MFC for sysctl descriptions. Message-ID: <200304210001.h3L01Gvh098391@mx1.evo6.net> Resent-Message-ID: <200304210010.h3L0AGkl083276@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 51201 >Category: kern >Synopsis: [PATCH] MFC for sysctl descriptions. >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sun Apr 20 17:10:16 PDT 2003 >Closed-Date: >Last-Modified: >Originator: Andy Gilligan >Release: FreeBSD 4.8-STABLE i386 >Organization: >Environment: >Description: FreeBSD 5.0 and later introduce descriptions for various sysctl oids. This patch brings this functionality to the -STABLE branch. For example: root@host# sysctl -d net.inet.tcp.rfc1323 net.inet.tcp.rfc1323: Enable rfc1323 (high performance TCP) extensions >How-To-Repeat: sysctl -d <oid> >Fix: This patch modifies userland /sbin/sysctl and its man page, along with small kernel changes to allow descriptions. --- sysctl-mfc.patch begins here --- Index: sbin/sysctl/sysctl.8 =================================================================== RCS file: /data/ncvs/src/sbin/sysctl/sysctl.8,v retrieving revision 1.23.2.15 diff -u -r1.23.2.15 sysctl.8 --- sbin/sysctl/sysctl.8 23 Feb 2003 22:20:40 -0000 1.23.2.15 +++ sbin/sysctl/sysctl.8 19 Apr 2003 14:59:15 -0000 @@ -40,11 +40,11 @@ .Nd get or set kernel state .Sh SYNOPSIS .Nm -.Op Fl beNnox +.Op Fl bdeNnox .Ar name Ns Op = Ns Ar value .Ar ... .Nm -.Op Fl beNnox +.Op Fl bdeNnox .Fl a .Sh DESCRIPTION The @@ -71,6 +71,8 @@ Force the value of the variable(s) to be output in raw, binary format. No names are printed and no terminating newlines are output. This is mostly useful with a single variable. +.It Fl d +Print the description of the variable instead of its value. .It Fl e Separate the name and the value of the variable(s) with .Ql = . Index: sbin/sysctl/sysctl.c =================================================================== RCS file: /data/ncvs/src/sbin/sysctl/sysctl.c,v retrieving revision 1.25.2.10 diff -u -r1.25.2.10 sysctl.c --- sbin/sysctl/sysctl.c 22 Jan 2003 00:36:23 -0000 1.25.2.10 +++ sbin/sysctl/sysctl.c 19 Apr 2003 13:29:15 -0000 @@ -63,7 +63,7 @@ #include <string.h> #include <unistd.h> -static int aflag, bflag, eflag, Nflag, nflag, oflag, xflag; +static int aflag, bflag, dflag, eflag, Nflag, nflag, oflag, xflag; static int oidfmt(int *, int, char *, u_int *); static void parse(char *); @@ -78,8 +78,8 @@ { (void)fprintf(stderr, "%s\n%s\n", - "usage: sysctl [-beNnox] variable[=value] ...", - " sysctl [-beNnox] -a"); + "usage: sysctl [-bdeNnox] variable[=value] ...", + " sysctl [-bdeNnox] -a"); exit(1); } @@ -90,7 +90,7 @@ setbuf(stdout,0); setbuf(stderr,0); - while ((ch = getopt(argc, argv, "AabeNnowxX")) != -1) { + while ((ch = getopt(argc, argv, "AabdeNnowxX")) != -1) { switch (ch) { case 'A': /* compatibility */ @@ -102,6 +102,9 @@ case 'b': bflag = 1; break; + case 'd': + dflag = 1; + break; case 'e': eflag = 1; break; @@ -491,6 +494,15 @@ else sep = ": "; + if (dflag) { /* just print description */ + qoid[1] = 5; + j = sizeof(buf); + i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); + if (!nflag) + printf("%s%s", name, sep); + printf("%s", buf); + return(0); + } /* find an estimate of how much we need for this var */ j = 0; i = sysctl(oid, nlen, 0, &j, 0, 0); Index: sys/kern/kern_sysctl.c =================================================================== RCS file: /data/ncvs/src/sys/kern/kern_sysctl.c,v retrieving revision 1.92.2.8 diff -u -r1.92.2.8 kern_sysctl.c --- sys/kern/kern_sysctl.c 9 Sep 2002 19:27:58 -0000 1.92.2.8 +++ sys/kern/kern_sysctl.c 19 Apr 2003 16:37:54 -0000 @@ -303,6 +303,8 @@ } sysctl_unregister_oid(oidp); if (del) { + if (oidp->oid_descr) + free((void *)(uintptr_t)(const void *)oidp->oid_descr, M_SYSCTLOID); free((void *)(uintptr_t)(const void *)oidp->oid_name, M_SYSCTLOID); free(oidp, M_SYSCTLOID); @@ -364,6 +366,12 @@ oidp->oid_arg2 = arg2; } oidp->oid_fmt = fmt; + if (descr) { + int len = strlen(descr) + 1; + oidp->oid_descr = malloc(len, M_SYSCTLOID, M_WAITOK); + if (oidp->oid_descr) + strcpy((char *)(uintptr_t)(const void *)oidp->oid_descr, descr); + }; /* Update the context, if used */ if (clist != NULL) sysctl_ctx_entry_add(clist, oidp); @@ -718,6 +726,24 @@ SYSCTL_NODE(_sysctl, 4, oidfmt, CTLFLAG_RD, sysctl_sysctl_oidfmt, ""); + +static int +sysctl_sysctl_oiddescr(SYSCTL_HANDLER_ARGS) +{ + struct sysctl_oid *oid; + int error; + + error = sysctl_find_oid(arg1, arg2, &oid, NULL, req); + if (error) + return (error); + + if (!oid->oid_descr) + return (ENOENT); + error = SYSCTL_OUT(req, oid->oid_descr, strlen(oid->oid_descr) + 1); + return (error); +} + +SYSCTL_NODE(_sysctl, 5, oiddescr, CTLFLAG_RD, sysctl_sysctl_oiddescr, ""); /* * Default "handler" functions. Index: sys/sys/sysctl.h =================================================================== RCS file: /data/ncvs/src/sys/sys/sysctl.h,v retrieving revision 1.81.2.9 diff -u -r1.81.2.9 sysctl.h --- sys/sys/sysctl.h 9 Sep 2002 19:27:54 -0000 1.81.2.9 +++ sys/sys/sysctl.h 19 Apr 2003 16:32:13 -0000 @@ -133,6 +133,7 @@ int (*oid_handler)(SYSCTL_HANDLER_ARGS); const char *oid_fmt; int oid_refcnt; + const char *oid_descr; }; #define SYSCTL_IN(r, p, l) (r->newfunc)(r, p, l) @@ -174,7 +175,7 @@ #define SYSCTL_OID(parent, nbr, name, kind, a1, a2, handler, fmt, descr) \ static struct sysctl_oid sysctl__##parent##_##name = { \ &sysctl_##parent##_children, { 0 }, \ - nbr, kind, a1, a2, #name, handler, fmt, 0 }; \ + nbr, kind, a1, a2, #name, handler, fmt, 0, descr }; \ DATA_SET(sysctl_set, sysctl__##parent##_##name); #define SYSCTL_ADD_OID(ctx, parent, nbr, name, kind, a1, a2, handler, fmt, descr) \ --- sysctl-mfc.patch ends here --- >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200304210001.h3L01Gvh098391>