Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-2-0]: src/sbin/sysctl Pull up revision 1.92 (requested by atatat ...



details:   https://anonhg.NetBSD.org/src/rev/dee967b03cff
branches:  netbsd-2-0
changeset: 560521:dee967b03cff
user:      tron <tron%NetBSD.org@localhost>
date:      Thu Apr 22 07:52:03 2004 +0000

description:
Pull up revision 1.92 (requested by atatat in ticket #174):
Some lint cleaning, strip leading (and sometimes trailing) whitespace
from values to be assigned when processing a file.  Clean up error
reporting (print the name of the file and the line number), and tidy
some numeric conversions.  Continue after most "errors" when
processing a -f argument.
Addresses PR bin/25115.

diffstat:

 sbin/sysctl/sysctl.c |  365 +++++++++++++++++++++++++++-----------------------
 1 files changed, 200 insertions(+), 165 deletions(-)

diffs (truncated from 766 to 300 lines):

diff -r 32470570142e -r dee967b03cff sbin/sysctl/sysctl.c
--- a/sbin/sysctl/sysctl.c      Thu Apr 22 07:50:48 2004 +0000
+++ b/sbin/sysctl/sysctl.c      Thu Apr 22 07:52:03 2004 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sysctl.c,v 1.86.2.7 2004/04/16 07:54:34 tron Exp $ */
+/*     $NetBSD: sysctl.c,v 1.86.2.8 2004/04/22 07:52:03 tron Exp $ */
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -72,7 +72,7 @@
 #if 0
 static char sccsid[] = "@(#)sysctl.c   8.1 (Berkeley) 6/6/93";
 #else
-__RCSID("$NetBSD: sysctl.c,v 1.86.2.7 2004/04/16 07:54:34 tron Exp $");
+__RCSID("$NetBSD: sysctl.c,v 1.86.2.8 2004/04/22 07:52:03 tron Exp $");
 #endif
 #endif /* not lint */
 
@@ -143,7 +143,12 @@
 static void parse_describe(char *);
 static void getdesc1(int *, u_int, struct sysctlnode *);
 static void getdesc(int *, u_int, struct sysctlnode *);
+static void trim_whitespace(char *, int);
 static void sysctlerror(int);
+static void sysctlparseerror(u_int, const char *);
+static void sysctlperror(const char *, ...);
+#define EXIT(n) do { \
+       if (fn == NULL) exit(n); else return; } while (/*CONSTCOND*/0)
 
 /*
  * "borrowed" from libc:sysctlgetmibinfo.c
@@ -235,6 +240,8 @@
 };
 
 int    Aflag, aflag, dflag, Mflag, nflag, qflag, rflag, wflag, xflag;
+size_t nr;
+char   *fn;
 int    req;
 FILE   *warnfp = stderr;
 
@@ -255,7 +262,6 @@
 int
 main(int argc, char *argv[])
 {
-       char *fn = NULL;
        int name[CTL_MAXNAME];
        int ch;
 
@@ -333,7 +339,8 @@
                if (fp == NULL) {
                        err(1, "%s", fn);
                } else {
-                       while ((l = fparseln(fp, NULL, NULL, NULL, 0)) != NULL)
+                       nr = 0;
+                       while ((l = fparseln(fp, NULL, &nr, NULL, 0)) != NULL)
                        {
                                if (*l) {
                                        parse(l);
@@ -739,10 +746,10 @@
                        value[-1] = '=';
                if (strncmp(key + 2, "create", 6) == 0 &&
                    (key[8] == '=' || key[8] == sep[0]))
-                       parse_create(key + 8 + (key[8] == '='));
+                       parse_create(key + 8 + (key[8] == '=' ? 1 : 0));
                else if (strncmp(key + 2, "destroy", 7) == 0 &&
                         (key[9] == '=' || key[9] == sep[0]))
-                       parse_destroy(key + 9 + (key[9] == '='));
+                       parse_destroy(key + 9 + (key[9] == '=' ? 1 : 0));
                else if (strncmp(key + 2, "describe", 8) == 0 &&
                         (key[10] == '=' || key[10] == sep[0])) {
                        key += 10 + (key[10] == '=');
@@ -755,8 +762,7 @@
                        }
                }
                else
-                       fprintf(warnfp, "%s: unable to parse '%s'\n",
-                               getprogname(), key);
+                       sysctlperror("unable to parse '%s'\n", key);
                return;
        }
 
@@ -766,9 +772,8 @@
 
        if (sysctlgetmibinfo(key, &name[0], &namelen, gsname, &sz, &node,
                             SYSCTL_VERSION) == -1) {
-               fprintf(warnfp, "%s: %s level name '%s' in '%s' is invalid\n",
-                       getprogname(), lname[namelen], gsname, l);
-               exit(1);
+               sysctlparseerror(namelen, l);
+               EXIT(1);
        }
 
        type = SYSCTL_TYPE(node->sysctl_flags);
@@ -783,9 +788,11 @@
                return;
        }
 
+       if (fn)
+               trim_whitespace(value, 1);
+
        if (!wflag) {
-               fprintf(warnfp, "%s: Must specify -w to set variables\n",
-                       getprogname());
+               sysctlperror("Must specify -w to set variables\n");
                exit(1);
        }
 
@@ -851,12 +858,11 @@
        char *nname, *key, *value, *data, *addr, *c, *t;
        int name[CTL_MAXNAME], i, rc, method, flags, rw;
        u_int namelen, type;
-       u_quad_t q;
-       long li, lo;
+       u_quad_t uq;
+       quad_t q;
 
        if (!wflag) {
-               fprintf(warnfp, "%s: Must specify -w to create nodes\n",
-                       getprogname());
+               sysctlperror("Must specify -w to create nodes\n");
                exit(1);
        }
 
@@ -879,7 +885,7 @@
         * misc stuff used when constructing
         */
        i = 0;
-       q = 0;
+       uq = 0;
        key = NULL;
        value = NULL;
 
@@ -933,29 +939,29 @@
                         * (or if the address is invalid).
                         */
                        if (method != 0) {
-                               fprintf(warnfp,
-                                   "%s: %s: already have %s for new node\n",
-                                   getprogname(), nname,
+                               sysctlperror(
+                                   "%s: already have %s for new node\n",
+                                   nname,
                                    method == CTL_CREATE ? "addr" : "symbol");
-                               exit(1);
+                               EXIT(1);
                        }
                        errno = 0;
                        addr = (void*)strtoul(value, &t, 0);
                        if (*t != '\0' || errno != 0) {
-                               fprintf(warnfp,
-                                   "%s: %s: '%s' is not a valid address\n",
-                                   getprogname(), nname, value);
-                               exit(1);
+                               sysctlperror(
+                                   "%s: '%s' is not a valid address\n",
+                                   nname, value);
+                               EXIT(1);
                        }
                        method = CTL_CREATE;
                }
                else if (strcmp(key, "symbol") == 0) {
                        if (method != 0) {
-                               fprintf(warnfp,
-                                   "%s: %s: already have %s for new node\n",
-                                   getprogname(), nname,
+                               sysctlperror(
+                                   "%s: already have %s for new node\n",
+                                   nname,
                                    method == CTL_CREATE ? "addr" : "symbol");
-                               exit(1);
+                               EXIT(1);
                        }
                        addr = value;
                        method = CTL_CREATESYM;
@@ -976,10 +982,10 @@
                        else if (strcmp(value, "struct") == 0)
                                type = CTLTYPE_STRUCT;
                        else {
-                               fprintf(warnfp,
-                                       "%s: %s: '%s' is not a valid type\n",
-                                       getprogname(), nname, value);
-                               exit(1);
+                               sysctlperror(
+                                       "%s: '%s' is not a valid type\n",
+                                       nname, value);
+                               EXIT(1);
                        }
                }
                else if (strcmp(key, "size") == 0) {
@@ -991,23 +997,23 @@
                         */
                        sz = strtoul(value, &t, 0);
                        if (*t != '\0' || errno != 0) {
-                               fprintf(warnfp,
-                                       "%s: %s: '%s' is not a valid size\n",
-                                       getprogname(), nname, value);
-                               exit(1);
+                               sysctlperror(
+                                       "%s: '%s' is not a valid size\n",
+                                       nname, value);
+                               EXIT(1);
                        }
                }
                else if (strcmp(key, "n") == 0) {
                        errno = 0;
-                       li = strtol(value, &t, 0);
-                       node.sysctl_num = li;
-                       lo = node.sysctl_num;
-                       if (*t != '\0' || errno != 0 || li != lo || lo < 0) {
-                               fprintf(warnfp,
-                                   "%s: %s: '%s' is not a valid mib number\n",
-                                   getprogname(), nname, value);
-                               exit(1);
+                       q = strtoq(value, &t, 0);
+                       if (*t != '\0' || errno != 0 ||
+                           q < INT_MIN || q > UINT_MAX) {
+                               sysctlperror(
+                                   "%s: '%s' is not a valid mib number\n",
+                                   nname, value);
+                               EXIT(1);
                        }
+                       node.sysctl_num = (int)q;
                }
                else if (strcmp(key, "flags") == 0) {
                        t = value;
@@ -1045,18 +1051,18 @@
                                        rw = CTLFLAG_READWRITE;
                                        break;
                                default:
-                                       fprintf(warnfp,
-                                          "%s: %s: '%c' is not a valid flag\n",
-                                           getprogname(), nname, *t);
-                                       exit(1);
+                                       sysctlperror(
+                                          "%s: '%c' is not a valid flag\n",
+                                           nname, *t);
+                                       EXIT(1);
                                }
                                t++;
                        }
                }
                else {
-                       fprintf(warnfp, "%s: %s: unrecognized keyword '%s'\n",
-                               getprogname(), nname, key);
-                       exit(1);
+                       sysctlperror("%s: unrecognized keyword '%s'\n",
+                                    nname, key);
+                       EXIT(1);
                }
        }
 
