svn commit: r212614 - in head: sbin/geom/class/part sys/geom/part

Pawel Jakub Dawidek pjd at FreeBSD.org
Tue Sep 14 16:21:13 UTC 2010


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;


More information about the svn-src-all mailing list