summaryrefslogtreecommitdiff
path: root/usr.sbin/sysctl/sysctl.c
diff options
context:
space:
mode:
authorbouyer <bouyer@NetBSD.org>1999-09-28 14:48:48 +0000
committerbouyer <bouyer@NetBSD.org>1999-09-28 14:48:48 +0000
commit1679d2b98eb5707cee002ee01eb25c4e8ea72870 (patch)
tree7a0226f768e759f5b23cbc9626c86a88f57bde49 /usr.sbin/sysctl/sysctl.c
parent52497e180a8a5886603df5087e08559a3e4b5c5b (diff)
Add handling of the proc hierarchy. Document it, as well as kern.defcorename.
Diffstat (limited to 'usr.sbin/sysctl/sysctl.c')
-rw-r--r--usr.sbin/sysctl/sysctl.c164
1 files changed, 146 insertions, 18 deletions
diff --git a/usr.sbin/sysctl/sysctl.c b/usr.sbin/sysctl/sysctl.c
index 0417582f2a5..f27cf906291 100644
--- a/usr.sbin/sysctl/sysctl.c
+++ b/usr.sbin/sysctl/sysctl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sysctl.c,v 1.21 1999/07/30 10:29:35 itojun Exp $ */
+/* $NetBSD: sysctl.c,v 1.22 1999/09/28 14:48:48 bouyer Exp $ */
/*
* Copyright (c) 1993
@@ -44,7 +44,7 @@ __COPYRIGHT(
#if 0
static char sccsid[] = "@(#)sysctl.c 8.1 (Berkeley) 6/6/93";
#else
-__RCSID("$NetBSD: sysctl.c,v 1.21 1999/07/30 10:29:35 itojun Exp $");
+__RCSID("$NetBSD: sysctl.c,v 1.22 1999/09/28 14:48:48 bouyer Exp $");
#endif
#endif /* not lint */
@@ -55,6 +55,7 @@ __RCSID("$NetBSD: sysctl.c,v 1.21 1999/07/30 10:29:35 itojun Exp $");
#include <sys/socket.h>
#include <sys/mount.h>
#include <sys/mbuf.h>
+#include <sys/resource.h>
#include <vm/vm_param.h>
#include <machine/cpu.h>
@@ -119,6 +120,9 @@ struct ctlname debugname[CTL_DEBUG_MAXID];
#ifdef CTL_MACHDEP_NAMES
struct ctlname machdepname[] = CTL_MACHDEP_NAMES;
#endif
+/* this one is dummy, it's used only for '-a' or '-A' */
+struct ctlname procname[] = { {0, 0}, {"curproc", CTLTYPE_NODE} };
+
char names[BUFSIZ];
struct list {
@@ -141,6 +145,7 @@ struct list secondlevel[] = {
#endif
{ username, USER_MAXID }, /* CTL_USER_NAMES */
{ ddbname, DDBCTL_MAXID }, /* CTL_DDB_NAMES */
+ { procname, 2 }, /* dummy name */
};
int Aflag, aflag, nflag, wflag;
@@ -152,6 +157,11 @@ int Aflag, aflag, nflag, wflag;
#define BOOTTIME 0x00000002
#define CONSDEV 0x00000004
+/*
+ * A dummy type for limits, which requires special parsing
+ */
+#define CTLTYPE_LIMIT ((~0x1) << 31)
+
int main __P((int, char *[]));
static void listall __P((char *, struct list *));
@@ -167,6 +177,7 @@ static int sysctl_key __P((char *, char **, int[], int, int *));
static int sysctl_vfs __P((char *, char **, int[], int, int *));
static int sysctl_vfsgen __P((char *, char **, int[], int, int *));
static int sysctl_mbuf __P((char *, char **, int[], int, int *));
+static int sysctl_proc __P((char *, char **, int[], int, int *));
static int findname __P((char *, char *, char **, struct list *));
static void usage __P((void));
@@ -279,21 +290,26 @@ parse(string, flags)
mib[0] = indx;
if (indx == CTL_DEBUG)
debuginit();
- lp = &secondlevel[indx];
- if (lp->list == 0) {
- warnx("Class `%s' is not implemented",
- topname[indx].ctl_name);
- return;
- }
- if (bufp == NULL) {
- listall(topname[indx].ctl_name, lp);
- return;
+ if (mib[0] == CTL_PROC) {
+ type = CTLTYPE_NODE;
+ len = 1;
+ } else {
+ lp = &secondlevel[indx];
+ if (lp->list == 0) {
+ warnx("Class `%s' is not implemented",
+ topname[indx].ctl_name);
+ return;
+ }
+ if (bufp == NULL) {
+ listall(topname[indx].ctl_name, lp);
+ return;
+ }
+ if ((indx = findname(string, "second", &bufp, lp)) == -1)
+ return;
+ mib[1] = indx;
+ type = lp->list[indx].ctl_type;
+ len = 2;
}
- if ((indx = findname(string, "second", &bufp, lp)) == -1)
- return;
- mib[1] = indx;
- type = lp->list[indx].ctl_type;
- len = 2;
switch (mib[0]) {
case CTL_KERN:
@@ -423,7 +439,11 @@ parse(string, flags)
case CTL_USER:
case CTL_DDB:
break;
-
+ case CTL_PROC:
+ len = sysctl_proc(string, &bufp, mib, flags, &type);
+ if (len < 0)
+ return;
+ break;
default:
warnx("Illegal top level value: %d", mib[0]);
return;
@@ -441,6 +461,14 @@ parse(string, flags)
newsize = sizeof intval;
break;
+ case CTLTYPE_LIMIT:
+ if (strcmp(newval, "unlimited") == 0) {
+ quadval = RLIM_INFINITY;
+ newval = &quadval;
+ newsize = sizeof quadval;
+ break;
+ }
+ /* FALLTHROUGH */
case CTLTYPE_QUAD:
sscanf(newval, "%qd", (long long *)&quadval);
newval = &quadval;
@@ -526,6 +554,30 @@ parse(string, flags)
}
return;
+ case CTLTYPE_LIMIT:
+#define PRINTF_LIMIT(lim) { \
+if ((lim) == RLIM_INFINITY) \
+ fprintf(stdout, "unlimited");\
+else \
+ fprintf(stdout, "%qd", (lim)); \
+}
+
+ if (newsize == 0) {
+ if (!nflag)
+ fprintf(stdout, "%s = ", string);
+ PRINTF_LIMIT((long long)(*(quad_t *)buf));
+ } else {
+ if (!nflag) {
+ fprintf(stdout, "%s: ", string);
+ PRINTF_LIMIT((long long)(*(quad_t *)buf));
+ fprintf(stdout, " -> ");
+ }
+ PRINTF_LIMIT((long long)(*(quad_t *)newval));
+ }
+ fprintf(stdout, "\n");
+ return;
+#undef PRINTF_LIMIT
+
case CTLTYPE_QUAD:
if (newsize == 0) {
if (!nflag)
@@ -897,9 +949,85 @@ sysctl_vfsgen(string, bufpp, mib, flags, typep)
return (3);
}
+struct ctlname procnames[] = PROC_PID_NAMES;
+struct list procvars = {procnames, PROC_PID_MAXID};
+struct ctlname proclimitnames[] = PROC_PID_LIMIT_NAMES;
+struct list proclimitvars = {proclimitnames, PROC_PID_LIMIT_MAXID};
+struct ctlname proclimittypenames[] = PROC_PID_LIMIT_TYPE_NAMES;
+struct list proclimittypevars = {proclimittypenames,
+ PROC_PID_LIMIT_TYPE_MAXID};
+/*
+ * handle kern.proc requests
+ */
+static int
+sysctl_proc(string, bufpp, mib, flags, typep)
+ char *string;
+ char **bufpp;
+ int mib[];
+ int flags;
+ int *typep;
+{
+ char *cp, name[BUFSIZ];
+ struct list *lp;
+ int indx;
+
+ if (*bufpp == NULL) {
+ strcpy(name, string);
+ cp = &name[strlen(name)];
+ *cp++ = '.';
+ strcpy(cp, "curproc");
+ parse (name, Aflag);
+ return (-1);
+ }
+ cp = strsep(bufpp, ".");
+ if (cp == NULL) {
+ warnx("%s: incomplete specification", string);
+ return (-1);
+ }
+ if (strcmp(cp, "curproc") == 0) {
+ mib[1] = PROC_CURPROC;
+ } else {
+ mib[1] = atoi(cp);
+ if (mib[1] == 0) {
+ warnx("second level name %s in %s is invalid", cp,
+ string);
+ return (-1);
+ }
+ }
+ *typep = CTLTYPE_NODE;
+ lp = &procvars;
+ if (*bufpp == NULL) {
+ listall(string, lp);
+ return (-1);
+ }
+ if ((indx = findname(string, "third", bufpp, lp)) == -1)
+ return (-1);
+ mib[2] = indx;
+ *typep = lp->list[indx].ctl_type;
+ if (*typep != CTLTYPE_NODE)
+ return(3);
+ lp = &proclimitvars;
+ if (*bufpp == NULL) {
+ listall(string, lp);
+ return (-1);
+ }
+ if ((indx = findname(string, "fourth", bufpp, lp)) == -1)
+ return (-1);
+ mib[3] = indx;
+ lp = &proclimittypevars;
+ if (*bufpp == NULL) {
+ listall(string, lp);
+ return (-1);
+ }
+ if ((indx = findname(string, "fifth", bufpp, lp)) == -1)
+ return (-1);
+ mib[4] = indx;
+ *typep = CTLTYPE_LIMIT;
+ return(5);
+}
+
struct ctlname mbufnames[] = CTL_MBUF_NAMES;
struct list mbufvars = { mbufnames, MBUF_MAXID };
-
/*
* handle kern.mbuf requests
*/