summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwkoszek <wkoszek@FreeBSD.org>2007-12-25 21:17:34 +0000
committerwkoszek <wkoszek@FreeBSD.org>2007-12-25 21:17:34 +0000
commit2179e058f4a49def253bcdcf25a3727ee07594c1 (patch)
treeee2ce1cf12bf24379474dfe53daa98df03098786
parent7994071c41e04f5b7f89e2cd6ba19d50983891ec (diff)
downloadFreeBSD-src-2179e058f4a49def253bcdcf25a3727ee07594c1.zip
FreeBSD-src-2179e058f4a49def253bcdcf25a3727ee07594c1.tar.gz
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)
-rw-r--r--sys/kern/tty_cons.c37
1 files 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 <sys/queue.h>
#include <sys/reboot.h>
#include <sys/sysctl.h>
+#include <sys/sbuf.h>
#include <sys/tty.h>
#include <sys/uio.h>
#include <sys/vnode.h>
@@ -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);
}
OpenPOWER on IntegriCloud