[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/4] xl: rework vtpm config parsing code
Follow the same pattern as vif config parse to introduce parse_vtpm_config_token, parse_vtpm_config_one, parse_vtpm_config_multistring and parse_vtpm_config. Then replace open-coded parsing code with appropriate functions. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/libxl/xl_cmdimpl.c | 119 ++++++++++++++++++++++++++++++----------------- 1 file changed, 76 insertions(+), 43 deletions(-) diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index f736f95..1444b0b 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1110,6 +1110,76 @@ static void parse_nic_config(XLU_Config **config, const char *buf, parse_nic_config_multistring(config, 1, &buf, nic); } +static int parse_vtpm_config_token(XLU_Config **config, char *token, + libxl_device_vtpm *vtpm) +{ + char *oparg; + + if (MATCH_OPTION("uuid", token, oparg)) { + if(libxl_uuid_from_string(&vtpm->uuid, oparg)) { + fprintf(stderr, "Invalid uuid specified (%s)\n", oparg); + return 1; + } + } else if (MATCH_OPTION("backend", token, oparg)) { + replace_string(&vtpm->backend_domname, oparg); + } else { + fprintf(stderr, "unrecognized argument `%s'\n", token); + return 1; + } + + return 0; +} + +static int parse_vtpm_config_one(XLU_Config **config, const char *config_str, + libxl_device_vtpm *vtpm) +{ + char *buf = xstrdup(config_str); + char *p; + int ret; + + p = strtok(buf, ","); + if (!p) { + ret = 0; + goto out; + } + + do { + while (*p == ' ') + p++; + ret = parse_vtpm_config_token(config, p, vtpm); + } while ((p = strtok(NULL, ",")) != NULL && ret == 0); + +out: + free(buf); + + return ret; +} + +static void parse_vtpm_config_multistring(XLU_Config **config, + int nspecs, const char *const *specs, + libxl_device_vtpm *vtpm) +{ + int i; + + libxl_device_vtpm_init(vtpm); + + if (!*config) { + *config = xlu_cfg_init(stderr, "command line"); + if (!*config) { perror("xlu_cfg_init"); exit(-1); } + } + + for (i = 0; i < nspecs; i++) { + if (parse_vtpm_config_one(config, specs[i], vtpm)) + exit(EXIT_FAILURE); + } +} + +static void parse_vtpm_config(XLU_Config **config, const char *buf, + libxl_device_vtpm *vtpm) +{ + parse_vtpm_config_multistring(config, 1, &buf, vtpm); +} + static unsigned long parse_ulong(const char *str) { char *endptr; @@ -1858,42 +1928,17 @@ static void parse_config_data(const char *config_source, while ((buf = xlu_cfg_get_listitem (vtpms, d_config->num_vtpms)) != NULL) { libxl_device_vtpm *vtpm; - char * buf2 = strdup(buf); - char *p, *p2; - bool got_backend = false; vtpm = ARRAY_EXTEND_INIT(d_config->vtpms, d_config->num_vtpms, libxl_device_vtpm_init); - p = strtok(buf2, ","); - if(p) { - do { - while(*p == ' ') - ++p; - if ((p2 = strchr(p, '=')) == NULL) - break; - *p2 = '\0'; - if (!strcmp(p, "backend")) { - vtpm->backend_domname = strdup(p2 + 1); - got_backend = true; - } else if(!strcmp(p, "uuid")) { - if( libxl_uuid_from_string(&vtpm->uuid, p2 + 1) ) { - fprintf(stderr, - "Failed to parse vtpm UUID: %s\n", p2 + 1); - exit(1); - } - } else { - fprintf(stderr, "Unknown string `%s' in vtpm spec\n", p); - exit(1); - } - } while ((p = strtok(NULL, ",")) != NULL); - } - if(!got_backend) { + parse_vtpm_config(&config, buf, vtpm); + + if(!vtpm->backend_domname) { fprintf(stderr, "vtpm spec missing required backend field!\n"); exit(1); } - free(buf2); } } @@ -6812,8 +6857,8 @@ int main_vtpmattach(int argc, char **argv) { int opt; libxl_device_vtpm vtpm; - char *oparg; uint32_t domid; + XLU_Config *config = 0; SWITCH_FOREACH_OPT(opt, "", NULL, "vtpm-attach", 1) { /* No options */ @@ -6825,20 +6870,8 @@ int main_vtpmattach(int argc, char **argv) } ++optind; - libxl_device_vtpm_init(&vtpm); - for (argv += optind, argc -= optind; argc > 0; ++argv, --argc) { - if (MATCH_OPTION("uuid", *argv, oparg)) { - if(libxl_uuid_from_string(&(vtpm.uuid), oparg)) { - fprintf(stderr, "Invalid uuid specified (%s)\n", oparg); - return 1; - } - } else if (MATCH_OPTION("backend", *argv, oparg)) { - replace_string(&vtpm.backend_domname, oparg); - } else { - fprintf(stderr, "unrecognized argument `%s'\n", *argv); - return 1; - } - } + parse_vtpm_config_multistring(&config, argc-optind, + (const char* const*) argv + optind, &vtpm); if(dryrun_only) { char* json = libxl_device_vtpm_to_json(ctx, &vtpm); -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |