From owner-freebsd-bugs@FreeBSD.ORG Sun Apr 20 17:10:17 2003 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id D77B337B401 for ; Sun, 20 Apr 2003 17:10:17 -0700 (PDT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id C226F43FBD for ; Sun, 20 Apr 2003 17:10:16 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.9/8.12.9) with ESMTP id h3L0AGUp083277 for ; Sun, 20 Apr 2003 17:10:16 -0700 (PDT) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.9/8.12.9/Submit) id h3L0AGkl083276; Sun, 20 Apr 2003 17:10:16 -0700 (PDT) Resent-Date: Sun, 20 Apr 2003 17:10:16 -0700 (PDT) Resent-Message-Id: <200304210010.h3L0AGkl083276@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Andy Gilligan Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 37F0437B401 for ; Sun, 20 Apr 2003 17:01:19 -0700 (PDT) Received: from mx1.evo6.net (mx1.evo6.net [80.76.194.10]) by mx1.FreeBSD.org (Postfix) with ESMTP id 2F7E443FBF for ; Sun, 20 Apr 2003 17:01:18 -0700 (PDT) (envelope-from andy@mx1.evo6.net) Received: (from andy@localhost) by mx1.evo6.net (8.12.9/8.12.9) id h3L01Gvh098391; Mon, 21 Apr 2003 01:01:16 +0100 (BST) (envelope-from andy) Message-Id: <200304210001.h3L01Gvh098391@mx1.evo6.net> Date: Mon, 21 Apr 2003 01:01:16 +0100 (BST) From: Andy Gilligan To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: kern/51201: [PATCH] MFC for sysctl descriptions. X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Andy Gilligan List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Apr 2003 00:10:18 -0000 >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 >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 #include -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: