]> git.saurik.com Git - apple/system_cmds.git/blobdiff - sysctl.tproj/sysctl.c
system_cmds-336.23.tar.gz
[apple/system_cmds.git] / sysctl.tproj / sysctl.c
index b1b8e7523758f0fc44207a85261f1bd1b2ae21f5..631ad4094b8a6dfc1afa5a383d88946d0f33c6de 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 1999-2004 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -110,7 +110,6 @@ static char sccsid[] = "@(#)sysctl.c        8.5 (Berkeley) 5/9/95";
 #else
 #include <vm/vm_param.h>
 #endif /* __APPLE__ */
-#include <machine/cpu.h>
 
 #include <errno.h>
 #include <ctype.h>
@@ -146,7 +145,7 @@ 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 */
 #ifdef CTL_MACHDEP_NAMES
@@ -169,7 +168,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 *);
 
@@ -212,7 +211,7 @@ main(argc, argv)
        }
        if (argc == 0)
                usage();
-       for (; *argv != NULL; ++argv)
+       for (; *argv != NULL; ++argv) 
                parse(*argv, 1);
        exit(0);
 }
@@ -350,7 +349,8 @@ old_parse(string, flags)
                break;
 
        case CTL_VM:
-               if (mib[1] == VM_LOADAVG) {
+               switch (mib[1]) {
+               case VM_LOADAVG: {      /* XXX this is bogus */
                        double loads[3];
 
                        getloadavg(loads, 3);
@@ -360,6 +360,33 @@ old_parse(string, flags)
                            loads[0], loads[1], loads[2]);
                        return;
                }
+               case VM_SWAPUSAGE: {
+                       struct xsw_usage        xsu;
+                       int                     saved_errno;
+
+                       size = sizeof (xsu);
+                       if (sysctl(mib, 2, &xsu, &size, NULL, 0) != 0) {
+                               if (flags == 0)
+                                       return;
+                               saved_errno = errno;
+                               if (!nflag)
+                                       fprintf(stderr, "%s: ", string);
+                               fprintf(stderr, "sysctl(VM_SWAPUSAGE): %s\n",
+                                       strerror(saved_errno));
+                               return;
+                       }
+
+                       if (!nflag)
+                               fprintf(stdout, "%s: ", string);
+                       fprintf(stdout,
+                               "total = %.2fM  used = %.2fM  free = %.2fM  %s\n",
+                               ((double) xsu.xsu_total) / (1024.0 * 1024.0),
+                               ((double) xsu.xsu_used) / (1024.0 * 1024.0),
+                               ((double) xsu.xsu_avail) / (1024.0 * 1024.0),
+                               xsu.xsu_encrypted ? "(encrypted)" : "");
+                       return;
+               }
+               }
                if (flags == 0)
                        return;
                fprintf(stderr,
@@ -613,6 +640,9 @@ findname(string, level, bufp, namelist)
        char *name;
        int i;
 
+       /* Make 'sysctl kern.' style behave the same as 'sysctl kern' 3360872*/
+       if (bufp[0][strlen(*bufp)-1] == '.') 
+               bufp[0][strlen(*bufp)-1]='\0';
        if (namelist->list == 0 || (name = strsep(bufp, ".")) == NULL) {
                fprintf(stderr, "%s: incomplete specification\n", string);
                return (-1);
@@ -693,7 +723,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');
                }
@@ -719,8 +749,7 @@ parse(char *string, int flags)
                        case CTLTYPE_STRING:
                                break;
                        case CTLTYPE_QUAD:
-                               break;
-                               sscanf(newval, "%qd", &quadval);
+                               quadval = strtoq(newval, NULL, 0);
                                newval = &quadval;
                                newsize = sizeof quadval;
                                break;
@@ -730,7 +759,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');
@@ -753,7 +782,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;
@@ -886,7 +915,7 @@ 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, *mval, *p;
        char name[BUFSIZ], /* descr[BUFSIZ], */ *fmt;
@@ -932,11 +961,21 @@ 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);
@@ -985,6 +1024,24 @@ show_var(int *oid, int nlen)
                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':
                i = 0;
@@ -1060,7 +1117,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');