Date: Sat, 21 Jun 2014 23:34:28 GMT From: zkorchev@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r269837 - soc2014/zkorchev/freebsd_head/sbin/sysctl Message-ID: <201406212334.s5LNYSOg090646@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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));
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406212334.s5LNYSOg090646>