Lines Matching refs:req

91 gctl_error(struct gctl_req *req, const char *fmt, ...)
95 if (req == NULL)
99 if (sbuf_done(req->serror)) {
100 if (!req->nerror)
101 req->nerror = EEXIST;
102 return (req->nerror);
104 if (!req->nerror)
105 req->nerror = EINVAL;
108 sbuf_vprintf(req->serror, fmt, ap);
110 sbuf_finish(req->serror);
112 printf("gctl %p error \"%s\"\n", req, sbuf_data(req->serror));
113 return (req->nerror);
121 geom_alloc_copyin(struct gctl_req *req, void *uaddr, size_t len)
126 req->nerror = copyin(uaddr, ptr, len);
127 if (!req->nerror)
134 gctl_copyin(struct gctl_req *req)
140 if (req->narg > GEOM_CTL_ARG_MAX) {
141 gctl_error(req, "too many arguments");
142 req->arg = NULL;
146 ap = geom_alloc_copyin(req, req->arg, req->narg * sizeof(*ap));
148 gctl_error(req, "bad control request");
149 req->arg = NULL;
154 for (i = 0; i < req->narg; i++) {
160 for (i = 0; i < req->narg; i++) {
162 gctl_error(req,
166 p = geom_alloc_copyin(req, ap[i].name, ap[i].nlen);
170 gctl_error(req, "unterminated param name");
177 gctl_error(req, "negative param length");
180 p = geom_alloc_copyin(req, ap[i].value, ap[i].len);
185 gctl_error(req, "unterminated param value");
192 req->arg = ap;
197 gctl_copyout(struct gctl_req *req)
202 if (req->nerror)
205 ap = req->arg;
206 for (i = 0; i < req->narg; i++, ap++) {
212 req->nerror = error;
219 gctl_free(struct gctl_req *req)
223 sbuf_delete(req->serror);
224 if (req->arg == NULL)
226 for (i = 0; i < req->narg; i++) {
227 if (req->arg[i].flag & GCTL_PARAM_NAMEKERNEL)
228 g_free(req->arg[i].name);
229 if ((req->arg[i].flag & GCTL_PARAM_VALUEKERNEL) &&
230 req->arg[i].len > 0)
231 g_free(req->arg[i].kvalue);
233 g_free(req->arg);
237 gctl_dump(struct gctl_req *req)
243 printf("Dump of gctl request at %p:\n", req);
244 if (req->nerror > 0) {
245 printf(" nerror:\t%d\n", req->nerror);
246 if (sbuf_len(req->serror) > 0)
247 printf(" error:\t\"%s\"\n", sbuf_data(req->serror));
249 if (req->arg == NULL)
251 for (i = 0; i < req->narg; i++) {
252 ap = &req->arg[i];
276 gctl_set_param(struct gctl_req *req, const char *param, void const *ptr,
282 for (i = 0; i < req->narg; i++) {
283 ap = &req->arg[i];
300 gctl_set_param_err(struct gctl_req *req, const char *param, void const *ptr,
304 switch (gctl_set_param(req, param, ptr, len)) {
306 gctl_error(req, "No write access %s argument", param);
309 gctl_error(req, "Wrong length %s argument", param);
312 gctl_error(req, "Missing %s argument", param);
318 gctl_get_param(struct gctl_req *req, const char *param, int *len)
324 for (i = 0; i < req->narg; i++) {
325 ap = &req->arg[i];
339 gctl_get_asciiparam(struct gctl_req *req, const char *param)
345 for (i = 0; i < req->narg; i++) {
346 ap = &req->arg[i];
353 gctl_error(req, "No length argument (%s)", param);
357 gctl_error(req, "Unterminated argument (%s)", param);
366 gctl_get_paraml(struct gctl_req *req, const char *param, int len)
371 p = gctl_get_param(req, param, &i);
373 gctl_error(req, "Missing %s argument", param);
376 gctl_error(req, "Wrong length %s argument", param);
382 gctl_get_class(struct gctl_req *req, char const *arg)
387 p = gctl_get_asciiparam(req, arg);
398 gctl_get_geom(struct gctl_req *req, struct g_class *mpr, char const *arg)
404 p = gctl_get_asciiparam(req, arg);
415 gctl_error(req, "Geom not found: \"%s\"", p);
420 gctl_get_provider(struct gctl_req *req, char const *arg)
425 p = gctl_get_asciiparam(req, arg);
431 gctl_error(req, "Provider not found: \"%s\"", p);
439 struct gctl_req *req;
443 req = arg;
444 mp = gctl_get_class(req, "class");
446 gctl_error(req, "Class not found");
450 gctl_error(req, "Class takes no requests");
453 verb = gctl_get_param(req, "verb", NULL);
455 gctl_error(req, "Verb missing");
458 mp->ctlreq(req, mp, verb);
466 struct gctl_req *req;
469 req = (void *)data;
470 req->nerror = 0;
472 if (req->lerror < 2)
474 if (!useracc(req->error, req->lerror, VM_PROT_WRITE))
477 req->serror = sbuf_new_auto();
479 if (req->version != GCTL_VERSION) {
480 gctl_error(req, "kernel and libgeom version mismatch.");
481 req->arg = NULL;
484 gctl_copyin(req);
487 gctl_dump(req);
489 if (!req->nerror) {
490 g_waitfor_event(g_ctl_req, req, M_WAITOK, NULL);
491 gctl_copyout(req);
494 if (sbuf_done(req->serror)) {
495 copyout(sbuf_data(req->serror), req->error,
496 imin(req->lerror, sbuf_len(req->serror) + 1));
499 nerror = req->nerror;
500 gctl_free(req);