[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH V4 20/24] xl: introduce load/save_domain_config
They are used to serialize / deserialize domain configuration to / from user data store. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/libxl/xl_cmdimpl.c | 119 ++++++++++++++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 42 deletions(-) diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 7443d86..f891ab5 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -160,6 +160,73 @@ struct domain_create { char **migration_domname_r; /* from malloc */ }; +static int _parse_config_data_json(char *config_data, int config_len, + libxl_domain_config *d_config) +{ + int ret; + + /* Make sure this string ends with \0 -- the parser expects a NULL + * terminated string. + */ + if (config_data[config_len-1] != '\0') { + config_data = realloc(config_data, config_len + 1); + if (!config_data) { + fprintf(stderr, "Failed to realloc config_data\n"); + ret = ERROR_NOMEM; + goto out; + } + config_data[config_len] = '\0'; + } + + ret = libxl_domain_config_from_json(ctx, d_config, config_data); + +out: + return ret; +} +/* Load domain configuration from userdata store */ +static int load_domain_config(uint32_t domid, libxl_domain_config *d_config) +{ + uint8_t *data; + int ret, len; + + ret = libxl_userdata_retrieve(ctx, domid, "xl-json", &data, &len); + if (ret) { + fprintf(stderr, "failed to retrieve guest configuration (rc=%d).", ret); + ret = ERROR_FAIL; + goto out; + } + + ret = _parse_config_data_json((char *)data, len, d_config); + if (ret) + goto out; + + free(data); + +out: + return ret; +} + +/* Store domain configuration to userdata store */ +static int store_domain_config(uint32_t domid, libxl_domain_config *d_config) +{ + char *d_config_json; + int ret; + + d_config_json = libxl_domain_config_to_json(ctx, d_config); + + ret = libxl_userdata_store(ctx, domid, "xl-json", + (const uint8_t *)d_config_json, + strlen(d_config_json)); + + free(d_config_json); + + if (ret) { + fprintf(stderr, "failed to store guest configuration (rc=%d). ", ret); + return ERROR_FAIL; + } + + return 0; +} static uint32_t find_domain(const char *p) __attribute__((warn_unused_result)); static uint32_t find_domain(const char *p) @@ -737,19 +804,7 @@ static void parse_config_data_json(char *config_data, exit(1); } - /* Make sure this string ends with \0 -- the parser expects a NULL - * terminated string. - */ - if (config_data[config_len-1] != '\0') { - config_data = realloc(config_data, config_len + 1); - if (!config_data) { - fprintf(stderr, "Failed to realloc config_data\n"); - exit(1); - } - config_data[config_len] = '\0'; - } - - ret = libxl_domain_config_from_json(ctx, d_config, config_data); + ret = _parse_config_data_json(config_data, config_len, d_config); if (ret) { fprintf(stderr, "Failed to parse config\n"); exit(1); @@ -2060,7 +2115,6 @@ static uint32_t create_domain(struct domain_create *dom_info) uint32_t domid = INVALID_DOMID; libxl_domain_config d_config, d_config_saved; - char *d_config_json = NULL; int debug = dom_info->debug; int daemonize = dom_info->daemonize; @@ -2318,15 +2372,8 @@ start: } update_domain_config(&d_config_saved, &d_config); - d_config_json = libxl_domain_config_to_json(ctx, &d_config_saved); - if (d_config_json == NULL) { - perror("cannot generate JSON object of domain configuration"); - ret = ERROR_FAIL; - goto error_out; - } - ret = libxl_userdata_store(ctx, domid, "xl-json", - (const uint8_t *)d_config_json, - strlen(d_config_json)); + + ret = store_domain_config(domid, &d_config_saved); if (ret) { perror("cannot save config file"); ret = ERROR_FAIL; @@ -2492,8 +2539,6 @@ out: free(config_data); - free(d_config_json); - console_child_report(child_console); if (deathw) @@ -3218,9 +3263,7 @@ static void list_domains_details(const libxl_dominfo *info, int nb_domain) { libxl_domain_config d_config; - char *config_source; - uint8_t *data; - int i, len, rc; + int i, rc; yajl_gen hand = NULL; yajl_gen_status s; @@ -3244,20 +3287,17 @@ static void list_domains_details(const libxl_dominfo *info, int nb_domain) /* no detailed info available on dom0 */ if (info[i].domid == 0) continue; - rc = libxl_userdata_retrieve(ctx, info[i].domid, "xl-json", - &data, &len); - if (rc) - continue; - CHK_SYSCALL(asprintf(&config_source, "<domid %d data>", info[i].domid)); libxl_domain_config_init(&d_config); - parse_config_data_json((char *)data, len, &d_config); + rc = load_domain_config(info[i].domid, &d_config); + if (rc) { + libxl_domain_config_dispose(&d_config); + continue; + } if (default_output_format == OUTPUT_FORMAT_JSON) s = printf_info_one_json(hand, info[i].domid, &d_config); else printf_info_sexp(info[i].domid, &d_config); libxl_domain_config_dispose(&d_config); - free(data); - free(config_source); if (s != yajl_gen_status_ok) goto out; } @@ -4622,17 +4662,12 @@ int main_config_update(int argc, char **argv) printf_info(default_output_format, -1, &d_config); if (!dryrun_only) { - char *d_config_json = NULL; fprintf(stderr, "setting dom%d configuration\n", domid); - d_config_json = libxl_domain_config_to_json(ctx, &d_config); - rc = libxl_userdata_store(ctx, domid, "xl-json", - (const uint8_t*)d_config_json, - strlen(d_config_json)); + rc = store_domain_config(domid, &d_config); if (rc) { fprintf(stderr, "failed to update configuration\n"); exit(1); } - free(d_config_json); } libxl_domain_config_dispose(&d_config); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |