]>
git.saurik.com Git - apple/system_cmds.git/blob - sysctl.tproj/sysctl.c
631ad4094b8a6dfc1afa5a383d88946d0f33c6de
2 * Copyright (c) 1999-2004 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License'). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
22 * @APPLE_LICENSE_HEADER_END@
26 * The Regents of the University of California. All rights reserved.
28 * Redistribution and use in source and binary forms, with or without
29 * modification, are permitted provided that the following conditions
31 * 1. Redistributions of source code must retain the above copyright
32 * notice, this list of conditions and the following disclaimer.
33 * 2. Redistributions in binary form must reproduce the above copyright
34 * notice, this list of conditions and the following disclaimer in the
35 * documentation and/or other materials provided with the distribution.
36 * 3. All advertising materials mentioning features or use of this software
37 * must display the following acknowledgement:
38 * This product includes software developed by the University of
39 * California, Berkeley and its contributors.
40 * 4. Neither the name of the University nor the names of its contributors
41 * may be used to endorse or promote products derived from this software
42 * without specific prior written permission.
44 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
45 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
46 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
47 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
48 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
49 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
50 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
51 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
52 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
53 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 Modified November 1, 2000, by Ryan Rempel, ryan.rempel@utoronto.ca
60 The Darwin sysctl mechanism is in a state of flux. Parts of the kernel use the old
61 style of BSD sysctl definition, and other parts use the new style. The sysctl (8)
62 command that shipped with Darwin 1.2 (OS X PB) did not allow you to access
63 all possible sysctl values. In particular, it did not permit access to sysctl values
64 created by kernel extensions--hence my particular interest. The freeBSD sysctl (8)
65 command compiled and ran under Darwin 1.2, and it did permit access to
66 sysctl values created by kernel extensions, as well as several others. However, it
67 did not permit access to many other values which the Darwin 1.2 sysctl could access.
69 What I have done is merge the Darwin 1.2 sysctl and the freeBSD sysctl. Essentially,
70 there are two points of merger. When showing all values (i.e. -a, -A, or -X), sysctl now
71 runs the Darwin 1.2 routine to show all values, and then the freeBSD routine. This does
72 result in some duplication. When getting or setting a particular value, sysctl now tries
73 the freeBSD way first. If it cannot find the value, then it tries the Darwin 1.2 way.
75 There are a few oddities which this creates (aside from some duplication with -a, -A,
76 and -X). The freeBSD version of sysctl now supports two extra options, -b and -X.
77 In this syctl, those options are supported where the value is retrieved by the freeBSD
78 routine, and have no effect where the value is retrieved by the Darwin 1.2 routine.
79 The freeBSD sysctl uses a ':' to separate the name and the value, whereas Darwin 1.2's
80 sysctl uses a '='. I have left this way, as it lets you know which routine was used,
83 I have also fixed several lines which gave warnings previously, one of which appears
84 to have been an actual bug (bufp was dereferenced when it shouldn't have been).
85 I have also incoporated my previous patch to permit setting kern.hostid as an unsigned
86 integer. In the freeBSD side of the code, I have incorporated a general fix for
87 setting values where the format is specified as unsigned integer.
91 static char copyright
[] =
92 "@(#) Copyright (c) 1993\n\
93 The Regents of the University of California. All rights reserved.\n";
97 static char sccsid
[] = "@(#)sysctl.c 8.5 (Berkeley) 5/9/95";
100 #include <sys/param.h>
101 #include <sys/gmon.h>
102 #include <sys/mount.h>
103 #include <sys/stat.h>
104 #include <sys/sysctl.h>
105 #include <sys/socket.h>
107 #include <mach/machine/vm_param.h>
108 #include <mach/machine/vm_types.h>
109 #include <mach/mach_types.h>
111 #include <vm/vm_param.h>
112 #endif /* __APPLE__ */
121 #include <sys/types.h>
122 #include <sys/resource.h>
125 struct ctlname topname
[] = CTL_NAMES
;
126 struct ctlname kernname
[] = CTL_KERN_NAMES
;
127 struct ctlname vmname
[] = CTL_VM_NAMES
;
128 struct ctlname hwname
[] = CTL_HW_NAMES
;
129 struct ctlname username
[] = CTL_USER_NAMES
;
130 struct ctlname debugname
[CTL_DEBUG_MAXID
];
131 struct ctlname
*vfsname
;
132 #ifdef CTL_MACHDEP_NAMES
133 struct ctlname machdepname
[] = CTL_MACHDEP_NAMES
;
139 struct ctlname
*list
;
142 struct list toplist
= { topname
, CTL_MAXID
};
143 struct list secondlevel
[] = {
144 { 0, 0 }, /* CTL_UNSPEC */
145 { kernname
, KERN_MAXID
}, /* CTL_KERN */
146 { vmname
, VM_MAXID
}, /* CTL_VM */
147 { 0, 0 }, /* CTL_VFS */
148 { 0, 0 }, /* CTL_NET */
149 { 0, CTL_DEBUG_MAXID
}, /* CTL_DEBUG */
150 { hwname
, HW_MAXID
}, /* CTL_HW */
151 #ifdef CTL_MACHDEP_NAMES
152 { machdepname
, CPU_MAXID
}, /* CTL_MACHDEP */
154 { 0, 0 }, /* CTL_MACHDEP */
156 { username
, USER_MAXID
}, /* CTL_USER_NAMES */
159 static int Aflag
, aflag
, bflag
, nflag
, wflag
, Xflag
;
160 static int foundSome
= 0;
162 void listall(char *prefix
, struct list
*lp
);
163 void old_parse(char *string
, int flags
);
166 int findname(char *string
, char *level
, char **bufp
, struct list
*namelist
);
169 static void parse(char *string
, int flags
);
170 static int oidfmt(int *, int, char *, u_int
*);
171 static int show_var(int *, int, int);
172 static int sysctl_all (int *oid
, int len
);
173 static int name2oid(char *, int *);
176 * Variables requiring special processing.
178 #define CLOCK 0x00000001
179 #define BOOTTIME 0x00000002
180 #define CONSDEV 0x00000004
187 // extern char *optarg; // unused
191 while ((ch
= getopt(argc
, argv
, "AabnwX")) != EOF
) {
193 case 'A': Aflag
= 1; break;
194 case 'a': aflag
= 1; break;
195 case 'b': bflag
= 1; break;
196 case 'n': nflag
= 1; break;
197 case 'w': wflag
= 1; break;
198 case 'X': Xflag
= Aflag
= 1; break;
205 if (argc
== 0 && (Aflag
|| aflag
)) {
208 for (lvl1
= 1; lvl1
< CTL_MAXID
; lvl1
++)
209 listall(topname
[lvl1
].ctl_name
, &secondlevel
[lvl1
]);
210 exit (sysctl_all(0, 0));
214 for (; *argv
!= NULL
; ++argv
)
220 * List all variables known to the system.
228 char *cp
, name
[BUFSIZ
];
232 strcpy(name
, prefix
);
233 cp
= &name
[strlen(name
)];
235 for (lvl2
= 0; lvl2
< lp
->size
; lvl2
++) {
236 if (lp
->list
[lvl2
].ctl_name
== 0)
238 strcpy(cp
, lp
->list
[lvl2
].ctl_name
);
239 old_parse(name
, Aflag
);
244 * Parse a name into a MIB entry.
245 * Lookup and print out the MIB entry if it exists.
246 * Set a new value if requested.
249 old_parse(string
, flags
)
253 int indx
, type
, state
, len
;
257 int intval
, newsize
= 0;
258 unsigned int uintval
;
259 int useUnsignedInt
= 0;
263 int mib
[CTL_MAXNAME
];
264 char *cp
, *bufp
, buf
[BUFSIZ
] /*, strval[BUFSIZ] */ ;
267 snprintf(buf
, BUFSIZ
, "%s", string
);
268 if ((cp
= strchr(string
, '=')) != NULL
) {
270 fprintf(stderr
, "Must specify -w to set variables\n");
273 *strchr(buf
, '=') = '\0';
278 newsize
= strlen(cp
);
280 if ((indx
= findname(string
, "top", &bufp
, &toplist
)) == -1)
285 if (indx
== CTL_DEBUG
)
287 lp
= &secondlevel
[indx
];
289 if (!foundSome
) fprintf(stderr
, "%s: class is not implemented\n",
290 topname
[indx
].ctl_name
);
294 listall(topname
[indx
].ctl_name
, lp
);
297 if ((indx
= findname(string
, "second", &bufp
, lp
)) == -1)
300 type
= lp
->list
[indx
].ctl_type
;
307 mib
[2] = GPROF_STATE
;
309 if (sysctl(mib
, 3, &state
, &size
, NULL
, 0) < 0) {
313 fprintf(stdout
, "%s: ", string
);
315 "kernel is not compiled for profiling\n");
319 fprintf(stdout
, "%s: %s\n", string
,
320 state
== GMON_PROF_OFF
? "off" : "running");
327 "Use pstat to view %s information\n", string
);
333 "Use ps to view %s information\n", string
);
353 case VM_LOADAVG
: { /* XXX this is bogus */
356 getloadavg(loads
, 3);
358 fprintf(stdout
, "%s: ", string
);
359 fprintf(stdout
, "%.2f %.2f %.2f\n",
360 loads
[0], loads
[1], loads
[2]);
364 struct xsw_usage xsu
;
368 if (sysctl(mib
, 2, &xsu
, &size
, NULL
, 0) != 0) {
373 fprintf(stderr
, "%s: ", string
);
374 fprintf(stderr
, "sysctl(VM_SWAPUSAGE): %s\n",
375 strerror(saved_errno
));
380 fprintf(stdout
, "%s: ", string
);
382 "total = %.2fM used = %.2fM free = %.2fM %s\n",
383 ((double) xsu
.xsu_total
) / (1024.0 * 1024.0),
384 ((double) xsu
.xsu_used
) / (1024.0 * 1024.0),
385 ((double) xsu
.xsu_avail
) / (1024.0 * 1024.0),
386 xsu
.xsu_encrypted
? "(encrypted)" : "");
393 "Use vmstat or systat to view %s information\n", string
);
397 mib
[2] = CTL_DEBUG_VALUE
;
403 if (mib
[1] == CPU_CONSDEV
)
410 mib
[1] = VFS_GENERIC
;
414 if (sysctl(mib
, 4, &vfc
, &size
, (void *)0, (size_t)0) < 0) {
418 if (flags
== 0 && vfc
.vfc_refcount
== 0)
421 fprintf(stdout
, "%s has %d mounted instance%s\n",
422 string
, vfc
.vfc_refcount
,
423 vfc
.vfc_refcount
!= 1 ? "s" : "");
425 fprintf(stdout
, "%d\n", vfc
.vfc_refcount
);
432 fprintf(stderr
, "Illegal top level value: %d\n", mib
[0]);
437 fprintf(stderr
, "name %s in %s is unknown\n", bufp
, string
);
443 if (useUnsignedInt
) {
444 uintval
= strtoul(newval
, 0, 0);
446 newsize
= sizeof uintval
;
448 intval
= atoi(newval
);
450 newsize
= sizeof intval
;
455 sscanf(newval
, "%qd", &quadval
);
457 newsize
= sizeof quadval
;
462 if (sysctl(mib
, len
, buf
, &size
, newsize
? newval
: 0, newsize
) == -1) {
467 fprintf(stderr
, "%s: value is not available\n", string
);
470 fprintf(stderr
, "%s: specification is incomplete\n",
474 fprintf(stderr
, "%s: type is unknown to this program\n",
482 if (special
& CLOCK
) {
483 struct clockinfo
*clkp
= (struct clockinfo
*)buf
;
486 fprintf(stdout
, "%s: ", string
);
488 "hz = %d, tick = %d, profhz = %d, stathz = %d\n",
489 clkp
->hz
, clkp
->tick
, clkp
->profhz
, clkp
->stathz
);
492 if (special
& BOOTTIME
) {
493 struct timeval
*btp
= (struct timeval
*)buf
;
496 fprintf(stdout
, "%s = %s\n", string
,
497 ctime((time_t *) &btp
->tv_sec
));
499 fprintf(stdout
, "%d\n", btp
->tv_sec
);
502 if (special
& CONSDEV
) {
503 dev_t dev
= *(dev_t
*)buf
;
506 fprintf(stdout
, "%s = %s\n", string
,
507 devname(dev
, S_IFCHR
));
509 fprintf(stdout
, "0x%x\n", dev
);
516 fprintf(stdout
, "%s = ", string
);
517 fprintf(stdout
, useUnsignedInt
? "%u\n" : "%d\n", *(int *)buf
);
520 fprintf(stdout
, useUnsignedInt
? "%s: %u -> " : "%s: %d -> ",
521 string
, *(int *)buf
);
522 fprintf(stdout
, useUnsignedInt
? "%u\n" : "%d\n", *(int *)newval
);
529 fprintf(stdout
, "%s = ", string
);
530 fprintf(stdout
, "%s\n", buf
);
533 fprintf(stdout
, "%s: %s -> ", string
, buf
);
534 fprintf(stdout
, "%s\n", (char *) newval
);
541 fprintf(stdout
, "%s = ", string
);
542 fprintf(stdout
, "%qd\n", *(quad_t
*)buf
);
545 fprintf(stdout
, "%s: %qd -> ", string
,
547 fprintf(stdout
, "%qd\n", *(quad_t
*)newval
);
556 fprintf(stderr
, "%s: unknown type returned\n",
563 * Initialize the set of debugging names
570 if (secondlevel
[CTL_DEBUG
].list
!= 0)
572 secondlevel
[CTL_DEBUG
].list
= debugname
;
574 mib
[2] = CTL_DEBUG_NAME
;
575 for (loc
= lastused
, i
= 0; i
< CTL_DEBUG_MAXID
; i
++) {
578 if (sysctl(mib
, 3, &names
[loc
], &size
, NULL
, 0) == -1)
580 debugname
[i
].ctl_name
= &names
[loc
];
581 debugname
[i
].ctl_type
= CTLTYPE_INT
;
588 * Initialize the set of filesystem names
592 int mib
[4], maxtypenum
, cnt
, loc
, size
;
596 if (secondlevel
[CTL_VFS
].list
!= 0)
599 mib
[1] = VFS_GENERIC
;
600 mib
[2] = VFS_MAXTYPENUM
;
602 if (sysctl(mib
, 3, &maxtypenum
, &buflen
, (void *)0, (size_t)0) < 0)
604 if ((vfsname
= malloc(maxtypenum
* sizeof(*vfsname
))) == 0)
606 memset(vfsname
, 0, maxtypenum
* sizeof(*vfsname
));
609 for (loc
= lastused
, cnt
= 0; cnt
< maxtypenum
; cnt
++) {
611 if (sysctl(mib
, 4, &vfc
, &buflen
, (void *)0, (size_t)0) < 0) {
612 if (errno
== EOPNOTSUPP
)
618 strcat(&names
[loc
], vfc
.vfc_name
);
619 vfsname
[cnt
].ctl_name
= &names
[loc
];
620 vfsname
[cnt
].ctl_type
= CTLTYPE_INT
;
621 size
= strlen(vfc
.vfc_name
) + 1;
625 secondlevel
[CTL_VFS
].list
= vfsname
;
626 secondlevel
[CTL_VFS
].size
= maxtypenum
;
631 * Scan a list of names searching for a particular name.
634 findname(string
, level
, bufp
, namelist
)
638 struct list
*namelist
;
643 /* Make 'sysctl kern.' style behave the same as 'sysctl kern' 3360872*/
644 if (bufp
[0][strlen(*bufp
)-1] == '.')
645 bufp
[0][strlen(*bufp
)-1]='\0';
646 if (namelist
->list
== 0 || (name
= strsep(bufp
, ".")) == NULL
) {
647 fprintf(stderr
, "%s: incomplete specification\n", string
);
650 for (i
= 0; i
< namelist
->size
; i
++)
651 if (namelist
->list
[i
].ctl_name
!= NULL
&&
652 strcmp(name
, namelist
->list
[i
].ctl_name
) == 0)
654 if (i
== namelist
->size
) {
655 fprintf(stderr
, "%s level name %s in %s is invalid\n",
656 level
, name
, string
);
665 (void)fprintf(stderr
, "%s\n%s\n%s\n%s\n%s\n",
666 "usage: sysctl [-bn] variable ...",
667 " sysctl [-bn] -w variable=value ...",
675 * Parse a name into a MIB entry.
676 * Lookup and print out the MIB entry if it exists.
677 * Set a new value if requested.
680 parse(char *string
, int flags
)
684 int intval
, newsize
= 0;
685 unsigned int uintval
;
687 int mib
[CTL_MAXNAME
];
688 char *cp
, *bufp
, buf
[BUFSIZ
], fmt
[BUFSIZ
];
692 snprintf(buf
, BUFSIZ
, "%s", string
);
693 if ((cp
= strchr(string
, '=')) != NULL
) {
695 errx(2, "must specify -w to set variables");
696 *strchr(buf
, '=') = '\0';
701 newsize
= strlen(cp
);
706 len
= name2oid(bufp
, mib
);
710 while (*cp
!= '\0') cp
--;
713 old_parse (string
, flags
);
717 if (oidfmt(mib
, len
, fmt
, &kind
))
718 err(1, "couldn't find format of oid '%s'", bufp
);
721 if ((kind
& CTLTYPE
) == CTLTYPE_NODE
) {
722 sysctl_all(mib
, len
);
724 old_parse (string
, flags
);
726 i
= show_var(mib
, len
, 1);
731 if ((kind
& CTLTYPE
) == CTLTYPE_NODE
)
732 errx(1, "oid '%s' isn't a leaf node", bufp
);
734 if (!(kind
&CTLFLAG_WR
))
735 errx(1, "oid '%s' is read only", bufp
);
737 switch (kind
& CTLTYPE
) {
739 if ((*fmt
== 'I') && (*(fmt
+ 1) == 'U')) {
740 uintval
= (unsigned int) strtoul (newval
, NULL
, 0);
742 newsize
= sizeof uintval
;
744 intval
= (int) strtol(newval
, NULL
, 0);
746 newsize
= sizeof intval
;
752 quadval
= strtoq(newval
, NULL
, 0);
754 newsize
= sizeof quadval
;
757 errx(1, "oid '%s' is type %d,"
758 " cannot set that", bufp
,
762 i
= show_var(mib
, len
, 1);
763 if (sysctl(mib
, len
, 0, 0, newval
, newsize
) == -1) {
768 errx(1, "%s: value is not available",
771 errx(1, "%s: specification is incomplete",
774 errx(1, "%s: type is unknown to this program",
785 j
= show_var(mib
, len
, 1);
792 /* These functions will dump out various interesting structures. */
795 S_clockinfo(int l2
, void *p
)
797 struct clockinfo
*ci
= (struct clockinfo
*)p
;
798 if (l2
!= sizeof *ci
)
799 err(1, "S_clockinfo %d != %d", l2
, sizeof *ci
);
800 printf("{ hz = %d, tick = %d, tickadj = %d, profhz = %d, stathz = %d }",
801 ci
->hz
, ci
->tick
, ci
->tickadj
, ci
->profhz
, ci
->stathz
);
806 S_loadavg(int l2
, void *p
)
808 struct loadavg
*tv
= (struct loadavg
*)p
;
810 if (l2
!= sizeof *tv
)
811 err(1, "S_loadavg %d != %d", l2
, sizeof *tv
);
813 printf("{ %.2f %.2f %.2f }",
814 (double)tv
->ldavg
[0]/(double)tv
->fscale
,
815 (double)tv
->ldavg
[1]/(double)tv
->fscale
,
816 (double)tv
->ldavg
[2]/(double)tv
->fscale
);
821 S_timeval(int l2
, void *p
)
823 struct timeval
*tv
= (struct timeval
*)p
;
827 if (l2
!= sizeof *tv
)
828 err(1, "S_timeval %d != %d", l2
, sizeof *tv
);
829 printf("{ sec = %ld, usec = %ld } ",
830 (long) tv
->tv_sec
, (long) tv
->tv_usec
);
832 p1
= strdup(ctime(&tv_sec
));
833 for (p2
=p1
; *p2
; p2
++)
841 T_dev_t(int l2
, void *p
)
843 dev_t
*d
= (dev_t
*)p
;
845 err(1, "T_dev_T %d != %d", l2
, sizeof *d
);
846 if ((int)(*d
) != -1) {
847 if (minor(*d
) > 255 || minor(*d
) < 0)
848 printf("{ major = %d, minor = 0x%x }",
849 major(*d
), minor(*d
));
851 printf("{ major = %d, minor = %d }",
852 major(*d
), minor(*d
));
858 * These functions uses a presently undocumented interface to the kernel
859 * to walk the tree and get the type so it can print the value.
860 * This interface is under work and consideration, and should probably
861 * be killed with a big axe by the first person who can find the time.
862 * (be aware though, that the proper interface isn't as obvious as it
863 * may seem, there are various conflicting requirements.
867 name2oid(char *name
, int *oidp
)
876 j
= CTL_MAXNAME
* sizeof (int);
877 i
= sysctl(oid
, 2, oidp
, &j
, name
, strlen(name
));
885 oidfmt(int *oid
, int len
, char *fmt
, u_int
*kind
)
887 int qoid
[CTL_MAXNAME
+2];
894 memcpy(qoid
+ 2, oid
, len
* sizeof(int));
897 i
= sysctl(qoid
, len
+ 2, buf
, &j
, 0, 0);
899 err(1, "sysctl fmt %d %d %d", i
, j
, errno
);
902 *kind
= *(u_int
*)buf
;
905 strcpy(fmt
, (char *)(buf
+ sizeof(u_int
)));
910 * This formats and outputs the value of one variable
912 * Returns zero if anything was actually output.
913 * Returns one if didn't know what to do with this.
914 * Return minus one if we had errors.
918 show_var(int *oid
, int nlen
, int show_masked
)
920 u_char buf
[BUFSIZ
], *val
, *mval
, *p
;
921 char name
[BUFSIZ
], /* descr[BUFSIZ], */ *fmt
;
922 int qoid
[CTL_MAXNAME
+2];
927 int (*func
)(int, void *) = 0;
930 memcpy(qoid
+ 2, oid
, nlen
* sizeof(int));
934 i
= sysctl(qoid
, nlen
+ 2, name
, &j
, 0, 0);
936 err(1, "sysctl name %d %d %d", i
, j
, errno
);
938 /* find an estimate of how much we need for this var */
940 i
= sysctl(oid
, nlen
, 0, &j
, 0, 0);
941 j
+= j
; /* we want to be sure :-) */
943 val
= mval
= malloc(j
);
945 i
= sysctl(oid
, nlen
, val
, &len
, 0, 0);
952 fwrite(val
, 1, len
, stdout
);
959 i
= sysctl(qoid
, nlen
+ 2, buf
, &j
, 0, 0);
961 err(1, "sysctl fmt %d %d %d", i
, j
, errno
);
963 kind
= *(u_int
*)buf
;
964 if (!show_masked
&& (kind
& CTLFLAG_MASKED
)) {
969 fmt
= (char *)(buf
+ sizeof(u_int
));
974 /* deprecated, do not print */
981 printf("%s: ", name
);
988 printf("%s: ", name
);
991 while (len
>= sizeof(int)) {
993 printf("%s%u", val
, *(unsigned int *)p
);
995 printf("%s%d", val
, *(int *)p
);
1005 printf("%s: ", name
);
1008 while (len
>= sizeof(long)) {
1010 printf("%s%lu", val
, *(unsigned long *)p
);
1012 printf("%s%ld", val
, *(long *)p
);
1014 len
-= sizeof (long);
1022 printf("%s: ", name
);
1023 printf("%p", *(void **)p
);
1029 printf("%s: ", name
);
1032 while (len
>= sizeof(long long)) {
1034 printf("%s%llu", val
, *(unsigned long long *)p
);
1036 printf("%s%lld", val
, *(long long *)p
);
1038 len
-= sizeof (long long);
1039 p
+= sizeof (long long);
1048 if (!strcmp(fmt
, "S,clockinfo")) func
= S_clockinfo
;
1049 else if (!strcmp(fmt
, "S,timeval")) func
= S_timeval
;
1050 else if (!strcmp(fmt
, "S,loadavg")) func
= S_loadavg
;
1051 else if (!strcmp(fmt
, "T,dev_t")) func
= T_dev_t
;
1054 printf("%s: ", name
);
1055 retval
= (*func
)(len
, p
);
1065 printf("%s: ", name
);
1066 printf("Format:%s Length:%ld Dump:0x", fmt
, len
);
1068 printf("%02x", *p
++);
1069 if (Xflag
|| p
< val
+16)
1085 sysctl_all (int *oid
, int len
)
1087 int name1
[22], name2
[22];
1095 memcpy(name1
+2, oid
, len
*sizeof (int));
1103 j
= sysctl(name1
, l1
, name2
, &l2
, 0, 0);
1105 if (errno
== ENOENT
)
1108 err(1, "sysctl(getnext) %d %d", j
, l2
);
1116 for (i
= 0; i
< len
; i
++)
1117 if (name2
[i
] != oid
[i
])
1120 i
= show_var(name2
, l2
, 0);
1124 memcpy(name1
+2, name2
, l2
*sizeof (int));