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