summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authordwmalone <dwmalone@FreeBSD.org>2007-06-04 18:02:23 +0000
committerdwmalone <dwmalone@FreeBSD.org>2007-06-04 18:02:23 +0000
commit79a4f2f433b1fe77a78af77b36bf1611ecc780b7 (patch)
treeabd0627ca4a2b710ffd1abeb4e47d3ffe7b45f0d /sbin
parentc118c8a64b9deccf7562b4b423b46ea2c9e36f18 (diff)
downloadFreeBSD-src-79a4f2f433b1fe77a78af77b36bf1611ecc780b7.zip
FreeBSD-src-79a4f2f433b1fe77a78af77b36bf1611ecc780b7.tar.gz
Use common code for printing ints and longs by coppying the sysctl
value into a variable of the right type and then printing it via an intmax_t. This makes avoids some duplication and makes it easy to add a new integer format Q for printing things of type CTLTYPE_QUAD.
Diffstat (limited to 'sbin')
-rw-r--r--sbin/sysctl/sysctl.c84
1 files changed, 42 insertions, 42 deletions
diff --git a/sbin/sysctl/sysctl.c b/sbin/sysctl/sysctl.c
index d0fbc10..5abf027 100644
--- a/sbin/sysctl/sysctl.c
+++ b/sbin/sysctl/sysctl.c
@@ -54,6 +54,7 @@ static const char rcsid[] =
#include <ctype.h>
#include <err.h>
#include <errno.h>
+#include <inttypes.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
@@ -541,7 +542,15 @@ show_var(int *oid, int nlen)
u_char buf[BUFSIZ], *val, *oval, *p;
char name[BUFSIZ], *fmt, *sep;
int qoid[CTL_MAXNAME+2];
- int i;
+ int i, flen, iv;
+ unsigned int uiv;
+ long lv;
+ unsigned long ulv;
+ quad_t qv;
+ u_quad_t uqv;
+ size_t intlen;
+ intmax_t v;
+ uintmax_t uv;
size_t j, len;
u_int kind;
int (*func)(int, void *);
@@ -611,55 +620,46 @@ show_var(int *oid, int nlen)
return (0);
case 'I':
- if (!nflag)
- printf("%s%s", name, sep);
- fmt++;
- val = "";
- while (len >= sizeof(int)) {
- fputs(val, stdout);
- if (*fmt == 'U')
- printf(hflag ? "%'u" : "%u", *(u_int *)p);
- else if (*fmt == 'X')
- printf(hflag ? "%'#010x" : "%#010x",
- *(unsigned int *)p);
- else if (*fmt == 'K') {
- if (*(int *)p < 0)
- printf("%d", *(int *)p);
- else
- printf("%.1fC",
- (*(int *)p - 2732.0) / 10);
- } else
- printf(hflag ? "%'d" : "%d", *(int *)p);
- val = " ";
- len -= sizeof(int);
- p += sizeof(int);
- }
- free(oval);
- return (0);
-
case 'L':
+ case 'Q':
if (!nflag)
printf("%s%s", name, sep);
- fmt++;
+ switch (*fmt) {
+ case 'I': intlen = sizeof(int); flen = 10; break;
+ case 'L': intlen = sizeof(long); flen = 18; break;
+ case 'Q': intlen = sizeof(quad_t); flen = 18; break;
+ }
val = "";
- while (len >= sizeof(long)) {
+ while (len >= intlen) {
+ switch (*fmt) {
+ case 'I':
+ memcpy(&uiv, p, intlen); uv = uiv;
+ memcpy(&iv, p, intlen); v = iv;
+ break;
+ case 'L':
+ memcpy(&ulv, p, intlen); uv = ulv;
+ memcpy(&lv, p, intlen); v = lv;
+ break;
+ case 'Q':
+ memcpy(&uqv, p, intlen); uv = uqv;
+ memcpy(&qv, p, intlen); v = qv;
+ break;
+ }
fputs(val, stdout);
- if (*fmt == 'U')
- printf(hflag ? "%'lu" : "%lu", *(u_long *)p);
- else if (*fmt == 'X')
- printf(hflag ? "%'#018lx" : "%#018lx",
- *(u_long *)p);
- else if (*fmt == 'K') {
- if (*(long *)p < 0)
- printf("%ld", *(long *)p);
+ if (fmt[1] == 'U')
+ printf(hflag ? "%'ju" : "%ju", uv);
+ else if (fmt[1] == 'X')
+ printf(hflag ? "%'#0*jx" : "%#0*jx", flen, uv);
+ else if (fmt[1] == 'K') {
+ if (*(int *)p < 0)
+ printf("%jd", v);
else
- printf("%.1fC",
- (*(long *)p - 2732.0) / 10);
+ printf("%.1fC", (v - 2732.0) / 10);
} else
- printf(hflag ? "%'ld" : "%ld", *(long *)p);
+ printf(hflag ? "%'d" : "%d", v);
val = " ";
- len -= sizeof(long);
- p += sizeof(long);
+ len -= intlen;
+ p += intlen;
}
free(oval);
return (0);
OpenPOWER on IntegriCloud