From owner-svn-src-head@FreeBSD.ORG Tue Sep 14 16:21:13 2010 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6C75E1065670; Tue, 14 Sep 2010 16:21:13 +0000 (UTC) (envelope-from pjd@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 596E48FC23; Tue, 14 Sep 2010 16:21:13 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o8EGLDVv086251; Tue, 14 Sep 2010 16:21:13 GMT (envelope-from pjd@svn.freebsd.org) Received: (from pjd@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8EGLDhr086248; Tue, 14 Sep 2010 16:21:13 GMT (envelope-from pjd@svn.freebsd.org) Message-Id: <201009141621.o8EGLDhr086248@svn.freebsd.org> From: Pawel Jakub Dawidek Date: Tue, 14 Sep 2010 16:21:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r212614 - in head: sbin/geom/class/part sys/geom/part X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Sep 2010 16:21:13 -0000 Author: pjd Date: Tue Sep 14 16:21:13 2010 New Revision: 212614 URL: http://svn.freebsd.org/changeset/base/212614 Log: - 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. Modified: head/sbin/geom/class/part/geom_part.c head/sys/geom/part/g_part.c Modified: head/sbin/geom/class/part/geom_part.c ============================================================================== --- head/sbin/geom/class/part/geom_part.c Tue Sep 14 16:19:09 2010 (r212613) +++ head/sbin/geom/class/part/geom_part.c Tue Sep 14 16:21:13 2010 (r212614) @@ -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" Modified: head/sys/geom/part/g_part.c ============================================================================== --- head/sys/geom/part/g_part.c Tue Sep 14 16:19:09 2010 (r212613) +++ head/sys/geom/part/g_part.c Tue Sep 14 16:21:13 2010 (r212614) @@ -297,86 +297,155 @@ g_part_new_provider(struct g_geom *gp, s } 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, 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, stru 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, stru 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;