From ce68c9929a563b13359a26db8ccf85340f68cfe7 Mon Sep 17 00:00:00 2001 From: "David E. O'Brien" Date: Mon, 10 May 1999 10:17:22 +0000 Subject: [PATCH] Move sysctl/ to src/sbin/ where it now belongs. Repository copied by: Peter --- sbin/Makefile | 3 +- sbin/sysctl/Makefile | 5 +- usr.sbin/Makefile | 3 +- usr.sbin/sysctl/Makefile | 10 - usr.sbin/sysctl/pathconf.c | 240 ------------------ usr.sbin/sysctl/sysctl.8 | 243 ------------------ usr.sbin/sysctl/sysctl.c | 502 ------------------------------------- 7 files changed, 4 insertions(+), 1002 deletions(-) delete mode 100644 usr.sbin/sysctl/Makefile delete mode 100644 usr.sbin/sysctl/pathconf.c delete mode 100644 usr.sbin/sysctl/sysctl.8 delete mode 100644 usr.sbin/sysctl/sysctl.c diff --git a/sbin/Makefile b/sbin/Makefile index be7781d5fb93..596b22c2aca6 100644 --- a/sbin/Makefile +++ b/sbin/Makefile @@ -1,5 +1,5 @@ # @(#)Makefile 8.5 (Berkeley) 3/31/94 -# $Id: Makefile,v 1.67 1999/03/12 15:38:53 brian Exp $ +# $Id: Makefile,v 1.68 1999/04/18 15:56:19 peter Exp $ # XXX MISSING: icheck ncheck @@ -57,6 +57,7 @@ SUBDIR= adjkerntz \ slattach \ spppcontrol \ startslip \ + sysctl \ swapon \ tunefs \ umount \ diff --git a/sbin/sysctl/Makefile b/sbin/sysctl/Makefile index e0c6a2238d45..46be1feb96b4 100644 --- a/sbin/sysctl/Makefile +++ b/sbin/sysctl/Makefile @@ -1,10 +1,7 @@ # @(#)Makefile 8.1 (Berkeley) 6/6/93 -# $Id$ +# $Id: Makefile,v 1.3 1997/12/18 15:34:08 bde Exp $ PROG= sysctl MAN8= sysctl.8 -BINDIR= /sbin -NOSHARED?= yes - .include diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile index 4b57acc9e3b9..1f990838f607 100644 --- a/usr.sbin/Makefile +++ b/usr.sbin/Makefile @@ -1,5 +1,5 @@ # From: @(#)Makefile 5.20 (Berkeley) 6/12/93 -# $Id: Makefile,v 1.153 1999/04/28 11:36:28 phk Exp $ +# $Id: Makefile,v 1.154 1999/05/05 07:37:03 wpaul Exp $ # XXX MISSING: mkproto SUBDIR= IPXrouted \ @@ -81,7 +81,6 @@ SUBDIR= IPXrouted \ sliplogin \ slstat \ spray \ - sysctl \ syslogd \ tcpdchk \ tcpdmatch \ diff --git a/usr.sbin/sysctl/Makefile b/usr.sbin/sysctl/Makefile deleted file mode 100644 index e0c6a2238d45..000000000000 --- a/usr.sbin/sysctl/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# @(#)Makefile 8.1 (Berkeley) 6/6/93 -# $Id$ - -PROG= sysctl -MAN8= sysctl.8 - -BINDIR= /sbin -NOSHARED?= yes - -.include diff --git a/usr.sbin/sysctl/pathconf.c b/usr.sbin/sysctl/pathconf.c deleted file mode 100644 index 07f786d82086..000000000000 --- a/usr.sbin/sysctl/pathconf.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static const char copyright[] = -"@(#) Copyright (c) 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)pathconf.c 8.1 (Berkeley) 6/6/93"; -#endif -static const char rcsid[] = - "$Id$"; -#endif /* not lint */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#define PC_NAMES { \ - { 0, 0 }, \ - { "link_max", CTLTYPE_INT }, \ - { "max_canon", CTLTYPE_INT }, \ - { "max_input", CTLTYPE_INT }, \ - { "name_max", CTLTYPE_INT }, \ - { "path_max", CTLTYPE_INT }, \ - { "pipe_buf", CTLTYPE_INT }, \ - { "chown_restricted", CTLTYPE_INT }, \ - { "no_trunc", CTLTYPE_INT }, \ - { "vdisable", CTLTYPE_INT }, \ -} -#define PC_MAXID 10 - -struct ctlname pcnames[] = PC_NAMES; -char names[BUFSIZ]; - -struct list { - struct ctlname *list; - int size; -}; -struct list pclist = { pcnames, PC_MAXID }; - -int Aflag, aflag, nflag, wflag, stdinflag; - -int findname __P((char *, char *, char**, struct list *)); -void listall __P((char *, struct list *)); -void parse __P((char *, char *, int)); -static void usage __P((void)); - -int -main(argc, argv) - int argc; - char *argv[]; -{ - char *path; - int ch; - - while ((ch = getopt(argc, argv, "Aan")) != -1) { - switch (ch) { - - case 'A': - Aflag = 1; - break; - - case 'a': - aflag = 1; - break; - - case 'n': - nflag = 1; - break; - - default: - usage(); - } - } - argc -= optind; - argv += optind; - - if (argc == 0) - usage(); - path = *argv++; - if (strcmp(path, "-") == 0) - stdinflag = 1; - argc--; - if (Aflag || aflag) { - listall(path, &pclist); - exit(0); - } - if (argc == 0) - usage(); - while (argc-- > 0) - parse(path, *argv, 1); - exit(0); -} - -/* - * List all variables known to the system. - */ -void -listall(path, lp) - char *path; - struct list *lp; -{ - int lvl2; - - if (lp->list == 0) - return; - for (lvl2 = 0; lvl2 < lp->size; lvl2++) { - if (lp->list[lvl2].ctl_name == 0) - continue; - parse(path, lp->list[lvl2].ctl_name, Aflag); - } -} - -/* - * Parse a name into an index. - * Lookup and print out the attribute if it exists. - */ -void -parse(pathname, string, flags) - char *pathname; - char *string; - int flags; -{ - int indx, value; - char *bufp, buf[BUFSIZ]; - - bufp = buf; - snprintf(buf, BUFSIZ, "%s", string); - if ((indx = findname(string, "top", &bufp, &pclist)) == -1) - return; - if (bufp) { - warnx("name %s in %s is unknown", *bufp, string); - return; - } - if (stdinflag) - value = fpathconf(0, indx); - else - value = pathconf(pathname, indx); - if (value == -1) { - if (flags == 0) - return; - switch (errno) { - case EOPNOTSUPP: - warnx("%s: value is not available", string); - return; - case ENOTDIR: - warnx("%s: specification is incomplete", string); - return; - case ENOMEM: - warnx("%s: type is unknown to this program", string); - return; - default: - warn("%s", string); - return; - } - } - if (!nflag) - fprintf(stdout, "%s = ", string); - fprintf(stdout, "%d\n", value); -} - -/* - * Scan a list of names searching for a particular name. - */ -int -findname(string, level, bufp, namelist) - char *string; - char *level; - char **bufp; - struct list *namelist; -{ - char *name; - int i; - - if (namelist->list == 0 || (name = strsep(bufp, ".")) == NULL) { - warnx("%s: incomplete specification", string); - return (-1); - } - for (i = 0; i < namelist->size; i++) - if (namelist->list[i].ctl_name != NULL && - strcmp(name, namelist->list[i].ctl_name) == 0) - break; - if (i == namelist->size) { - warnx("%s level name %s in %s is invalid", level, name, string); - return (-1); - } - return (i); -} - -static void -usage() -{ - - (void)fprintf(stderr, "%s\n%s\n%s\n", - "usage: pathname [-n] variable ...", - " pathname [-n] -a", - " pathname [-n] -A"); - exit(1); -} diff --git a/usr.sbin/sysctl/sysctl.8 b/usr.sbin/sysctl/sysctl.8 deleted file mode 100644 index e959ecd77aff..000000000000 --- a/usr.sbin/sysctl/sysctl.8 +++ /dev/null @@ -1,243 +0,0 @@ -.\" Copyright (c) 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" From: @(#)sysctl.8 8.1 (Berkeley) 6/6/93 -.\" $Id: sysctl.8,v 1.17 1998/09/29 02:01:06 jkoshy Exp $ -.\" -.Dd September 23, 1994 -.Dt SYSCTL 8 -.Os -.Sh NAME -.Nm sysctl -.Nd get or set kernel state -.Sh SYNOPSIS -.Nm sysctl -.Op Fl bdn -.Ar name ... -.Nm sysctl -.Op Fl bn -.Fl w -.Ar name=value ... -.Nm sysctl -.Op Fl bdn -.Fl aAX -.Sh DESCRIPTION -The -.Nm -utility retrieves kernel state and allows processes with -appropriate privilege to set kernel state. -The state to be retrieved or set is described using a -``Management Information Base'' (``MIB'') style name, -described as a dotted set of components. -.Pp -The following options are available: -.Bl -tag -width indent -.It Fl a -List all the currently available string or integer values. -.It Fl A -List all the known MIB names including opaques. -Those with string or integer values will be printed as with the -.Fl a -flag; for the opaque values, -information about the format and the length is printed in addition the first -few bytes is dumped in hex. -.It Fl X -Same as -.Fl A -except the entire value of opaque variables is hexdumped. -.It Fl n -Specify that the printing of the field name should be -suppressed and that only its value should be output. -This flag is useful for setting shell variables. -For example, to save the pagesize in variable psize, use: -.Bd -literal -offset indent -compact -set psize=`sysctl -n hw.pagesize` -.Ed -.It Fl b -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 -Display the description rather than the value of the requested -variable(s). -.It Fl w Ar name=value ... -Set the MIB -.Ar name -to the new -.Ar value . -If just a MIB style -.Ar name -is given, -the corresponding value is retrieved. -.El -.Pp -The information available from -.Nm -consists of integers, strings, and opaques. -.Nm Sysctl -only knows about a couple of opaque types, and will resort to hexdumps -for the rest. -The opaque information is much more useful if retrieved by special -purpose programs such as -.Nm ps , -.Nm systat , -and -.Nm netstat . -.Pp -The string and integer information is summarized below. -For a detailed description of these variable see -.Xr sysctl 3 . -.Pp -The changeable column indicates whether a process with appropriate -privilege can change the value. -.Bl -column net.inet.ip.forwardingxxxxxx integerxxx -.It Sy Name Type Changeable -.It kern.ostype string no -.It kern.osrelease string no -.It kern.osrevision integer no -.It kern.version string no -.It kern.maxvnodes integer yes -.It kern.maxproc integer no -.It kern.maxprocperuid integer yes -.It kern.maxfiles integer yes -.It kern.maxfilesperproc integer yes -.It kern.argmax integer no -.It kern.securelevel integer raise only -.It kern.hostname string yes -.It kern.hostid integer yes -.It kern.clockrate struct no -.It kern.posix1version integer no -.It kern.ngroups integer no -.It kern.job_control integer no -.It kern.saved_ids integer no -.It kern.boottime struct no -.It kern.domainname string yes -.It kern.update integer yes -.It kern.osreldate string no -.It kern.bootfile string yes -.It kern.corefile string yes -.It kern.logsigexit integer yes -.It vm.loadavg struct no -.It hw.machine string no -.It hw.model string no -.It hw.ncpu integer no -.It hw.byteorder integer no -.It hw.physmem integer no -.It hw.usermem integer no -.It hw.pagesize integer no -.It hw.floatingpoint integer no -.It hw.machine_arch string no -.It machdep.console_device dev_t no -.It machdep.adjkerntz integer yes -.It machdep.disable_rtc_set integer yes -.It user.cs_path string no -.It user.bc_base_max integer no -.It user.bc_dim_max integer no -.It user.bc_scale_max integer no -.It user.bc_string_max integer no -.It user.coll_weights_max integer no -.It user.expr_nest_max integer no -.It user.line_max integer no -.It user.re_dup_max integer no -.It user.posix2_version integer no -.It user.posix2_c_bind integer no -.It user.posix2_c_dev integer no -.It user.posix2_char_term integer no -.It user.posix2_fort_dev integer no -.It user.posix2_fort_run integer no -.It user.posix2_localedef integer no -.It user.posix2_sw_dev integer no -.It user.posix2_upe integer no -.It user.stream_max integer no -.It user.tzname_max integer no -.El -.Sh EXAMPLES -For example, to retrieve the maximum number of processes allowed -in the system, one would use the follow request: -.Bd -literal -offset indent -compact -sysctl kern.maxproc -.Ed -.Pp -To set the maximum number of processes allowed -per uid to 1000, one would use the follow request: -.Bd -literal -offset indent -compact -sysctl -w kern.maxprocperuid=1000 -.Ed -.Pp -Information about the system clock rate may be obtained with: -.Bd -literal -offset indent -compact -sysctl kern.clockrate -.Ed -.Pp -Information about the load average history may be obtained with: -.Bd -literal -offset indent -compact -sysctl vm.loadavg -.Ed -.Pp -More variables than these exist, and the best and likely only place -to search for their deeper meaning is undoubtedly the source where -they are defined. -.Sh FILES -.Bl -tag -width -compact -.It Pa -definitions for top level identifiers, second level kernel and hardware -identifiers, and user level identifiers -.It Pa -definitions for second level network identifiers -.It Pa -definitions for third level profiling identifiers -.It Pa -definitions for second level virtual memory identifiers -.It Pa -definitions for third level Internet identifiers and -fourth level IP identifiers -.It Pa -definitions for fourth level ICMP identifiers -.It Pa -definitions for fourth level UDP identifiers -.El -.Sh SEE ALSO -.Xr sysctl 3 -.Sh BUGS -.Nm Sysctl -presently exploits an undocumented interface to the kernel -sysctl facility to traverse the sysctl tree and to retrieve format -and name information. -This correct interface is being thought about for the time being. -.Sh HISTORY -.Nm Sysctl -first appeared in -.Bx 4.4 . -.Pp -In -.Fx 2.2 , -.Nm -was significantly remodeled. diff --git a/usr.sbin/sysctl/sysctl.c b/usr.sbin/sysctl/sysctl.c deleted file mode 100644 index f264409d6b3d..000000000000 --- a/usr.sbin/sysctl/sysctl.c +++ /dev/null @@ -1,502 +0,0 @@ -/* - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static const char copyright[] = -"@(#) Copyright (c) 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)from: sysctl.c 8.1 (Berkeley) 6/6/93"; -#endif -static const char rcsid[] = - "$Id: sysctl.c,v 1.19 1998/11/08 19:27:43 phk Exp $"; -#endif /* not lint */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -static int Aflag, aflag, bflag, dflag, nflag, wflag, Xflag; - -static int oidfmt(int *, int, char *, u_int *); -static void parse(char *); -static int show_var(int *, int); -static int sysctl_all (int *oid, int len); -static int name2oid(char *, int *); - -static void -usage(void) -{ - - (void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", - "usage: sysctl [-bdn] variable ...", - " sysctl [-bn] -w variable=value ...", - " sysctl [-bdn] -a", - " sysctl [-bdn] -A", - " sysctl [-bdn] -X"); - exit(1); -} - -int -main(int argc, char **argv) -{ - int ch; - setbuf(stdout,0); - setbuf(stderr,0); - - while ((ch = getopt(argc, argv, "AabdnwX")) != -1) { - switch (ch) { - case 'A': Aflag = 1; break; - case 'a': aflag = 1; break; - case 'b': bflag = 1; break; - case 'd': dflag = 1; break; - case 'n': nflag = 1; break; - case 'w': wflag = 1; break; - case 'X': Xflag = Aflag = 1; break; - default: usage(); - } - } - argc -= optind; - argv += optind; - - if (wflag && (Aflag || aflag || dflag)) - usage(); - if (Aflag || aflag) - exit (sysctl_all(0, 0)); - if (argc == 0) - usage(); - while (argc-- > 0) - parse(*argv++); - exit(0); -} - -/* - * Parse a name into a MIB entry. - * Lookup and print out the MIB entry if it exists. - * Set a new value if requested. - */ -static void -parse(char *string) -{ - int len, i, j; - void *newval = 0; - int intval, newsize = 0; - quad_t quadval; - int mib[CTL_MAXNAME]; - char *cp, *bufp, buf[BUFSIZ]; - u_int kind; - - bufp = buf; - snprintf(buf, BUFSIZ, "%s", string); - if ((cp = strchr(string, '=')) != NULL) { - if (!wflag) - errx(2, "must specify -w to set variables"); - *strchr(buf, '=') = '\0'; - *cp++ = '\0'; - while (isspace(*cp)) - cp++; - newval = cp; - newsize = strlen(cp); - } else { - if (wflag) - usage(); - } - len = name2oid(bufp, mib); - - if (len < 0) - errx(1, "unknown oid '%s'", bufp); - - if (oidfmt(mib, len, 0, &kind)) - err(1, "couldn't find format of oid '%s'", bufp); - - if (!wflag) { - if ((kind & CTLTYPE) == CTLTYPE_NODE) { - sysctl_all(mib, len); - } else { - i = show_var(mib, len); - if (!i && !bflag) - putchar('\n'); - } - } else { - if ((kind & CTLTYPE) == CTLTYPE_NODE) - errx(1, "oid '%s' isn't a leaf node", bufp); - - if (!(kind&CTLFLAG_WR)) - errx(1, "oid '%s' is read only", bufp); - - switch (kind & CTLTYPE) { - case CTLTYPE_INT: - intval = atoi(newval); - newval = &intval; - newsize = sizeof intval; - break; - break; - case CTLTYPE_STRING: - break; - case CTLTYPE_QUAD: - break; - sscanf(newval, "%qd", &quadval); - newval = &quadval; - newsize = sizeof quadval; - break; - default: - errx(1, "oid '%s' is type %d," - " cannot set that", bufp, - kind & CTLTYPE); - } - - i = show_var(mib, len); - if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { - if (!i && !bflag) - putchar('\n'); - switch (errno) { - case EOPNOTSUPP: - errx(1, "%s: value is not available", - string); - case ENOTDIR: - errx(1, "%s: specification is incomplete", - string); - case ENOMEM: - errx(1, "%s: type is unknown to this program", - string); - default: - warn("%s", string); - return; - } - } - if (!bflag) - printf(" -> "); - i = nflag; - nflag = 1; - j = show_var(mib, len); - if (!j && !bflag) - putchar('\n'); - nflag = i; - } -} - -/* These functions will dump out various interesting structures. */ - -static int -S_clockinfo(int l2, void *p) -{ - struct clockinfo *ci = (struct clockinfo*)p; - if (l2 != sizeof *ci) - err(1, "S_clockinfo %d != %d", l2, sizeof *ci); - printf("{ hz = %d, tick = %d, tickadj = %d, profhz = %d, stathz = %d }", - ci->hz, ci->tick, ci->tickadj, ci->profhz, ci->stathz); - return (0); -} - -static int -S_loadavg(int l2, void *p) -{ - struct loadavg *tv = (struct loadavg*)p; - - if (l2 != sizeof *tv) - err(1, "S_loadavg %d != %d", l2, sizeof *tv); - - printf("{ %.2f %.2f %.2f }", - (double)tv->ldavg[0]/(double)tv->fscale, - (double)tv->ldavg[1]/(double)tv->fscale, - (double)tv->ldavg[2]/(double)tv->fscale); - return (0); -} - -static int -S_timeval(int l2, void *p) -{ - struct timeval *tv = (struct timeval*)p; - time_t tv_sec; - char *p1, *p2; - - if (l2 != sizeof *tv) - err(1, "S_timeval %d != %d", l2, sizeof *tv); - printf("{ sec = %ld, usec = %ld } ", - tv->tv_sec, tv->tv_usec); - tv_sec = tv->tv_sec; - p1 = strdup(ctime(&tv_sec)); - for (p2=p1; *p2 ; p2++) - if (*p2 == '\n') - *p2 = '\0'; - fputs(p1, stdout); - return (0); -} - -static int -T_dev_t(int l2, void *p) -{ - dev_t *d = (dev_t *)p; - if (l2 != sizeof *d) - err(1, "T_dev_T %d != %d", l2, sizeof *d); - printf("{ major = %d, minor = %d }", - major(*d), minor(*d)); - return (0); -} - -/* - * These functions uses a presently undocumented interface to the kernel - * to walk the tree and get the type so it can print the value. - * This interface is under work and consideration, and should probably - * be killed with a big axe by the first person who can find the time. - * (be aware though, that the proper interface isn't as obvious as it - * may seem, there are various conflicting requirements. - */ - -static int -name2oid(char *name, int *oidp) -{ - int oid[2]; - int i; - size_t j; - - oid[0] = 0; - oid[1] = 3; - - j = CTL_MAXNAME * sizeof (int); - i = sysctl(oid, 2, oidp, &j, name, strlen(name)); - if (i < 0) - return i; - j /= sizeof (int); - return (j); -} - -static int -oidfmt(int *oid, int len, char *fmt, u_int *kind) -{ - int qoid[CTL_MAXNAME+2]; - u_char buf[BUFSIZ]; - int i; - size_t j; - - qoid[0] = 0; - qoid[1] = 4; - memcpy(qoid + 2, oid, len * sizeof(int)); - - j = sizeof buf; - i = sysctl(qoid, len + 2, buf, &j, 0, 0); - if (i) - err(1, "sysctl fmt %d %d %d", i, j, errno); - - if (kind) - *kind = *(u_int *)buf; - - if (fmt) - strcpy(fmt, (char *)(buf + sizeof(u_int))); - return 0; -} - -/* - * This formats and outputs the value of one variable - * - * Returns zero if anything was actually output. - * Returns one if didn't know what to do with this. - * Return minus one if we had errors. - */ - -static int -show_var(int *oid, int nlen) -{ - u_char buf[BUFSIZ], *val, *p; - char name[BUFSIZ], descr[BUFSIZ], *fmt; - int qoid[CTL_MAXNAME+2]; - int i; - size_t j, len; - u_int kind; - int (*func)(int, void *) = 0; - - qoid[0] = 0; - memcpy(qoid + 2, oid, nlen * sizeof(int)); - - qoid[1] = 1; - j = sizeof name; - i = sysctl(qoid, nlen + 2, name, &j, 0, 0); - if (i || !j) - err(1, "sysctl name %d %d %d", i, j, errno); - - if (dflag) { - qoid[1] = 5; - j = sizeof descr; - i = sysctl(qoid, nlen + 2, descr, &j, 0, 0); - if (i || !j) - err(1, "sysctl name %d %d %d", i, j, errno); - if (!nflag) - printf("%s: ", name); - printf("%s", descr[0] ? descr : "[no description]"); - return (0); - } - - /* find an estimate of how much we need for this var */ - j = 0; - i = sysctl(oid, nlen, 0, &j, 0, 0); - j += j; /* we want to be sure :-) */ - - val = alloca(j); - len = j; - i = sysctl(oid, nlen, val, &len, 0, 0); - if (i || !len) - return (1); - - if (bflag) { - fwrite(val, 1, len, stdout); - return (0); - } - - qoid[1] = 4; - j = sizeof buf; - i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); - if (i || !j) - err(1, "sysctl fmt %d %d %d", i, j, errno); - - kind = *(u_int *)buf; - - fmt = (char *)(buf + sizeof(u_int)); - - p = val; - switch (*fmt) { - case 'A': - if (!nflag) - printf("%s: ", name); - printf("%s", p); - return (0); - - case 'I': - if (!nflag) - printf("%s: ", name); - val = ""; - while (len >= sizeof(int)) { - printf("%s%d", val, *(int *)p); - val = " "; - len -= sizeof (int); - p += sizeof (int); - } - return (0); - - case 'L': - if (!nflag) - printf("%s: ", name); - printf("%ld", *(long *)p); - return (0); - - case 'P': - if (!nflag) - printf("%s: ", name); - printf("%p", *(void **)p); - return (0); - - case 'T': - case 'S': - i = 0; - if (!strcmp(fmt, "S,clockinfo")) func = S_clockinfo; - else if (!strcmp(fmt, "S,timeval")) func = S_timeval; - else if (!strcmp(fmt, "S,loadavg")) func = S_loadavg; - else if (!strcmp(fmt, "T,dev_t")) func = T_dev_t; - if (func) { - if (!nflag) - printf("%s: ", name); - return ((*func)(len, p)); - } - /* FALL THROUGH */ - default: - if (!Aflag) - return (1); - if (!nflag) - printf("%s: ", name); - printf("Format:%s Length:%d Dump:0x", fmt, len); - while (len--) { - printf("%02x", *p++); - if (Xflag || p < val+16) - continue; - printf("..."); - break; - } - return (0); - } - return (1); -} - -static int -sysctl_all (int *oid, int len) -{ - int name1[22], name2[22]; - int i, j; - size_t l1, l2; - - name1[0] = 0; - name1[1] = 2; - l1 = 2; - if (len) { - memcpy(name1+2, oid, len*sizeof (int)); - l1 += len; - } else { - name1[2] = 1; - l1++; - } - while (1) { - l2 = sizeof name2; - j = sysctl(name1, l1, name2, &l2, 0, 0); - if (j < 0) - if (errno == ENOENT) - return 0; - else - err(1, "sysctl(getnext) %d %d", j, l2); - - l2 /= sizeof (int); - - if (l2 < len) - return 0; - - for (i = 0; i < len; i++) - if (name2[i] != oid[i]) - return 0; - - i = show_var(name2, l2); - if (!i && !bflag) - putchar('\n'); - - memcpy(name1+2, name2, l2*sizeof (int)); - l1 = 2 + l2; - } -}