From 8107ecf892d739b480a550a1211b681391ea82b2 Mon Sep 17 00:00:00 2001 From: Pawel Jakub Dawidek Date: Tue, 14 Sep 2010 16:21:13 +0000 Subject: [PATCH] - Change all places where G_TYPE_ASCNUM is used to G_TYPE_NUMBER. It turns out the new type wasn't really needed. - Reorganize code a little bit. --- sbin/geom/class/part/geom_part.c | 16 +-- sys/geom/part/g_part.c | 171 +++++++++++++++++++++---------- 2 files changed, 125 insertions(+), 62 deletions(-) diff --git a/sbin/geom/class/part/geom_part.c b/sbin/geom/class/part/geom_part.c index 0f2cccaf5bff..1a0efba7b843 100644 --- a/sbin/geom/class/part/geom_part.c +++ b/sbin/geom/class/part/geom_part.c @@ -90,7 +90,7 @@ struct g_command PUBSYM(class_commands)[] = { { 'b', "start", GPART_AUTOFILL, G_TYPE_STRING }, { 's', "size", GPART_AUTOFILL, G_TYPE_STRING }, { 't', "type", NULL, G_TYPE_STRING }, - { 'i', GPART_PARAM_INDEX, G_VAL_OPTIONAL, G_TYPE_ASCNUM }, + { 'i', GPART_PARAM_INDEX, G_VAL_OPTIONAL, G_TYPE_NUMBER }, { 'l', "label", G_VAL_OPTIONAL, G_TYPE_STRING }, { 'f', "flags", GPART_FLAGS, G_TYPE_STRING }, G_OPT_SENTINEL }, @@ -99,7 +99,7 @@ struct g_command PUBSYM(class_commands)[] = { { "bootcode", 0, gpart_bootcode, { { 'b', GPART_PARAM_BOOTCODE, G_VAL_OPTIONAL, G_TYPE_STRING }, { 'p', GPART_PARAM_PARTCODE, G_VAL_OPTIONAL, G_TYPE_STRING }, - { 'i', GPART_PARAM_INDEX, G_VAL_OPTIONAL, G_TYPE_ASCNUM }, + { 'i', GPART_PARAM_INDEX, G_VAL_OPTIONAL, G_TYPE_NUMBER }, { 'f', "flags", GPART_FLAGS, G_TYPE_STRING }, G_OPT_SENTINEL }, "bootcode [-b bootcode] [-p partcode] [-i index] [-f flags] geom" @@ -109,13 +109,13 @@ struct g_command PUBSYM(class_commands)[] = { }, { "create", 0, gpart_issue, { { 's', "scheme", NULL, G_TYPE_STRING }, - { 'n', "entries", G_VAL_OPTIONAL, G_TYPE_ASCNUM }, + { 'n', "entries", G_VAL_OPTIONAL, G_TYPE_NUMBER }, { 'f', "flags", GPART_FLAGS, G_TYPE_STRING }, G_OPT_SENTINEL }, "-s scheme [-n entries] [-f flags] provider" }, { "delete", 0, gpart_issue, { - { 'i', GPART_PARAM_INDEX, NULL, G_TYPE_ASCNUM }, + { 'i', GPART_PARAM_INDEX, NULL, G_TYPE_NUMBER }, { 'f', "flags", GPART_FLAGS, G_TYPE_STRING }, G_OPT_SENTINEL }, "-i index [-f flags] geom" @@ -126,7 +126,7 @@ struct g_command PUBSYM(class_commands)[] = { "[-f flags] geom" }, { "modify", 0, gpart_issue, { - { 'i', GPART_PARAM_INDEX, NULL, G_TYPE_ASCNUM }, + { 'i', GPART_PARAM_INDEX, NULL, G_TYPE_NUMBER }, { 'l', "label", G_VAL_OPTIONAL, G_TYPE_STRING }, { 't', "type", G_VAL_OPTIONAL, G_TYPE_STRING }, { 'f', "flags", GPART_FLAGS, G_TYPE_STRING }, @@ -135,7 +135,7 @@ struct g_command PUBSYM(class_commands)[] = { }, { "set", 0, gpart_issue, { { 'a', "attrib", NULL, G_TYPE_STRING }, - { 'i', GPART_PARAM_INDEX, NULL, G_TYPE_ASCNUM }, + { 'i', GPART_PARAM_INDEX, NULL, G_TYPE_NUMBER }, { 'f', "flags", GPART_FLAGS, G_TYPE_STRING }, G_OPT_SENTINEL }, "-a attrib -i index [-f flags] geom" @@ -151,14 +151,14 @@ struct g_command PUBSYM(class_commands)[] = { }, { "unset", 0, gpart_issue, { { 'a', "attrib", NULL, G_TYPE_STRING }, - { 'i', GPART_PARAM_INDEX, NULL, G_TYPE_ASCNUM }, + { 'i', GPART_PARAM_INDEX, NULL, G_TYPE_NUMBER }, { 'f', "flags", GPART_FLAGS, G_TYPE_STRING }, G_OPT_SENTINEL }, "-a attrib -i index [-f flags] geom" }, { "resize", 0, gpart_issue, { { 's', "size", GPART_AUTOFILL, G_TYPE_STRING }, - { 'i', GPART_PARAM_INDEX, NULL, G_TYPE_ASCNUM }, + { 'i', GPART_PARAM_INDEX, NULL, G_TYPE_NUMBER }, { 'f', "flags", GPART_FLAGS, G_TYPE_STRING }, G_OPT_SENTINEL }, "[-s size] -i index [-f flags] geom" diff --git a/sys/geom/part/g_part.c b/sys/geom/part/g_part.c index 38f988287cf3..5e1847885cd2 100644 --- a/sys/geom/part/g_part.c +++ b/sys/geom/part/g_part.c @@ -297,86 +297,155 @@ g_part_new_provider(struct g_geom *gp, struct g_part_table *table, } static int -g_part_parm_geom(const char *name, struct g_geom **v) +g_part_parm_geom(struct gctl_req *req, const char *name, struct g_geom **v) { struct g_geom *gp; + const char *gname; - if (strncmp(name, _PATH_DEV, strlen(_PATH_DEV)) == 0) - name += strlen(_PATH_DEV); + gname = gctl_get_asciiparam(req, name); + if (gname == NULL) + return (ENOATTR); + if (strncmp(gname, _PATH_DEV, strlen(_PATH_DEV)) == 0) + gname += strlen(_PATH_DEV); LIST_FOREACH(gp, &g_part_class.geom, geom) { - if (!strcmp(name, gp->name)) + if (!strcmp(gname, gp->name)) break; } - if (gp == NULL) + if (gp == NULL) { + gctl_error(req, "%d %s '%s'", EINVAL, name, gname); return (EINVAL); + } *v = gp; return (0); } static int -g_part_parm_provider(const char *name, struct g_provider **v) +g_part_parm_provider(struct gctl_req *req, const char *name, + struct g_provider **v) { struct g_provider *pp; + const char *pname; - if (strncmp(name, _PATH_DEV, strlen(_PATH_DEV)) == 0) - name += strlen(_PATH_DEV); - pp = g_provider_by_name(name); - if (pp == NULL) + pname = gctl_get_asciiparam(req, name); + if (pname == NULL) + return (ENOATTR); + if (strncmp(pname, _PATH_DEV, strlen(_PATH_DEV)) == 0) + pname += strlen(_PATH_DEV); + pp = g_provider_by_name(pname); + if (pp == NULL) { + gctl_error(req, "%d %s '%s'", EINVAL, name, pname); return (EINVAL); + } *v = pp; return (0); } static int -g_part_parm_quad(const char *p, quad_t *v) +g_part_parm_quad(struct gctl_req *req, const char *name, quad_t *v) { + const char *p; char *x; quad_t q; + p = gctl_get_asciiparam(req, name); + if (p == NULL) + return (ENOATTR); q = strtoq(p, &x, 0); - if (*x != '\0' || q < 0) + if (*x != '\0' || q < 0) { + gctl_error(req, "%d %s '%s'", EINVAL, name, p); return (EINVAL); + } *v = q; return (0); } static int -g_part_parm_scheme(const char *p, struct g_part_scheme **v) +g_part_parm_scheme(struct gctl_req *req, const char *name, + struct g_part_scheme **v) { struct g_part_scheme *s; + const char *p; + p = gctl_get_asciiparam(req, name); + if (p == NULL) + return (ENOATTR); TAILQ_FOREACH(s, &g_part_schemes, scheme_list) { if (s == &g_part_null_scheme) continue; if (!strcasecmp(s->name, p)) break; } - if (s == NULL) + if (s == NULL) { + gctl_error(req, "%d %s '%s'", EINVAL, name, p); return (EINVAL); + } *v = s; return (0); } static int -g_part_parm_str(const char *p, const char **v) +g_part_parm_str(struct gctl_req *req, const char *name, const char **v) { + const char *p; - if (p[0] == '\0') + p = gctl_get_asciiparam(req, name); + if (p == NULL) + return (ENOATTR); + /* An empty label is always valid. */ + if (strcmp(name, "label") != 0 && p[0] == '\0') { + gctl_error(req, "%d %s '%s'", EINVAL, name, p); return (EINVAL); + } *v = p; return (0); } static int -g_part_parm_uint(const char *p, u_int *v) +g_part_parm_intmax(struct gctl_req *req, const char *name, u_int *v) { - char *x; - long l; + const intmax_t *p; + int size; - l = strtol(p, &x, 0); - if (*x != '\0' || l < 0 || l > INT_MAX) + p = gctl_get_param(req, name, &size); + if (p == NULL) + return (ENOATTR); + if (size != sizeof(*p) || *p < 0 || *p > INT_MAX) { + gctl_error(req, "%d %s '%jd'", EINVAL, name, *p); return (EINVAL); - *v = (unsigned int)l; + } + *v = (u_int)*p; + return (0); +} + +static int +g_part_parm_uint32(struct gctl_req *req, const char *name, u_int *v) +{ + const uint32_t *p; + int size; + + p = gctl_get_param(req, name, &size); + if (p == NULL) + return (ENOATTR); + if (size != sizeof(*p) || *p > INT_MAX) { + gctl_error(req, "%d %s '%u'", EINVAL, name, (unsigned int)*p); + return (EINVAL); + } + *v = (u_int)*p; + return (0); +} + +static int +g_part_parm_bootcode(struct gctl_req *req, const char *name, const void **v, + unsigned int *s) +{ + const void *p; + int size; + + p = gctl_get_param(req, name, &size); + if (p == NULL) + return (ENOATTR); + *v = p; + *s = size; return (0); } @@ -679,7 +748,7 @@ g_part_ctl_create(struct gctl_req *req, struct g_part_parms *gpp) g_topology_assert(); /* Check that there isn't already a g_part geom on the provider. */ - error = g_part_parm_geom(pp->name, &gp); + error = g_part_parm_geom(req, "provider", &gp); if (!error) { null = gp->softc; if (null->gpt_scheme != &g_part_null_scheme) { @@ -1225,11 +1294,10 @@ g_part_ctlreq(struct gctl_req *req, struct g_class *mp, const char *verb) struct g_part_parms gpp; struct g_part_table *table; struct gctl_req_arg *ap; - const char *p; enum g_part_ctl ctlreq; unsigned int i, mparms, oparms, parm; int auto_commit, close_on_error; - int error, len, modifies; + int error, modifies; G_PART_TRACE((G_T_TOPOLOGY, "%s(%s,%s)", __func__, mp->name, verb)); g_topology_assert(); @@ -1381,69 +1449,64 @@ g_part_ctlreq(struct gctl_req *req, struct g_class *mp, const char *verb) gctl_error(req, "%d param '%s'", EINVAL, ap->name); return; } - if (parm == G_PART_PARM_BOOTCODE) - p = gctl_get_param(req, ap->name, &len); - else - p = gctl_get_asciiparam(req, ap->name); - if (p == NULL) { - gctl_error(req, "%d param '%s'", ENOATTR, ap->name); - return; - } switch (parm) { case G_PART_PARM_ATTRIB: - error = g_part_parm_str(p, &gpp.gpp_attrib); + error = g_part_parm_str(req, ap->name, &gpp.gpp_attrib); break; case G_PART_PARM_BOOTCODE: - gpp.gpp_codeptr = p; - gpp.gpp_codesize = len; - error = 0; + error = g_part_parm_bootcode(req, ap->name, + &gpp.gpp_codeptr, &gpp.gpp_codesize); break; case G_PART_PARM_ENTRIES: - error = g_part_parm_uint(p, &gpp.gpp_entries); + error = g_part_parm_intmax(req, ap->name, + &gpp.gpp_entries); break; case G_PART_PARM_FLAGS: - if (p[0] == '\0') - continue; - error = g_part_parm_str(p, &gpp.gpp_flags); + error = g_part_parm_str(req, ap->name, &gpp.gpp_flags); break; case G_PART_PARM_GEOM: - error = g_part_parm_geom(p, &gpp.gpp_geom); + error = g_part_parm_geom(req, ap->name, &gpp.gpp_geom); break; case G_PART_PARM_INDEX: - error = g_part_parm_uint(p, &gpp.gpp_index); + error = g_part_parm_intmax(req, ap->name, &gpp.gpp_index); break; case G_PART_PARM_LABEL: - /* An empty label is always valid. */ - gpp.gpp_label = p; - error = 0; + error = g_part_parm_str(req, ap->name, &gpp.gpp_label); break; case G_PART_PARM_OUTPUT: error = 0; /* Write-only parameter */ break; case G_PART_PARM_PROVIDER: - error = g_part_parm_provider(p, &gpp.gpp_provider); + error = g_part_parm_provider(req, ap->name, + &gpp.gpp_provider); break; case G_PART_PARM_SCHEME: - error = g_part_parm_scheme(p, &gpp.gpp_scheme); + error = g_part_parm_scheme(req, ap->name, + &gpp.gpp_scheme); break; case G_PART_PARM_SIZE: - error = g_part_parm_quad(p, &gpp.gpp_size); + error = g_part_parm_quad(req, ap->name, &gpp.gpp_size); break; case G_PART_PARM_START: - error = g_part_parm_quad(p, &gpp.gpp_start); + error = g_part_parm_quad(req, ap->name, &gpp.gpp_start); break; case G_PART_PARM_TYPE: - error = g_part_parm_str(p, &gpp.gpp_type); + error = g_part_parm_str(req, ap->name, &gpp.gpp_type); break; case G_PART_PARM_VERSION: - error = g_part_parm_uint(p, &gpp.gpp_version); + error = g_part_parm_uint32(req, ap->name, + &gpp.gpp_version); break; default: error = EDOOFUS; + gctl_error(req, "%d %s", error, ap->name); break; } - if (error) { - gctl_error(req, "%d %s '%s'", error, ap->name, p); + if (error != 0) { + if (error == ENOATTR) { + gctl_error(req, "%d param '%s'", error, + ap->name); + } return; } gpp.gpp_parms |= parm;