From 6648b8cede12bffb36e7260cfcf022cf2315acf1 Mon Sep 17 00:00:00 2001 From: mdf Date: Wed, 19 Jan 2011 17:04:07 +0000 Subject: sysctl(8) should use the CTLTYPE to determine the type of data when reading. (This was already done for writing to a sysctl). This requires all SYSCTL setups to specify a type. Most of them are now checked at compile-time. Remove SYSCTL_*X* sysctl additions as the print being in hex should be controlled by the -x flag to sysctl(8). Succested by: bde --- sbin/sysctl/sysctl.c | 54 ++++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 25 deletions(-) (limited to 'sbin/sysctl') diff --git a/sbin/sysctl/sysctl.c b/sbin/sysctl/sysctl.c index de37c8b..7f1f943 100644 --- a/sbin/sysctl/sysctl.c +++ b/sbin/sysctl/sysctl.c @@ -510,7 +510,7 @@ show_var(int *oid, int nlen) int qoid[CTL_MAXNAME+2]; uintmax_t umv; intmax_t mv; - int i, hexlen; + int i, hexlen, sign, ctltype; size_t intlen; size_t j, len; u_int kind; @@ -575,46 +575,57 @@ show_var(int *oid, int nlen) fmt = buf; oidfmt(oid, nlen, fmt, &kind); p = val; - switch (*fmt) { - case 'A': + ctltype = (kind & CTLTYPE); + sign = (ctltype == CTLTYPE_INT || ctltype == CTLTYPE_LONG) ? 1 : 0; + switch (ctltype) { + case CTLTYPE_STRING: if (!nflag) printf("%s%s", name, sep); printf("%.*s", (int)len, p); free(oval); return (0); - case 'I': - case 'L': - case 'Q': + case CTLTYPE_INT: + case CTLTYPE_UINT: + case CTLTYPE_LONG: + case CTLTYPE_ULONG: + case CTLTYPE_QUAD: if (!nflag) printf("%s%s", name, sep); - switch (*fmt) { - case 'I': intlen = sizeof(int); break; - case 'L': intlen = sizeof(long); break; - case 'Q': intlen = sizeof(quad_t); break; + switch (kind & CTLTYPE) { + case CTLTYPE_INT: + case CTLTYPE_UINT: + intlen = sizeof(int); break; + case CTLTYPE_LONG: + case CTLTYPE_ULONG: + intlen = sizeof(long); break; + case CTLTYPE_QUAD: + intlen = sizeof(quad_t); break; } hexlen = 2 + (intlen * CHAR_BIT + 3) / 4; sep1 = ""; while (len >= intlen) { - switch (*fmt) { - case 'I': + switch (kind & CTLTYPE) { + case CTLTYPE_INT: + case CTLTYPE_UINT: umv = *(u_int *)p; mv = *(int *)p; break; - case 'L': + case CTLTYPE_LONG: + case CTLTYPE_ULONG: umv = *(u_long *)p; mv = *(long *)p; break; - case 'Q': + case CTLTYPE_QUAD: umv = *(u_quad_t *)p; mv = *(quad_t *)p; break; } fputs(sep1, stdout); - if (fmt[1] == 'U') - printf(hflag ? "%'ju" : "%ju", umv); - else if (fmt[1] == 'X') + 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); @@ -629,14 +640,7 @@ show_var(int *oid, int nlen) free(oval); return (0); - case 'P': - if (!nflag) - printf("%s%s", name, sep); - printf("%p", *(void **)p); - free(oval); - return (0); - - case 'S': + case CTLTYPE_OPAQUE: i = 0; if (strcmp(fmt, "S,clockinfo") == 0) func = S_clockinfo; -- cgit v1.1