]> git.saurik.com Git - apple/system_cmds.git/blobdiff - sysctl.tproj/sysctl.c
system_cmds-279.6.1.tar.gz
[apple/system_cmds.git] / sysctl.tproj / sysctl.c
index fb0dbb4be12e198cf2c98aed22a2b9de30ca5f38..bbdc4e41c3f14e90e2aaccb8f9d1dc8e83ac2f5f 100644 (file)
@@ -146,9 +146,9 @@ struct list secondlevel[] = {
        { kernname, KERN_MAXID },       /* CTL_KERN */
        { vmname, VM_MAXID },           /* CTL_VM */
        { 0, 0 },                       /* CTL_VFS */
-    { 0, 0 },          /* CTL_NET */
+       { 0, 0 },                       /* CTL_NET */
        { 0, CTL_DEBUG_MAXID },         /* CTL_DEBUG */
-       { hwname, HW_MAXID },           /* CTL_HW */
+       { 0, 0 },                       /* CTL_HW */
 #ifdef CTL_MACHDEP_NAMES
        { machdepname, CPU_MAXID },     /* CTL_MACHDEP */
 #else
@@ -169,7 +169,7 @@ void usage();
 
 static void    parse(char *string, int flags);
 static int     oidfmt(int *, int, char *, u_int *);
-static int     show_var(int *, int);
+static int     show_var(int *, int, int);
 static int     sysctl_all (int *oid, int len);
 static int     name2oid(char *, int *);
 
@@ -346,10 +346,11 @@ old_parse(string, flags)
                break;
 
        case CTL_HW:
+               useUnsignedInt = 1;
                break;
 
        case CTL_VM:
-               if (mib[1] == VM_LOADAVG) {
+               if (mib[1] == VM_LOADAVG) {     /* XXX this is bogus */
                        double loads[3];
 
                        getloadavg(loads, 3);
@@ -692,7 +693,7 @@ parse(char *string, int flags)
                        foundSome = 1;
                        old_parse (string, flags);
                } else {
-                       i = show_var(mib, len);
+                       i = show_var(mib, len, 1);
                        if (!i && !bflag)
                                putchar('\n');
                }
@@ -729,7 +730,7 @@ parse(char *string, int flags)
                                        kind & CTLTYPE);
                }
 
-               i = show_var(mib, len);
+               i = show_var(mib, len, 1);
                if (sysctl(mib, len, 0, 0, newval, newsize) == -1) {
                        if (!i && !bflag)
                                putchar('\n');
@@ -752,7 +753,7 @@ parse(char *string, int flags)
                        printf(" -> ");
                i = nflag;
                nflag = 1;
-               j = show_var(mib, len);
+               j = show_var(mib, len, 1);
                if (!j && !bflag)
                        putchar('\n');
                nflag = i;
@@ -885,12 +886,13 @@ oidfmt(int *oid, int len, char *fmt, u_int *kind)
  */
 
 static int
-show_var(int *oid, int nlen)
+show_var(int *oid, int nlen, int show_masked)
 {
-       u_char buf[BUFSIZ], *val, *p;
+       u_char buf[BUFSIZ], *val, *mval, *p;
        char name[BUFSIZ], /* descr[BUFSIZ], */ *fmt;
        int qoid[CTL_MAXNAME+2];
        int i;
+       int retval;
        size_t j, len;
        u_int kind;
        int (*func)(int, void *) = 0;
@@ -909,15 +911,18 @@ show_var(int *oid, int nlen)
        i = sysctl(oid, nlen, 0, &j, 0, 0);
        j += j; /* we want to be sure :-) */
 
-       val = alloca(j);
+       val = mval = malloc(j);
        len = j;
        i = sysctl(oid, nlen, val, &len, 0, 0);
-       if (i || !len)
-               return (1);
+       if (i || !len) {
+               retval = 1;
+               goto RETURN;
+       }
 
        if (bflag) {
                fwrite(val, 1, len, stdout);
-               return (0);
+               retval = 0;
+               goto RETURN;
        }
 
        qoid[1] = 4;
@@ -927,16 +932,27 @@ show_var(int *oid, int nlen)
                err(1, "sysctl fmt %d %d %d", i, j, errno);
 
        kind = *(u_int *)buf;
+       if (!show_masked && (kind & CTLFLAG_MASKED)) {
+               retval = 1;
+               goto RETURN;
+       }
 
        fmt = (char *)(buf + sizeof(u_int));
 
        p = val;
        switch (*fmt) {
+       case '-':
+               /* deprecated, do not print */
+               retval = 0;
+               goto RETURN;
+               
+
        case 'A':
                if (!nflag)
                        printf("%s: ", name);
                printf("%s", p);
-               return (0);
+               retval = 0;
+               goto RETURN;
                
        case 'I':
                if (!nflag)
@@ -952,7 +968,8 @@ show_var(int *oid, int nlen)
                        len -= sizeof (int);
                        p += sizeof (int);
                }
-               return (0);
+               retval = 0;
+               goto RETURN;
 
        case 'L':
                if (!nflag)
@@ -968,13 +985,33 @@ show_var(int *oid, int nlen)
                        len -= sizeof (long);
                        p += sizeof (long);
                }
-               return (0);
+               retval = 0;
+               goto RETURN;
 
        case 'P':
                if (!nflag)
                        printf("%s: ", name);
                printf("%p", *(void **)p);
-               return (0);
+               retval = 0;
+               goto RETURN;
+
+       case 'Q':
+               if (!nflag)
+                       printf("%s: ", name);
+               fmt++;
+               val = "";
+               while (len >= sizeof(long long)) {
+                       if(*fmt == 'U')
+                               printf("%s%llu", val, *(unsigned long long *)p);
+                       else
+                               printf("%s%lld", val, *(long long *)p);
+                       val = " ";
+                       len -= sizeof (long long);
+                       p += sizeof (long long);
+               }
+               retval = 0;
+               goto RETURN;
+
 
        case 'T':
        case 'S':
@@ -986,12 +1023,15 @@ show_var(int *oid, int nlen)
                if (func) {
                        if (!nflag)
                                printf("%s: ", name);
-                       return ((*func)(len, p));
+                       retval = (*func)(len, p);
+                       goto RETURN;
                }
                /* FALL THROUGH */
        default:
-               if (!Aflag)
-                       return (1);
+               if (!Aflag) {
+                       retval = 1;
+                       goto RETURN;
+               }
                if (!nflag)
                        printf("%s: ", name);
                printf("Format:%s Length:%ld Dump:0x", fmt, len);
@@ -1002,9 +1042,14 @@ show_var(int *oid, int nlen)
                        printf("...");
                        break;
                }
-               return (0);
+               retval = 0;
+               goto RETURN;
        }
-       return (1);
+
+       retval = 1;
+       RETURN:
+       free(mval);
+       return (retval);
 }
 
 static int
@@ -1043,7 +1088,7 @@ sysctl_all (int *oid, int len)
                        if (name2[i] != oid[i])
                                return 0;
 
-               i = show_var(name2, l2);
+               i = show_var(name2, l2, 0);
                if (!i && !bflag)
                        putchar('\n');