From 2179e058f4a49def253bcdcf25a3727ee07594c1 Mon Sep 17 00:00:00 2001 From: wkoszek Date: Tue, 25 Dec 2007 21:17:34 +0000 Subject: Rewrite kern.console handling in sbuf(9). My intention is to leave kern.console format as is. Thus, no difference in output format should appear after this commit. Reviewed by: cognet@ (mentor) Approved by: cognet@ (mentor) --- sys/kern/tty_cons.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/sys/kern/tty_cons.c b/sys/kern/tty_cons.c index 9460725..4feb565 100644 --- a/sys/kern/tty_cons.c +++ b/sys/kern/tty_cons.c @@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -295,39 +296,33 @@ cnunavailable(void) } /* - * XXX: rewrite to use sbufs instead + * sysctl_kern_console() provides output parseable in conscontrol(1). */ - static int sysctl_kern_console(SYSCTL_HANDLER_ARGS) { struct cn_device *cnd; struct consdev *cp, **list; - char *name, *p; - int delete, len, error; + char *p; + int delete, error; + struct sbuf *sb; - len = 2; - SET_FOREACH(list, cons_set) { - cp = *list; - if (cp->cn_name[0] != '\0') - len += strlen(cp->cn_name) + 1; - } - STAILQ_FOREACH(cnd, &cn_devlist, cnd_next) - len += strlen(cnd->cnd_cn->cn_name) + 1; - len = len > CNDEVPATHMAX ? len : CNDEVPATHMAX; - MALLOC(name, char *, len, M_TEMP, M_WAITOK | M_ZERO); - p = name; + sb = sbuf_new(NULL, NULL, CNDEVPATHMAX * 2, SBUF_AUTOEXTEND); + if (sb == NULL) + return (ENOMEM); + sbuf_clear(sb); STAILQ_FOREACH(cnd, &cn_devlist, cnd_next) - p += sprintf(p, "%s,", cnd->cnd_cn->cn_name); - *p++ = '/'; + sbuf_printf(sb, "%s,", cnd->cnd_cn->cn_name); + sbuf_printf(sb, "/"); SET_FOREACH(list, cons_set) { cp = *list; if (cp->cn_name[0] != '\0') - p += sprintf(p, "%s,", cp->cn_name); + sbuf_printf(sb, "%s,", cp->cn_name); } - error = sysctl_handle_string(oidp, name, len, req); + sbuf_finish(sb); + error = sysctl_handle_string(oidp, sbuf_data(sb), sbuf_len(sb), req); if (error == 0 && req->newptr != NULL) { - p = name; + p = sbuf_data(sb); error = ENXIO; delete = 0; if (*p == '-') { @@ -349,7 +344,7 @@ sysctl_kern_console(SYSCTL_HANDLER_ARGS) break; } } - FREE(name, M_TEMP); + sbuf_delete(sb); return (error); } -- cgit v1.1