diff --git a/sys/geom/geom.h b/sys/geom/geom.h index f09972aa731a..fa90f9192f9d 100644 --- a/sys/geom/geom.h +++ b/sys/geom/geom.h @@ -334,6 +334,7 @@ extern struct sx topology_lock; /* geom_ctl.c */ void *gctl_get_param(struct gctl_req *req, const char *param, int *len); -int gctl_error(struct gctl_req *req, const char *errtxt); +void *gctl_get_paraml(struct gctl_req *req, const char *param, int len); +int gctl_error(struct gctl_req *req, const char *fmt, ...); #endif /* _GEOM_GEOM_H_ */ diff --git a/sys/geom/geom_ctl.c b/sys/geom/geom_ctl.c index 279156e35de9..a1133b3446da 100644 --- a/sys/geom/geom_ctl.c +++ b/sys/geom/geom_ctl.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,8 @@ #include #include +#include + static d_ioctl_t g_ctl_ioctl; static struct cdevsw g_ctl_cdevsw = { @@ -87,16 +90,28 @@ g_ctl_init(void) * XXX: should take printf like args. */ int -gctl_error(struct gctl_req *req, const char *errtxt) +gctl_error(struct gctl_req *req, const char *fmt, ...) { int error; + va_list ap; + struct sbuf *sb; - if (g_debugflags & G_F_CTLDUMP) - printf("gctl %p error \"%s\"\n", req, errtxt); - error = copyout(errtxt, req->error, - imin(req->lerror, strlen(errtxt) + 1)); + sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND); + if (sb == NULL) { + error = copyout(fmt, req->error, + imin(req->lerror, strlen(fmt) + 1)); + } else { + va_start(ap, fmt); + sbuf_vprintf(sb, fmt, ap); + sbuf_finish(sb); + if (g_debugflags & G_F_CTLDUMP) + printf("gctl %p error \"%s\"\n", req, sbuf_data(sb)); + error = copyout(sbuf_data(sb), req->error, + imin(req->lerror, sbuf_len(sb) + 1)); + } if (!error) error = EINVAL; + sbuf_delete(sb); return (error); }