summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2006-04-10 04:07:20 +0000
committermarcel <marcel@FreeBSD.org>2006-04-10 04:07:20 +0000
commit6e4595cb7b888af3a019389bac62913e3042f998 (patch)
tree3be56032e4a7bc383ffbdbe64a9221689c104115 /tools
parent74d3377eaa6de46ba6e520a0016f6bcab48d6867 (diff)
downloadFreeBSD-src-6e4595cb7b888af3a019389bac62913e3042f998.zip
FreeBSD-src-6e4595cb7b888af3a019389bac62913e3042f998.tar.gz
MFp4:
Add support for read-write parameters. Allow an optional initializer for read-write parameters. Print the value of those parameters on success following the PASS.
Diffstat (limited to 'tools')
-rw-r--r--tools/regression/geom_gpt/test.c98
1 files changed, 81 insertions, 17 deletions
diff --git a/tools/regression/geom_gpt/test.c b/tools/regression/geom_gpt/test.c
index 0cb0b30..d750d30 100644
--- a/tools/regression/geom_gpt/test.c
+++ b/tools/regression/geom_gpt/test.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2005 Marcel Moolenaar
+ * Copyright (c) 2005, 2006 Marcel Moolenaar
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,6 +27,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/param.h>
#include <errno.h>
#include <libgeom.h>
#include <limits.h>
@@ -35,36 +36,82 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <unistd.h>
+struct retval {
+ struct retval *retval;
+ const char *param;
+ char *value;
+};
+
+struct retval *retval;
int verbose;
static void
usage()
{
- fprintf(stdout, "usage: %s [-v] param ...\n", getprogname());
+ fprintf(stdout, "usage: %s [-v] param[:len][=value] ...\n",
+ getprogname());
exit(1);
}
static int
-parse(char *arg, char **param, char **value)
+parse(char *arg, char **param, char **value, int *len)
{
- char *e;
+ char *e, *colon, *equal;
+
+ if (*arg == '\0')
+ return (EINVAL);
+
+ colon = strchr(arg, ':');
+ equal = strchr(arg, '=');
+ if (colon == NULL && equal == NULL)
+ return (EINVAL);
+ if (colon == arg || equal == arg)
+ return (EINVAL);
+ if (colon != NULL && equal != NULL && equal < colon)
+ return (EINVAL);
+
+ if (colon != NULL)
+ *colon++ = '\0';
+ if (equal != NULL)
+ *equal++ = '\0';
*param = arg;
- e = strchr(arg, '=');
- if (e != NULL) {
- *e = '\0';
- *value = e + 1;
- } else
- *value = NULL;
+ if (colon != NULL) {
+ /* Length specification. This parameter is RW. */
+ if (*colon == '\0')
+ return (EINVAL);
+ *len = strtol(colon, &e, 0);
+ if (*e != '\0')
+ return (EINVAL);
+ if (*len <= 0 || *len > PATH_MAX)
+ return (EINVAL);
+ *value = malloc(*len);
+ if (*value == NULL)
+ return (ENOMEM);
+ memset(*value, 0, *len);
+ if (equal != NULL) {
+ if (strlen(equal) >= PATH_MAX)
+ return (ENOMEM);
+ strcpy(*value, equal);
+ }
+ } else {
+ /* This parameter is RO. */
+ *len = -1;
+ if (*equal == '\0')
+ return (EINVAL);
+ *value = equal;
+ }
+
return (0);
}
int main(int argc, char *argv[])
{
+ struct retval *rv;
struct gctl_req *req;
char *param, *value;
const char *s;
- int c;
+ int c, len;
req = gctl_get_handle();
gctl_ro_param(req, "class", -1, "GPT");
@@ -83,19 +130,36 @@ int main(int argc, char *argv[])
}
while (optind < argc) {
- parse(argv[optind++], &param, &value);
- if (value != NULL)
- gctl_ro_param(req, param, -1, value);
+ if (!parse(argv[optind++], &param, &value, &len)) {
+ if (len > 0) {
+ rv = malloc(sizeof(struct retval));
+ rv->param = param;
+ rv->value = value;
+ rv->retval = retval;
+ retval = rv;
+ gctl_rw_param(req, param, len, value);
+ } else
+ gctl_ro_param(req, param, -1, value);
+ }
}
if (verbose)
gctl_dump(req, stdout);
s = gctl_issue(req);
- if (s != NULL)
+ if (s == NULL) {
+ printf("PASS");
+ while (retval != NULL) {
+ rv = retval->retval;
+ printf(" %s=%s", retval->param, retval->value);
+ free(retval->value);
+ free(retval);
+ retval = rv;
+ }
+ printf("\n");
+ } else
printf("FAIL %s\n", s);
- else
- printf("PASS\n");
+
gctl_free(req);
return (0);
}
OpenPOWER on IntegriCloud