summaryrefslogtreecommitdiffstats
path: root/sbin/sysctl
diff options
context:
space:
mode:
authormdf <mdf@FreeBSD.org>2011-01-19 17:04:07 +0000
committermdf <mdf@FreeBSD.org>2011-01-19 17:04:07 +0000
commit6648b8cede12bffb36e7260cfcf022cf2315acf1 (patch)
tree5e1c41064fb9146dbfbbbd14965e9bed5fb07985 /sbin/sysctl
parenta7310f271d99214ed08e3b1b382ffcd076a9d2b5 (diff)
downloadFreeBSD-src-6648b8cede12bffb36e7260cfcf022cf2315acf1.zip
FreeBSD-src-6648b8cede12bffb36e7260cfcf022cf2315acf1.tar.gz
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
Diffstat (limited to 'sbin/sysctl')
-rw-r--r--sbin/sysctl/sysctl.c54
1 files changed, 29 insertions, 25 deletions
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;
OpenPOWER on IntegriCloud