@@ -1073,24 +1079,24 @@
         */
        if (data != NULL) {
                if (addr != NULL) {
-                       fprintf(warnfp,
-                               "%s: %s: cannot specify both value and "
-                               "address\n", getprogname(), nname);
-                       exit(1);
+                       sysctlperror(
+                               "%s: cannot specify both value and "
+                               "address\n", nname);
+                       EXIT(1);
                }
 
                switch (type) {
                case CTLTYPE_INT:
                        errno = 0;
-                       li = strtol(data, &t, 0);
-                       i = li;
-                       lo = i;
-                       if (*t != '\0' || errno != 0 || li != lo || lo < 0) {
-                               fprintf(warnfp,
-                                       "%s: %s: '%s' is not a valid integer\n",
-                                       getprogname(), nname, value);
-                               exit(1);
+                       q = strtoq(data, &t, 0);
+                       if (*t != '\0' || errno != 0 ||
+                               q < INT_MIN || q > UINT_MAX) {
+                               sysctlperror(
+                                   "%s: '%s' is not a valid integer\n",
+                                   nname, value);
+                               EXIT(1);
                        }
+                       i = (int)q;
                        if (!(flags & CTLFLAG_OWNDATA)) {
                                flags |= CTLFLAG_IMMEDIATE;
                                node.sysctl_idata = i;
@@ -1106,35 +1112,34 @@
                        if (sz == 0)
                                sz = strlen(data) + 1;
                        else if (sz < strlen(data) + 1) {
-                               fprintf(warnfp, "%s: %s: ignoring size=%zu for "
+                               sysctlperror("%s: ignoring size=%zu for "
                                        "string node, too small for given "
-                                       "value\n", getprogname(), nname, sz);
+                                       "value\n", nname, sz);
                                sz = strlen(data) + 1;
                        }
                        break;



Home | Main Index | Thread Index | Old Index