socsvn commit: r269837 - soc2014/zkorchev/freebsd_head/sbin/sysctl
zkorchev at FreeBSD.org
zkorchev at FreeBSD.org
Sat Jun 21 23:34:29 UTC 2014
Author: zkorchev
Date: Sat Jun 21 23:34:28 2014
New Revision: 269837
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269837
Log:
sysctl libsol support
Modified:
soc2014/zkorchev/freebsd_head/sbin/sysctl/Makefile
soc2014/zkorchev/freebsd_head/sbin/sysctl/sysctl.c
Modified: soc2014/zkorchev/freebsd_head/sbin/sysctl/Makefile
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/sysctl/Makefile Sat Jun 21 23:31:20 2014 (r269836)
+++ soc2014/zkorchev/freebsd_head/sbin/sysctl/Makefile Sat Jun 21 23:34:28 2014 (r269837)
@@ -4,5 +4,7 @@
PROG= sysctl
WARNS?= 3
MAN= sysctl.8
+#LDADD= -L/usr/local/lib -lsol
+#CFLAGS+= -DSOL_ON -I/usr/local/include
.include <bsd.prog.mk>
Modified: soc2014/zkorchev/freebsd_head/sbin/sysctl/sysctl.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/sbin/sysctl/sysctl.c Sat Jun 21 23:31:20 2014 (r269836)
+++ soc2014/zkorchev/freebsd_head/sbin/sysctl/sysctl.c Sat Jun 21 23:34:28 2014 (r269837)
@@ -58,11 +58,19 @@
#include <string.h>
#include <sysexits.h>
#include <unistd.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
static const char *conffile;
static int aflag, bflag, dflag, eflag, hflag, iflag;
static int Nflag, nflag, oflag, qflag, Tflag, Wflag, xflag;
+static int sol_format;
+
+#if defined(SOL_ON)
+static struct sol_stream sol_stream;
+#endif
static int oidfmt(int *, int, char *, u_int *);
static int parsefile(const char *);
@@ -158,11 +166,33 @@
if (Nflag && nflag)
usage();
- if (aflag && argc == 0)
- exit(sysctl_all(0, 0));
- if (argc == 0 && conffile == NULL)
+ if (argc == 0 && conffile == NULL && !aflag)
usage();
+#if defined(SOL_ON)
+ sol_format = sol_init(&sol_stream);
+ if (sol_format) {
+ if (nflag || Nflag)
+ sol_array_start(&sol_stream);
+ else
+ sol_map_start(&sol_stream);
+ }
+#endif
+
+ if (aflag && argc == 0) {
+ int status = sysctl_all(0, 0);
+#if defined(SOL_ON)
+ if (sol_format) {
+ if (nflag || Nflag)
+ sol_array_end(&sol_stream);
+ else
+ sol_map_end(&sol_stream);
+ sol_term(&sol_stream);
+ }
+#endif
+ exit(status);
+ }
+
warncount = 0;
if (conffile != NULL)
warncount += parsefile(conffile);
@@ -170,6 +200,16 @@
while (argc-- > 0)
warncount += parse(*argv++, 0);
+#if defined(SOL_ON)
+ if (sol_format) {
+ if (nflag || Nflag)
+ sol_array_end(&sol_stream);
+ else
+ sol_map_end(&sol_stream);
+ sol_term(&sol_stream);
+ }
+#endif
+
return (warncount);
}
@@ -249,13 +289,13 @@
if ((kind & CTLTYPE) == CTLTYPE_NODE) {
if (dflag) {
i = show_var(mib, len);
- if (!i && !bflag)
+ if (!i && !bflag && !sol_format)
putchar('\n');
}
sysctl_all(mib, len);
} else {
i = show_var(mib, len);
- if (!i && !bflag)
+ if (!i && !bflag && !sol_format)
putchar('\n');
}
} else {
@@ -388,12 +428,12 @@
return (1);
}
}
- if (!bflag)
+ if (!bflag && !sol_format)
printf(" -> ");
i = nflag;
nflag = 1;
j = show_var(mib, len);
- if (!j && !bflag)
+ if (!j && !bflag && !sol_format)
putchar('\n');
nflag = i;
}
@@ -462,9 +502,24 @@
warnx("S_clockinfo %d != %zu", l2, sizeof(*ci));
return (1);
}
- printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" :
- "{ hz = %d, tick = %d, profhz = %d, stathz = %d }",
- ci->hz, ci->tick, ci->profhz, ci->stathz);
+#if defined(SOL_ON)
+ if (sol_format) {
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "hz");
+ sol_integer(&sol_stream, ci->hz);
+ SOL_MAP_KEYL(&sol_stream, "tick");
+ sol_integer(&sol_stream, ci->tick);
+ SOL_MAP_KEYL(&sol_stream, "profhz");
+ sol_integer(&sol_stream, ci->profhz);
+ SOL_MAP_KEYL(&sol_stream, "stathz");
+ sol_integer(&sol_stream, ci->stathz);
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" :
+ "{ hz = %d, tick = %d, profhz = %d, stathz = %d }",
+ ci->hz, ci->tick, ci->profhz, ci->stathz);
return (0);
}
@@ -477,10 +532,20 @@
warnx("S_loadavg %d != %zu", l2, sizeof(*tv));
return (1);
}
- printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }",
- (double)tv->ldavg[0]/(double)tv->fscale,
- (double)tv->ldavg[1]/(double)tv->fscale,
- (double)tv->ldavg[2]/(double)tv->fscale);
+#if defined(SOL_ON)
+ if (sol_format) {
+ sol_array_start(&sol_stream);
+ sol_float(&sol_stream, (double)tv->ldavg[0]/(double)tv->fscale);
+ sol_float(&sol_stream, (double)tv->ldavg[1]/(double)tv->fscale);
+ sol_float(&sol_stream, (double)tv->ldavg[2]/(double)tv->fscale);
+ sol_array_end(&sol_stream);
+ }
+ else
+#endif
+ printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.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);
}
@@ -495,15 +560,33 @@
warnx("S_timeval %d != %zu", l2, sizeof(*tv));
return (1);
}
- printf(hflag ? "{ sec = %'jd, usec = %'ld } " :
- "{ sec = %jd, usec = %ld } ",
- (intmax_t)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);
+ break;
+ *p2 = '\0';
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "sec");
+ sol_integer(&sol_stream, tv->tv_sec);
+ SOL_MAP_KEYL(&sol_stream, "usec");
+ sol_integer(&sol_stream, tv->tv_usec);
+ SOL_MAP_KEYL(&sol_stream, "date");
+ sol_string(&sol_stream, p1, p2 - p1);
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ {
+ printf(hflag ? "{ sec = %'jd, usec = %'ld } " :
+ "{ sec = %jd, usec = %ld } ",
+ (intmax_t)tv->tv_sec, tv->tv_usec);
+ tv_sec = tv->tv_sec;
+ fputs(p1, stdout);
+ }
free(p1);
return (0);
}
@@ -519,24 +602,82 @@
return (1);
}
- printf(
- "\nSystem wide totals computed every five seconds:"
- " (values in kilobytes)\n");
- printf("===============================================\n");
- printf(
- "Processes:\t\t(RUNQ: %hd Disk Wait: %hd Page Wait: "
- "%hd Sleep: %hd)\n",
- v->t_rq, v->t_dw, v->t_pw, v->t_sl);
- printf(
- "Virtual Memory:\t\t(Total: %dK Active: %dK)\n",
- v->t_vm * pageKilo, v->t_avm * pageKilo);
- printf("Real Memory:\t\t(Total: %dK Active: %dK)\n",
- v->t_rm * pageKilo, v->t_arm * pageKilo);
- printf("Shared Virtual Memory:\t(Total: %dK Active: %dK)\n",
- v->t_vmshr * pageKilo, v->t_avmshr * pageKilo);
- printf("Shared Real Memory:\t(Total: %dK Active: %dK)\n",
- v->t_rmshr * pageKilo, v->t_armshr * pageKilo);
- printf("Free Memory:\t%dK\n", v->t_free * pageKilo);
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ sol_map_start(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "processes");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "RUNQ");
+ sol_integer(&sol_stream, v->t_rq);
+ SOL_MAP_KEYL(&sol_stream, "disk wait");
+ sol_integer(&sol_stream, v->t_dw);
+ SOL_MAP_KEYL(&sol_stream, "page wait");
+ sol_integer(&sol_stream, v->t_pw);
+ SOL_MAP_KEYL(&sol_stream, "sleep");
+ sol_integer(&sol_stream, v->t_sl);
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "virtual memory (K)");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "total");
+ sol_integer(&sol_stream, v->t_vm * pageKilo);
+ SOL_MAP_KEYL(&sol_stream, "active");
+ sol_integer(&sol_stream, v->t_avm * pageKilo);
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "real memory (K)");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "total");
+ sol_integer(&sol_stream, v->t_rm * pageKilo);
+ SOL_MAP_KEYL(&sol_stream, "active");
+ sol_integer(&sol_stream, v->t_arm * pageKilo);
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "shared virtual memory (K)");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "total");
+ sol_integer(&sol_stream, v->t_vmshr * pageKilo);
+ SOL_MAP_KEYL(&sol_stream, "active");
+ sol_integer(&sol_stream, v->t_avmshr * pageKilo);
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "shared real memory (K)");
+ sol_map_start(&sol_stream);
+ SOL_MAP_KEYL(&sol_stream, "total");
+ sol_integer(&sol_stream, v->t_rmshr * pageKilo);
+ SOL_MAP_KEYL(&sol_stream, "active");
+ sol_integer(&sol_stream, v->t_armshr * pageKilo);
+ sol_map_end(&sol_stream);
+
+ SOL_MAP_KEYL(&sol_stream, "free (K)");
+ sol_integer(&sol_stream, v->t_free * pageKilo);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ {
+ printf(
+ "\nSystem wide totals computed every five seconds:"
+ " (values in kilobytes)\n");
+ printf("===============================================\n");
+ printf(
+ "Processes:\t\t(RUNQ: %hd Disk Wait: %hd Page Wait: "
+ "%hd Sleep: %hd)\n",
+ v->t_rq, v->t_dw, v->t_pw, v->t_sl);
+ printf(
+ "Virtual Memory:\t\t(Total: %dK Active: %dK)\n",
+ v->t_vm * pageKilo, v->t_avm * pageKilo);
+ printf("Real Memory:\t\t(Total: %dK Active: %dK)\n",
+ v->t_rm * pageKilo, v->t_arm * pageKilo);
+ printf("Shared Virtual Memory:\t(Total: %dK Active: %dK)\n",
+ v->t_vmshr * pageKilo, v->t_avmshr * pageKilo);
+ printf("Shared Real Memory:\t(Total: %dK Active: %dK)\n",
+ v->t_rmshr * pageKilo, v->t_armshr * pageKilo);
+ printf("Free Memory:\t%dK\n", v->t_free * pageKilo);
+ }
return (0);
}
@@ -654,6 +795,7 @@
int i, hexlen, sign, ctltype;
size_t intlen;
size_t j, len;
+ size_t namelen;
u_int kind;
int (*func)(int, void *);
@@ -672,6 +814,8 @@
if (i || !j)
err(1, "sysctl name %d %zu %d", i, j, errno);
+ namelen = j - 1;
+
oidfmt(oid, nlen, fmt, &kind);
/* if Wflag then only list sysctls that are writeable and not stats. */
if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0))
@@ -682,7 +826,12 @@
return 1;
if (Nflag) {
- printf("%s", name);
+#if defined(SOL_ON)
+ if (sol_format)
+ sol_string(&sol_stream, name, namelen);
+ else
+#endif
+ printf("%s", name);
return (0);
}
@@ -695,9 +844,19 @@
qoid[1] = 5;
j = sizeof(buf);
i = sysctl(qoid, nlen + 2, buf, &j, 0, 0);
- if (!nflag)
- printf("%s%s", name, sep);
- printf("%s", buf);
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ sol_map_key(&sol_stream, name, namelen);
+ sol_string(&sol_stream, buf, j - 1);
+ }
+ else
+#endif
+ {
+ if (!nflag)
+ printf("%s%s", name, sep);
+ printf("%s", buf);
+ }
return (0);
}
/* find an estimate of how much we need for this var */
@@ -718,6 +877,7 @@
}
if (bflag) {
+ // TODO sol support for this
fwrite(val, 1, len, stdout);
free(oval);
return (0);
@@ -730,9 +890,19 @@
switch (ctltype) {
case CTLTYPE_STRING:
- if (!nflag)
- printf("%s%s", name, sep);
- printf("%.*s", (int)len, p);
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ sol_map_key(&sol_stream, name, namelen);
+ sol_string(&sol_stream, p, strlen(p));
+ }
+ else
+#endif
+ {
+ if (!nflag)
+ printf("%s%s", name, sep);
+ printf("%.*s", (int)len, p);
+ }
free(oval);
return (0);
@@ -742,10 +912,20 @@
case CTLTYPE_ULONG:
case CTLTYPE_S64:
case CTLTYPE_U64:
- if (!nflag)
- printf("%s%s", name, sep);
+ if (!nflag) {
+#if defined(SOL_ON)
+ if (sol_format)
+ sol_map_key(&sol_stream, name, namelen);
+ else
+#endif
+ printf("%s%s", name, sep);
+ }
hexlen = 2 + (intlen * CHAR_BIT + 3) / 4;
- sep1 = "";
+#if defined(SOL_ON)
+ if (sol_format) sol_array_start(&sol_stream);
+ else
+#endif
+ sep1 = "";
while (len >= intlen) {
switch (kind & CTLTYPE) {
case CTLTYPE_INT:
@@ -764,22 +944,39 @@
mv = *(int64_t *)p;
break;
}
- fputs(sep1, stdout);
- if (xflag)
- printf("%#0*jx", hexlen, umv);
- else if (!sign)
- printf(hflag ? "%'ju" : "%ju", umv);
- else if (fmt[1] == 'K') {
- if (mv < 0)
- printf("%jd", mv);
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ if (xflag || !sign)
+ sol_uinteger(&sol_stream, umv);
+ else if ((fmt[1] == 'K') && (mv >= 0))
+ sol_float(&sol_stream, (mv - 2732.0) / 10);
else
- printf("%.1fC", (mv - 2732.0) / 10);
- } else
- printf(hflag ? "%'jd" : "%jd", mv);
- sep1 = " ";
+ sol_integer(&sol_stream, mv);
+ }
+ else
+#endif
+ {
+ fputs(sep1, stdout);
+ if (xflag)
+ printf("%#0*jx", hexlen, umv);
+ else if (!sign)
+ printf(hflag ? "%'ju" : "%ju", umv);
+ else if (fmt[1] == 'K') {
+ if (mv < 0)
+ printf("%jd", mv);
+ else
+ printf("%.1fC", (mv - 2732.0) / 10);
+ } else
+ printf(hflag ? "%'jd" : "%jd", mv);
+ sep1 = " ";
+ }
len -= intlen;
p += intlen;
}
+#if defined(SOL_ON)
+ if (sol_format) sol_array_end(&sol_stream);
+#endif
free(oval);
return (0);
@@ -796,8 +993,14 @@
else
func = NULL;
if (func) {
- if (!nflag)
- printf("%s%s", name, sep);
+ if (!nflag) {
+#if defined(SOL_ON)
+ if (sol_format)
+ sol_map_key(&sol_stream, name, namelen);
+ else
+#endif
+ printf("%s%s", name, sep);
+ }
i = (*func)(len, p);
free(oval);
return (i);
@@ -808,13 +1011,33 @@
free(oval);
return (1);
}
- if (!nflag)
- printf("%s%s", name, sep);
- printf("Format:%s Length:%zu Dump:0x", fmt, len);
- while (len-- && (xflag || p < val + 16))
- printf("%02x", *p++);
- if (!xflag && len > 16)
- printf("...");
+ if (!nflag) {
+#if defined(SOL_ON)
+ if (sol_format)
+ sol_map_key(&sol_stream, name, namelen);
+ else
+#endif
+ printf("%s%s", name, sep);
+ }
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ sol_array_start(&sol_stream);
+ while (len-- && (xflag || p < val + 16))
+ sol_uinteger(&sol_stream, *p++);
+ if (!xflag && len > 16)
+ sol_string(&sol_stream, "...", 3);
+ sol_array_end(&sol_stream);
+ }
+ else
+#endif
+ {
+ printf("Format:%s Length:%zu Dump:0x", fmt, len);
+ while (len-- && (xflag || p < val + 16))
+ printf("%02x", *p++);
+ if (!xflag && len > 16)
+ printf("...");
+ }
free(oval);
return (0);
}
@@ -859,7 +1082,7 @@
return (0);
i = show_var(name2, l2);
- if (!i && !bflag)
+ if (!i && !bflag && !sol_format)
putchar('\n');
memcpy(name1+2, name2, l2 * sizeof(int));
More information about the svn-soc-all
mailing list