xl: carry domain config around in struct domain_config
PATCH 1/1 xl: carry domain config around in struct domain_config
Move more domain configuration items into struct domain_config.
Reduces the number of functions which take large numbers of parameters and generally just keeps configuration stuff in one place.
(depends on preceeding series "Add support for on_poweroff, on_reboot and on_crash configuration" due to code level dependency, resendiong due to reworking of that series)
PATCH 1/1 xl: move create and build info to struct domain_config
# HG changeset patch
# User Ian Campbell <[email protected]> # Date 1280225499 -3600
# Node ID 0d225bbe6ffa904d081ca34cd736cb121d7c67b2 # Parent 519187e3e2b1bbeb244d64d79153e350ca3ba0bf
xl: move create and build info to struct domain_config
All three are passed around together and this begins to reduce some of the exceptionally long parameter lists.
tools/libxl/xl_cmdimpl.c +36 -33
@@ -125,6 +125,9 @@ static char *action_on_shutdown_names[] };struct domain_config { +libxl_domain_create_info c_info; +libxl_domain_build_info b_info; +enum action_on_shutdown on_poweroff;enum action_on_shutdown on_reboot;enum action_on_shutdown on_watchdog;
@@ -354,8 +357,7 @@ static void init_console_info(libxl_devi } static void printf_info(int domid, - libxl_domain_create_info *c_info, - libxl_domain_build_info *b_info, + struct domain_config *d_config, libxl_device_disk *disks, int num_disks, libxl_device_nic *vifs,
@@ -369,6 +371,10 @@ static void printf_info(int domid, libxl_device_model_info *dm_info) {int i; + +libxl_domain_create_info *c_info = &d_config->c_info; +libxl_domain_build_info *b_info = &d_config->b_info; +printf ("(domain\n\t(domid %d)\n" , domid);printf ("\t(domain_create_info)\n" );printf ("\t(hvm %d)\n" , c_info->hvm);
@@ -523,8 +529,6 @@ static void parse_config_data(const char static void parse_config_data(const char *configfile_filename_report, const char *configfile_data, int configfile_len, - libxl_domain_create_info *c_info, - libxl_domain_build_info *b_info, struct domain_config *d_config, libxl_device_disk **disks, int *num_disks,
@@ -547,6 +551,9 @@ static void parse_config_data(const charint pci_power_mgmt =0 ;int pci_msitranslate =1 ;int e; + +libxl_domain_create_info *c_info = &d_config->c_info; +libxl_domain_build_info *b_info = &d_config->b_info; config=xlu_cfg_init (stderr, configfile_filename_report);if (!config) {
@@ -1068,7 +1075,6 @@ int autoconnect_console(int hvm)/* Returns 1 if domain should be restarted, 2 if domain should be renamed then restarted */ static int handle_domain_death (struct libxl_ctx *ctx,uint32_t domid,libxl_event *event, -libxl_domain_create_info *c_info,struct domain_config *d_config,struct libxl_dominfo *info) {int restart =0 ;
@@ -1097,7 +1103,7 @@ static int handle_domain_death(struct lichar *corefile;int rc; -if (asprintf (&corefile,"/var/xen/dump/%s" , c_info->name) <0 ) { +if (asprintf (&corefile,"/var/xen/dump/%s" , d_config->c_info.name) <0 ) {LOG ("failed to construct core dump path" ); }else {LOG ("dumping core to %s" , corefile);
@@ -1138,7 +1144,6 @@ static int handle_domain_death(struct li }static int preserve_domain (struct libxl_ctx *ctx,uint32_t domid,libxl_event *event, -libxl_domain_create_info *c_info,struct domain_config *d_config,struct libxl_dominfo *info) {time_t now;
@@ -1168,8 +1173,8 @@ static int preserve_domain(struct libxl_random_uuid (&new_uuid[0 ]); -LOG ("Preserving domain %d %s with suffix%s" , domid, c_info->name, stime); - rc =libxl_domain_preserve (ctx, domid, c_info, stime, new_uuid); +LOG ("Preserving domain %d %s with suffix%s" , domid, d_config->c_info.name, stime); + rc =libxl_domain_preserve (ctx, domid, &d_config->c_info, stime, new_uuid);return rc ==0 ?1 :0 ; }
@@ -1192,8 +1197,6 @@ static int create_domain(struct domain_c {struct domain_config d_config; -libxl_domain_create_info c_info; -libxl_domain_build_info b_info;libxl_domain_build_state state;libxl_device_model_info dm_info;libxl_device_disk *disks =NULL ;
@@ -1224,6 +1227,7 @@ static int create_domain(struct domain_cint restore_fd =-1 ;struct save_file_header hdr; + memset(&d_config, 0x00, sizeof(d_config);memset (&dm_info,0x00 ,sizeof (dm_info));if (restore_file) {
@@ -1326,32 +1330,32 @@ static int create_domain(struct domain_cif (!dom_info->quiet)printf ("Parsing config file %s\n" , config_file); -parse_config_data (config_file, config_data, config_len, &c_info, &b_info, &d_config, &disks, &num_disks, &vifs, &num_vifs, &vif2s, &num_vif2s, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs, &dm_info); +parse_config_data (config_file, config_data, config_len, &d_config, &disks, &num_disks, &vifs, &num_vifs, &vif2s, &num_vif2s, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs, &dm_info);if (dom_info->dryrun)return 0 ;if (migrate_fd >=0 ) { -if (c_info.name) { +if (d_config.c_info.name) {/* when we receive a domain we get its name from the config * file; and we receive it to a temporary name */ assert (!common_domname); - common_domname = c_info.name; -if (asprintf (migration_domname_r,"%s--incoming" , c_info.name) <0 ) { + common_domname = d_config.c_info.name; +if (asprintf (migration_domname_r,"%s--incoming" , d_config.c_info.name) <0 ) {fprintf (stderr,"Failed to allocate memory in asprintf\n" );exit (1 ); } - c_info.name = *migration_domname_r; + d_config.c_info.name = *migration_domname_r; } }if (debug) -printf_info (-1 , &c_info, &b_info, disks, num_disks, vifs, num_vifs, pcidevs, num_pcidevs, vfbs, num_vfbs, vkbs, num_vkbs, &dm_info); +printf_info (-1 , &d_config, disks, num_disks, vifs, num_vifs, pcidevs, num_pcidevs, vfbs, num_vfbs, vkbs, num_vkbs, &dm_info); start: domid =0 ; - ret =libxl_domain_make (&ctx, &c_info, &domid); + ret =libxl_domain_make (&ctx, &d_config.c_info, &domid);if (ret) {fprintf (stderr,"cannot make domain: %d\n" , ret); ret =ERROR_FAIL ;
@@ -1367,7 +1371,7 @@ start: }if (dom_info->console_autoconnect) { - ret =autoconnect_console (c_info.hvm); + ret =autoconnect_console (d_config.c_info.hvm);if (ret) goto error_out; }
@@ -1378,7 +1382,7 @@ start:*/ dom_info->console_autoconnect =0 ; - ret =libxl_run_bootloader (&ctx, &b_info, num_disks >0 ? &disks[0 ] :NULL , domid); + ret =libxl_run_bootloader (&ctx, &d_config.b_info, num_disks >0 ? &disks[0 ] :NULL , domid);if (ret) {fprintf (stderr,"failed to run bootloader: %d\n" , ret); goto error_out;
@@ -1389,9 +1393,9 @@ start:free (dm_info.saved_state); dm_info.saved_state =NULL ; } - ret =libxl_domain_build (&ctx, &b_info, domid, &state); - }else { - ret =libxl_domain_restore (&ctx, &b_info, domid, restore_fd, &state, &dm_info); + ret =libxl_domain_build (&ctx, &d_config.b_info, domid, &state); + }else { + ret =libxl_domain_restore (&ctx, &d_config.b_info, domid, restore_fd, &state, &dm_info); }if (ret) {
@@ -1418,7 +1422,7 @@ start: goto error_out; } } -if (!c_info.hvm) { +if (!d_config.c_info.hvm) {for (i =0 ; i < num_vif2s; i++) { vif2s[i].domid = domid; ret =libxl_device_net2_add (&ctx, domid, &(vif2s[i]));
@@ -1429,7 +1433,7 @@ start: } } } -if (c_info.hvm) { +if (d_config.c_info.hvm) { dm_info.domid = domid;MUST (libxl_create_device_model (&ctx, &dm_info, disks, num_disks, vifs, num_vifs, &dm_starting) );
@@ -1493,7 +1497,7 @@ start:exit (-1 ); } -if (asprintf (&name,"xl-%s" , c_info.name) <0 ) { +if (asprintf (&name,"xl-%s" , d_config.c_info.name) <0 ) {LOG ("Failed to allocate memory in asprintf" );exit (1 ); }
@@ -1516,7 +1520,7 @@ start: need_daemon =0 ; }LOG ("Waiting for domain %s (domid %d) to die [pid %ld]" , - c_info.name, domid, (long )getpid ()); + d_config.c_info.name, domid, (long )getpid ()); w1 = (libxl_waiter *)xmalloc (sizeof (libxl_waiter) * num_disks); w2 = (libxl_waiter *)xmalloc (sizeof (libxl_waiter));libxl_wait_for_disk_ejects (&ctx, domid, disks, num_disks, w1);
@@ -1545,9 +1549,9 @@ start:LOG ("Domain %d is dead" , domid);if (ret) { -switch (handle_domain_death (&ctx, domid, &event, &c_info, &d_config, &info)) { +switch (handle_domain_death (&ctx, domid, &event, &d_config, &info)) {case 2 : -if (!preserve_domain (&ctx, domid, &event, &c_info, &d_config, &info)) +if (!preserve_domain (&ctx, domid, &event, &d_config, &info))/* If we fail then exit leaving the old domain in place. */ exit (-1 );
@@ -2083,8 +2087,6 @@ void list_domains_details(void)uint8_t *data;int nb_domain, i, len, rc;int num_disks =0 , num_vifs =0 , num_vif2s =0 , num_pcidevs =0 , num_vfbs =0 , num_vkbs =0 ; -libxl_domain_create_info c_info; -libxl_domain_build_info b_info;libxl_device_model_info dm_info;libxl_device_disk *disks =NULL ;libxl_device_nic *vifs =NULL ;
@@ -2104,8 +2106,9 @@ void list_domains_details(void)if (rc)continue ;CHK_ERRNO (asprintf (&config_file,"<domid %d data>" , info[i].domid)); -parse_config_data (config_file, (char *)data, len, &c_info, &b_info, &d_config, &disks, &num_disks, &vifs, &num_vifs, &vif2s, &num_vif2s, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs, &dm_info); -printf_info (info[i].domid, &c_info, &b_info, disks, num_disks, vifs, num_vifs, pcidevs, num_pcidevs, vfbs, num_vfbs, vkbs, num_vkbs, &dm_info); + memset(&d_config, 0x00, sizeof(d_config); +parse_config_data (config_file, (char *)data, len, &d_config, &disks, &num_disks, &vifs, &num_vifs, &vif2s, &num_vif2s, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs, &dm_info); +printf_info (info[i].domid, &d_config, disks, num_disks, vifs, num_vifs, pcidevs, num_pcidevs, vfbs, num_vfbs, vkbs, num_vkbs, &dm_info);free (data);free (config_file); }
PATCH 1/1 xl: move device structs into struct domain_config
In reply to Ian Campbell# HG changeset patch
# User Ian Campbell <[email protected]> # Date 1280225499 -3600
# Node ID d06f5e9633d3390cf5ea451fe39e48ca0b7bdbd4 # Parent 0d225bbe6ffa904d081ca34cd736cb121d7c67b2
xl: move device structs into struct domain_config
tools/libxl/xl_cmdimpl.c +189 -206
@@ -128,6 +128,15 @@ struct domain_config {libxl_domain_create_info c_info;libxl_domain_build_info b_info; +int num_disks, num_vifs, num_vif2s, num_pcidevs, num_vfbs, num_vkbs; + +libxl_device_disk *disks; +libxl_device_nic *vifs; +libxl_device_net2 *vif2s; +libxl_device_pci *pcidevs; +libxl_device_vfb *vfbs; +libxl_device_vkb *vkbs; +enum action_on_shutdown on_poweroff;enum action_on_shutdown on_reboot;enum action_on_shutdown on_watchdog;
@@ -358,16 +367,6 @@ static void init_console_info(libxl_devistatic void printf_info (int domid,struct domain_config *d_config, -libxl_device_disk *disks, -int num_disks, -libxl_device_nic *vifs, -int num_vifs, -libxl_device_pci *pcidevs, -int num_pcidevs, -libxl_device_vfb *vfbs, -int num_vfbs, -libxl_device_vkb *vkb, -int num_vkbs,libxl_device_model_info *dm_info) {int i;
@@ -452,58 +451,66 @@ static void printf_info(int domid, }printf ("\t)\n" ); -for (i =0 ; i < num_disks; i++) { +for (i =0 ; i < d_config->num_disks; i++) {printf ("\t(device\n" );printf ("\t\t(tap\n" ); -printf ("\t\t\t(backend_domid %d)\n" , disks[i].backend_domid); -printf ("\t\t\t(domid %d)\n" , disks[i].domid); -printf ("\t\t\t(physpath %s)\n" , disks[i].physpath); -printf ("\t\t\t(phystype %d)\n" , disks[i].phystype); -printf ("\t\t\t(virtpath %s)\n" , disks[i].virtpath); -printf ("\t\t\t(unpluggable %d)\n" , disks[i].unpluggable); -printf ("\t\t\t(readwrite %d)\n" , disks[i].readwrite); -printf ("\t\t\t(is_cdrom %d)\n" , disks[i].is_cdrom); +printf ("\t\t\t(backend_domid %d)\n" , d_config->disks[i].backend_domid); +printf ("\t\t\t(domid %d)\n" , d_config->disks[i].domid); +printf ("\t\t\t(physpath %s)\n" , d_config->disks[i].physpath); +printf ("\t\t\t(phystype %d)\n" , d_config->disks[i].phystype); +printf ("\t\t\t(virtpath %s)\n" , d_config->disks[i].virtpath); +printf ("\t\t\t(unpluggable %d)\n" , d_config->disks[i].unpluggable); +printf ("\t\t\t(readwrite %d)\n" , d_config->disks[i].readwrite); +printf ("\t\t\t(is_cdrom %d)\n" , d_config->disks[i].is_cdrom);printf ("\t\t)\n" );printf ("\t)\n" ); } -for (i =0 ; i < num_vifs; i++) { +for (i =0 ; i < d_config->num_vifs; i++) {printf ("\t(device\n" );printf ("\t\t(vif\n" ); -printf ("\t\t\t(backend_domid %d)\n" , vifs[i].backend_domid); -printf ("\t\t\t(domid %d)\n" , vifs[i].domid); -printf ("\t\t\t(devid %d)\n" , vifs[i].devid); -printf ("\t\t\t(mtu %d)\n" , vifs[i].mtu); -printf ("\t\t\t(model %s)\n" , vifs[i].model); -printf ("\t\t\t(mac %02x%02x%02x%02x%02x%02x)\n" , vifs[i].mac[0 ], vifs[i].mac[1 ], vifs[i].mac[2 ], vifs[i].mac[3 ], vifs[i].mac[4 ], vifs[i].mac[5 ]); +printf ("\t\t\t(backend_domid %d)\n" , d_config->vifs[i].backend_domid); +printf ("\t\t\t(domid %d)\n" , d_config->vifs[i].domid); +printf ("\t\t\t(devid %d)\n" , d_config->vifs[i].devid); +printf ("\t\t\t(mtu %d)\n" , d_config->vifs[i].mtu); +printf ("\t\t\t(model %s)\n" , d_config->vifs[i].model); +printf ("\t\t\t(mac %02x%02x%02x%02x%02x%02x)\n" , + d_config->vifs[i].mac[0 ], d_config->vifs[i].mac[1 ], + d_config->vifs[i].mac[2 ], d_config->vifs[i].mac[3 ], + d_config->vifs[i].mac[4 ], d_config->vifs[i].mac[5 ]);printf ("\t\t)\n" );printf ("\t)\n" ); } -for (i =0 ; i < num_pcidevs; i++) { +for (i =0 ; i < d_config->num_pcidevs; i++) {printf ("\t(device\n" );printf ("\t\t(pci\n" ); -printf ("\t\t\t(pci dev " PCI_BDF_VDEVFN ")\n" , pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func, pcidevs[i].vdevfn); -printf ("\t\t\t(opts msitranslate %d power_mgmt %d)\n" , pcidevs[i].msitranslate, pcidevs[i].power_mgmt); +printf ("\t\t\t(pci dev " PCI_BDF_VDEVFN ")\n" , + d_config->pcidevs[i].domain, d_config->pcidevs[i].bus, + d_config->pcidevs[i].dev, d_config->pcidevs[i].func, + d_config->pcidevs[i].vdevfn); +printf ("\t\t\t(opts msitranslate %d power_mgmt %d)\n" , + d_config->pcidevs[i].msitranslate, + d_config->pcidevs[i].power_mgmt);printf ("\t\t)\n" );printf ("\t)\n" ); } -for (i =0 ; i < num_vfbs; i++) { +for (i =0 ; i < d_config->num_vfbs; i++) {printf ("\t(device\n" );printf ("\t\t(vfb\n" ); -printf ("\t\t\t(backend_domid %d)\n" , vfbs[i].backend_domid); -printf ("\t\t\t(domid %d)\n" , vfbs[i].domid); -printf ("\t\t\t(devid %d)\n" , vfbs[i].devid); -printf ("\t\t\t(vnc %d)\n" , vfbs[i].vnc); -printf ("\t\t\t(vnclisten %s)\n" , vfbs[i].vnclisten); -printf ("\t\t\t(vncdisplay %d)\n" , vfbs[i].vncdisplay); -printf ("\t\t\t(vncunused %d)\n" , vfbs[i].vncunused); -printf ("\t\t\t(keymap %s)\n" , vfbs[i].keymap); -printf ("\t\t\t(sdl %d)\n" , vfbs[i].sdl); -printf ("\t\t\t(opengl %d)\n" , vfbs[i].opengl); -printf ("\t\t\t(display %s)\n" , vfbs[i].display); -printf ("\t\t\t(xauthority %s)\n" , vfbs[i].xauthority); +printf ("\t\t\t(backend_domid %d)\n" , d_config->vfbs[i].backend_domid); +printf ("\t\t\t(domid %d)\n" , d_config->vfbs[i].domid); +printf ("\t\t\t(devid %d)\n" , d_config->vfbs[i].devid); +printf ("\t\t\t(vnc %d)\n" , d_config->vfbs[i].vnc); +printf ("\t\t\t(vnclisten %s)\n" , d_config->vfbs[i].vnclisten); +printf ("\t\t\t(vncdisplay %d)\n" , d_config->vfbs[i].vncdisplay); +printf ("\t\t\t(vncunused %d)\n" , d_config->vfbs[i].vncunused); +printf ("\t\t\t(keymap %s)\n" , d_config->vfbs[i].keymap); +printf ("\t\t\t(sdl %d)\n" , d_config->vfbs[i].sdl); +printf ("\t\t\t(opengl %d)\n" , d_config->vfbs[i].opengl); +printf ("\t\t\t(display %s)\n" , d_config->vfbs[i].display); +printf ("\t\t\t(xauthority %s)\n" , d_config->vfbs[i].xauthority);printf ("\t\t)\n" );printf ("\t)\n" ); }
@@ -530,18 +537,6 @@ static void parse_config_data(const charconst char *configfile_data, int configfile_len, struct domain_config *d_config, - libxl_device_disk **disks, - int *num_disks, - libxl_device_nic **vifs, - int *num_vifs, - libxl_device_net2 **vif2s, - int *num_vif2s, - libxl_device_pci **pcidevs, - int *num_pcidevs, - libxl_device_vfb **vfbs, - int *num_vfbs, - libxl_device_vkb **vkbs, - int *num_vkbs, libxl_device_model_info *dm_info) { const char *buf;
@@ -710,72 +705,72 @@ static void parse_config_data(const char }if (!xlu_cfg_get_list (config,"disk" , &vbds,0 )) { - *num_disks =0 ; - *disks =NULL ; -while ((buf =xlu_cfg_get_listitem (vbds, *num_disks)) !=NULL ) { + d_config->num_disks =0 ; + d_config->disks =NULL ; +while ((buf =xlu_cfg_get_listitem (vbds, d_config->num_disks)) !=NULL ) {char *buf2 =strdup (buf);char *p, *p2; - *disks = (libxl_device_disk *)realloc (*disks,sizeof (libxl_device_disk) * ((*num_disks) +1 )); - (*disks)[*num_disks].backend_domid =0 ; - (*disks)[*num_disks].domid =0 ; - (*disks)[*num_disks].unpluggable =0 ; + d_config->disks = (libxl_device_disk *)realloc (d_config->disks,sizeof (libxl_device_disk) * (d_config->num_disks +1 )); + d_config->disks[d_config->num_disks].backend_domid =0 ; + d_config->disks[d_config->num_disks].domid =0 ; + d_config->disks[d_config->num_disks].unpluggable =0 ; p =strtok (buf2,",:" );while (*p ==' ' ) p++;if (!strcmp (p,"phy" )) { - (*disks)[*num_disks].phystype =PHYSTYPE_PHY ; + d_config->disks[d_config->num_disks].phystype =PHYSTYPE_PHY ; }else if (!strcmp (p,"file" )) { - (*disks)[*num_disks].phystype =PHYSTYPE_FILE ; + d_config->disks[d_config->num_disks].phystype =PHYSTYPE_FILE ; }else if (!strcmp (p,"tap" )) { p =strtok (NULL ,":" );if (!strcmp (p,"aio" )) { - (*disks)[*num_disks].phystype =PHYSTYPE_AIO ; + d_config->disks[d_config->num_disks].phystype =PHYSTYPE_AIO ; }else if (!strcmp (p,"vhd" )) { - (*disks)[*num_disks].phystype =PHYSTYPE_VHD ; + d_config->disks[d_config->num_disks].phystype =PHYSTYPE_VHD ; }else if (!strcmp (p,"qcow" )) { - (*disks)[*num_disks].phystype =PHYSTYPE_QCOW ; + d_config->disks[d_config->num_disks].phystype =PHYSTYPE_QCOW ; }else if (!strcmp (p,"qcow2" )) { - (*disks)[*num_disks].phystype =PHYSTYPE_QCOW2 ; + d_config->disks[d_config->num_disks].phystype =PHYSTYPE_QCOW2 ; } } p =strtok (NULL ,"," );while (*p ==' ' ) p++; - (*disks)[*num_disks].physpath=strdup (p); + d_config->disks[d_config->num_disks].physpath=strdup (p); p =strtok (NULL ,"," );while (*p ==' ' ) p++; p2 =strchr (p,':' );if (p2 ==NULL ) { - (*disks)[*num_disks].virtpath =strdup (p); - (*disks)[*num_disks].is_cdrom =0 ; - (*disks)[*num_disks].unpluggable =1 ; + d_config->disks[d_config->num_disks].virtpath =strdup (p); + d_config->disks[d_config->num_disks].is_cdrom =0 ; + d_config->disks[d_config->num_disks].unpluggable =1 ; }else { *p2 ='\0' ; - (*disks)[*num_disks].virtpath =strdup (p); + d_config->disks[d_config->num_disks].virtpath =strdup (p);if (!strcmp (p2 +1 ,"cdrom" )) { - (*disks)[*num_disks].is_cdrom =1 ; - (*disks)[*num_disks].unpluggable =1 ; + d_config->disks[d_config->num_disks].is_cdrom =1 ; + d_config->disks[d_config->num_disks].unpluggable =1 ; }else - (*disks)[*num_disks].is_cdrom =0 ; + d_config->disks[d_config->num_disks].is_cdrom =0 ; } p =strtok (NULL ,"," );while (*p ==' ' ) p++; - (*disks)[*num_disks].readwrite = (p[0 ] =='w' ) ?1 :0 ; -free (buf2); - *num_disks = (*num_disks) +1 ; + d_config->disks[d_config->num_disks].readwrite = (p[0 ] =='w' ) ?1 :0 ; +free (buf2); + d_config->num_disks = d_config->num_disks +1 ; } }if (!xlu_cfg_get_list (config,"vif" , &nics,0 )) { - *num_vifs =0 ; - *vifs =NULL ; -while ((buf =xlu_cfg_get_listitem (nics, *num_vifs)) !=NULL ) { + d_config->num_vifs =0 ; + d_config->vifs =NULL ; +while ((buf =xlu_cfg_get_listitem (nics, d_config->num_vifs)) !=NULL ) {char *buf2 =strdup (buf);char *p, *p2; - *vifs = (libxl_device_nic *)realloc (*vifs,sizeof (libxl_device_nic) * ((*num_vifs) +1 )); -init_nic_info ((*vifs) + (*num_vifs), (*num_vifs)); + d_config->vifs = (libxl_device_nic *)realloc (d_config->vifs,sizeof (libxl_device_nic) * (d_config->num_vifs+1 )); +init_nic_info (d_config->vifs + d_config->num_vifs, d_config->num_vifs); p =strtok (buf2,"," );if (!p) goto skip;
@@ -786,39 +781,39 @@ static void parse_config_data(const charbreak ; *p2 ='\0' ;if (!strcmp (p,"model" )) { - (*vifs)[*num_vifs].model =strdup (p2 +1 ); + d_config->vifs[d_config->num_vifs].model =strdup (p2 +1 ); }else if (!strcmp (p,"mac" )) {char *p3 = p2 +1 ; *(p3 +2 ) ='\0' ; - (*vifs)[*num_vifs].mac[0 ] =strtol (p3,NULL ,16 ); - p3 = p3 +3 ; - *(p3 +2 ) ='\0' ; - (*vifs)[*num_vifs].mac[1 ] =strtol (p3,NULL ,16 ); - p3 = p3 +3 ; - *(p3 +2 ) ='\0' ; - (*vifs)[*num_vifs].mac[2 ] =strtol (p3,NULL ,16 ); - p3 = p3 +3 ; - *(p3 +2 ) ='\0' ; - (*vifs)[*num_vifs].mac[3 ] =strtol (p3,NULL ,16 ); - p3 = p3 +3 ; - *(p3 +2 ) ='\0' ; - (*vifs)[*num_vifs].mac[4 ] =strtol (p3,NULL ,16 ); - p3 = p3 +3 ; - *(p3 +2 ) ='\0' ; - (*vifs)[*num_vifs].mac[5 ] =strtol (p3,NULL ,16 ); + d_config->vifs[d_config->num_vifs].mac[0 ] =strtol (p3,NULL ,16 ); + p3 = p3 +3 ; + *(p3 +2 ) ='\0' ; + d_config->vifs[d_config->num_vifs].mac[1 ] =strtol (p3,NULL ,16 ); + p3 = p3 +3 ; + *(p3 +2 ) ='\0' ; + d_config->vifs[d_config->num_vifs].mac[2 ] =strtol (p3,NULL ,16 ); + p3 = p3 +3 ; + *(p3 +2 ) ='\0' ; + d_config->vifs[d_config->num_vifs].mac[3 ] =strtol (p3,NULL ,16 ); + p3 = p3 +3 ; + *(p3 +2 ) ='\0' ; + d_config->vifs[d_config->num_vifs].mac[4 ] =strtol (p3,NULL ,16 ); + p3 = p3 +3 ; + *(p3 +2 ) ='\0' ; + d_config->vifs[d_config->num_vifs].mac[5 ] =strtol (p3,NULL ,16 ); }else if (!strcmp (p,"bridge" )) { - (*vifs)[*num_vifs].bridge =strdup (p2 +1 ); + d_config->vifs[d_config->num_vifs].bridge =strdup (p2 +1 ); }else if (!strcmp (p,"type" )) {if (!strcmp (p2 +1 ,"ioemu" )) - (*vifs)[*num_vifs].nictype =NICTYPE_IOEMU ; + d_config->vifs[d_config->num_vifs].nictype =NICTYPE_IOEMU ;else - (*vifs)[*num_vifs].nictype =NICTYPE_VIF ; + d_config->vifs[d_config->num_vifs].nictype =NICTYPE_VIF ; }else if (!strcmp (p,"ip" )) { -inet_pton (AF_INET , p2 +1 , &((*vifs)[*num_vifs].ip)); +inet_pton (AF_INET , p2 +1 , &d_config->vifs[d_config->num_vifs].ip); }else if (!strcmp (p,"script" )) { - (*vifs)[*num_vifs].script =strdup (p2 +1 ); + d_config->vifs[d_config->num_vifs].script =strdup (p2 +1 ); }else if (!strcmp (p,"vifname" )) { - (*vifs)[*num_vifs].ifname =strdup (p2 +1 ); + d_config->vifs[d_config->num_vifs].ifname =strdup (p2 +1 ); }else if (!strcmp (p,"rate" )) {fprintf (stderr,"the rate parameter for vifs is currently not supported\n" ); }else if (!strcmp (p,"accel" )) {
@@ -827,63 +822,63 @@ static void parse_config_data(const char }while ((p =strtok (NULL ,"," )) !=NULL ); skip:free (buf2); - *num_vifs = (*num_vifs) +1 ; + d_config->num_vifs = d_config->num_vifs +1 ; } }if (!xlu_cfg_get_list (config,"vif2" , &net2s,0 )) { - *num_vif2s =0 ; - *vif2s =NULL ; -while ((buf =xlu_cfg_get_listitem (net2s, *num_vif2s))) { + d_config->num_vif2s =0 ; + d_config->vif2s =NULL ; +while ((buf =xlu_cfg_get_listitem (net2s, d_config->num_vif2s))) {char *buf2 =strdup (buf);char *p; - *vif2s =realloc (*vif2s,sizeof (libxl_device_net2) * (*num_vif2s +1 )); -init_net2_info (*vif2s + *num_vif2s, *num_vif2s); + d_config->vif2s =realloc (d_config->vif2s,sizeof (libxl_device_net2) * (d_config->num_vif2s +1 )); +init_net2_info (d_config->vif2s + d_config->num_vif2s, d_config->num_vif2s);for (p =strtok (buf2,"," ); p; p =strtok (buf2,"," )) {while (isblank (*p)) p++;if (!strncmp ("front_mac=" , p,10 )) { -libxl_strtomac (p +10 , (*vif2s)[*num_vif2s].front_mac); +libxl_strtomac (p +10 , d_config->vif2s[d_config->num_vif2s].front_mac); }else if (!strncmp ("back_mac=" , p,9 )) { -libxl_strtomac (p +9 , (*vif2s)[*num_vif2s].back_mac); +libxl_strtomac (p +9 , d_config->vif2s[d_config->num_vif2s].back_mac); }else if (!strncmp ("backend=" , p,8 )) { -domain_qualifier_to_domid (p +8 , &((*vif2s)[*num_vif2s].backend_domid),0 ); +domain_qualifier_to_domid (p +8 , &d_config->vif2s[d_config->num_vif2s].backend_domid,0 ); }else if (!strncmp ("trusted=" , p,8 )) { - (*vif2s)[*num_vif2s].trusted = (*(p +8 ) =='1' ); + d_config->vif2s[d_config->num_vif2s].trusted = (*(p +8 ) =='1' ); }else if (!strncmp ("back_trusted=" , p,13 )) { - (*vif2s)[*num_vif2s].back_trusted = (*(p +13 ) =='1' ); + d_config->vif2s[d_config->num_vif2s].back_trusted = (*(p +13 ) =='1' ); }else if (!strncmp ("bridge=" , p,7 )) { - (*vif2s)[*num_vif2s].bridge =strdup (p +13 ); + d_config->vif2s[d_config->num_vif2s].bridge =strdup (p +13 ); }else if (!strncmp ("filter_mac=" , p,11 )) { - (*vif2s)[*num_vif2s].filter_mac = (*(p +11 ) =='1' ); + d_config->vif2s[d_config->num_vif2s].filter_mac = (*(p +11 ) =='1' ); }else if (!strncmp ("front_filter_mac=" , p,17 )) { - (*vif2s)[*num_vif2s].front_filter_mac = (*(p +17 ) =='1' ); + d_config->vif2s[d_config->num_vif2s].front_filter_mac = (*(p +17 ) =='1' ); }else if (!strncmp ("pdev=" , p,5 )) { - (*vif2s)[*num_vif2s].pdev =strtoul (p +5 ,NULL ,10 ); + d_config->vif2s[d_config->num_vif2s].pdev =strtoul (p +5 ,NULL ,10 ); }else if (!strncmp ("max_bypasses=" , p,13 )) { - (*vif2s)[*num_vif2s].max_bypasses =strtoul (p +13 ,NULL ,10 ); - } - } -free (buf2); - ++(*num_vif2s); + d_config->vif2s[d_config->num_vif2s].max_bypasses =strtoul (p +13 ,NULL ,10 ); + } + } +free (buf2); + ++d_config->num_vif2s; } }if (!xlu_cfg_get_list (config,"vfb" , &cvfbs,0 )) { - *num_vfbs =0 ; - *num_vkbs =0 ; - *vfbs =NULL ; - *vkbs =NULL ; -while ((buf =xlu_cfg_get_listitem (cvfbs, *num_vfbs)) !=NULL ) { + d_config->num_vfbs =0 ; + d_config->num_vkbs =0 ; + d_config->vfbs =NULL ; + d_config->vkbs =NULL ; +while ((buf =xlu_cfg_get_listitem (cvfbs, d_config->num_vfbs)) !=NULL ) {char *buf2 =strdup (buf);char *p, *p2; - *vfbs = (libxl_device_vfb *)realloc (*vfbs,sizeof (libxl_device_vfb) * ((*num_vfbs) +1 )); -init_vfb_info ((*vfbs) + (*num_vfbs), (*num_vfbs)); - - *vkbs = (libxl_device_vkb *)realloc (*vkbs,sizeof (libxl_device_vkb) * ((*num_vkbs) +1 )); -init_vkb_info ((*vkbs) + (*num_vkbs), (*num_vkbs)); + d_config->vfbs = (libxl_device_vfb *)realloc (d_config->vfbs,sizeof (libxl_device_vfb) * (d_config->num_vfbs +1 )); +init_vfb_info (d_config->vfbs + d_config->num_vfbs, d_config->num_vfbs); + + d_config->vkbs = (libxl_device_vkb *)realloc (d_config->vkbs,sizeof (libxl_device_vkb) * (d_config->num_vkbs +1 )); +init_vkb_info (d_config->vkbs + d_config->num_vkbs, d_config->num_vkbs); p =strtok (buf2,"," );if (!p)
@@ -895,31 +890,31 @@ skip:break ; *p2 ='\0' ;if (!strcmp (p,"vnc" )) { - (*vfbs)[*num_vfbs].vnc =atoi (p2 +1 ); + d_config->vfbs[d_config->num_vfbs].vnc =atoi (p2 +1 ); }else if (!strcmp (p,"vnclisten" )) { - (*vfbs)[*num_vfbs].vnclisten =strdup (p2 +1 ); + d_config->vfbs[d_config->num_vfbs].vnclisten =strdup (p2 +1 ); }else if (!strcmp (p,"vncpasswd" )) { - (*vfbs)[*num_vfbs].vncpasswd =strdup (p2 +1 ); + d_config->vfbs[d_config->num_vfbs].vncpasswd =strdup (p2 +1 ); }else if (!strcmp (p,"vncdisplay" )) { - (*vfbs)[*num_vfbs].vncdisplay =atoi (p2 +1 ); + d_config->vfbs[d_config->num_vfbs].vncdisplay =atoi (p2 +1 ); }else if (!strcmp (p,"vncunused" )) { - (*vfbs)[*num_vfbs].vncunused =atoi (p2 +1 ); + d_config->vfbs[d_config->num_vfbs].vncunused =atoi (p2 +1 ); }else if (!strcmp (p,"keymap" )) { - (*vfbs)[*num_vfbs].keymap =strdup (p2 +1 ); + d_config->vfbs[d_config->num_vfbs].keymap =strdup (p2 +1 ); }else if (!strcmp (p,"sdl" )) { - (*vfbs)[*num_vfbs].sdl =atoi (p2 +1 ); + d_config->vfbs[d_config->num_vfbs].sdl =atoi (p2 +1 ); }else if (!strcmp (p,"opengl" )) { - (*vfbs)[*num_vfbs].opengl =atoi (p2 +1 ); + d_config->vfbs[d_config->num_vfbs].opengl =atoi (p2 +1 ); }else if (!strcmp (p,"display" )) { - (*vfbs)[*num_vfbs].display =strdup (p2 +1 ); + d_config->vfbs[d_config->num_vfbs].display =strdup (p2 +1 ); }else if (!strcmp (p,"xauthority" )) { - (*vfbs)[*num_vfbs].xauthority =strdup (p2 +1 ); + d_config->vfbs[d_config->num_vfbs].xauthority =strdup (p2 +1 ); } }while ((p =strtok (NULL ,"," )) !=NULL ); skip_vfb:free (buf2); - *num_vfbs = (*num_vfbs) +1 ; - *num_vkbs = (*num_vkbs) +1 ; + d_config->num_vfbs = d_config->num_vfbs +1 ; + d_config->num_vkbs = d_config->num_vkbs +1 ; } }
@@ -930,14 +925,14 @@ skip_vfb: pci_power_mgmt = l;if (!xlu_cfg_get_list (config,"pci" , &pcis,0 )) { - *num_pcidevs =0 ; - *pcidevs =NULL ; -while ((buf =xlu_cfg_get_listitem (pcis, *num_pcidevs)) !=NULL ) { + d_config->num_pcidevs =0 ; + d_config->pcidevs =NULL ; +while ((buf =xlu_cfg_get_listitem (pcis, d_config->num_pcidevs)) !=NULL ) {unsigned int domain =0 , bus =0 , dev =0 , func =0 , vdevfn =0 ;char *buf2 =strdup (buf);char *p; - *pcidevs = (libxl_device_pci *)realloc (*pcidevs,sizeof (libxl_device_pci) * ((*num_pcidevs) +1 )); -memset (*pcidevs + *num_pcidevs,0x00 ,sizeof (libxl_device_pci)); + d_config->pcidevs = (libxl_device_pci *)realloc (d_config->pcidevs,sizeof (libxl_device_pci) * (d_config->num_pcidevs +1 )); +memset (d_config->pcidevs + d_config->num_pcidevs,0x00 ,sizeof (libxl_device_pci)); p =strtok (buf2,"," );if (!p) goto skip_pci;
@@ -948,21 +943,21 @@ skip_vfb: goto skip_pci; } } -libxl_device_pci_init (*pcidevs + *num_pcidevs, domain, bus, dev, func, vdevfn); - (*pcidevs)[*num_pcidevs].msitranslate = pci_msitranslate; - (*pcidevs)[*num_pcidevs].power_mgmt = pci_power_mgmt; +libxl_device_pci_init (d_config->pcidevs + d_config->num_pcidevs, domain, bus, dev, func, vdevfn); + d_config->pcidevs[d_config->num_pcidevs].msitranslate = pci_msitranslate; + d_config->pcidevs[d_config->num_pcidevs].power_mgmt = pci_power_mgmt;while ((p =strtok (NULL ,",=" )) !=NULL ) {while (*p ==' ' ) p++;if (!strcmp (p,"msitranslate" )) { p =strtok (NULL ,",=" ); - (*pcidevs)[*num_pcidevs].msitranslate =atoi (p); + d_config->pcidevs[d_config->num_pcidevs].msitranslate =atoi (p); }else if (!strcmp (p,"power_mgmt" )) { p =strtok (NULL ,",=" ); - (*pcidevs)[*num_pcidevs].power_mgmt =atoi (p); - } - } - *num_pcidevs = (*num_pcidevs) +1 ; + d_config->pcidevs[d_config->num_pcidevs].power_mgmt =atoi (p); + } + } + d_config->num_pcidevs = d_config->num_pcidevs +1 ; skip_pci:free (buf2); }
@@ -1199,12 +1194,6 @@ static int create_domain(struct domain_clibxl_domain_build_state state;libxl_device_model_info dm_info; -libxl_device_disk *disks =NULL ; -libxl_device_nic *vifs =NULL ; -libxl_device_net2 *vif2s =NULL ; -libxl_device_pci *pcidevs =NULL ; -libxl_device_vfb *vfbs =NULL ; -libxl_device_vkb *vkbs =NULL ;libxl_device_console console;int debug = dom_info->debug;
@@ -1216,7 +1205,6 @@ static int create_domain(struct domain_cint migrate_fd = dom_info->migrate_fd;char **migration_domname_r = dom_info->migration_domname_r; -int num_disks =0 , num_vifs =0 , num_vif2s =0 , num_pcidevs =0 , num_vfbs =0 , num_vkbs =0 ;int i, fd;int need_daemon =1 ;int ret, rc;
@@ -1227,7 +1215,7 @@ static int create_domain(struct domain_cint restore_fd =-1 ;struct save_file_header hdr; - memset(&d_config, 0x00, sizeof(d_config); +memset (&d_config,0x00 ,sizeof (d_config));memset (&dm_info,0x00 ,sizeof (dm_info));if (restore_file) {
@@ -1330,7 +1318,7 @@ static int create_domain(struct domain_cif (!dom_info->quiet)printf ("Parsing config file %s\n" , config_file); -parse_config_data (config_file, config_data, config_len, &d_config, &disks, &num_disks, &vifs, &num_vifs, &vif2s, &num_vif2s, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs, &dm_info); +parse_config_data (config_file, config_data, config_len, &d_config, &dm_info);if (dom_info->dryrun)return 0 ;
@@ -1350,7 +1338,7 @@ static int create_domain(struct domain_c }if (debug) -printf_info (-1 , &d_config, disks, num_disks, vifs, num_vifs, pcidevs, num_pcidevs, vfbs, num_vfbs, vkbs, num_vkbs, &dm_info); +printf_info (-1 , &d_config, &dm_info); start: domid =0 ;
@@ -1382,7 +1370,7 @@ start:*/ dom_info->console_autoconnect =0 ; - ret =libxl_run_bootloader (&ctx, &d_config.b_info, num_disks >0 ? &disks[0 ] :NULL , domid); + ret =libxl_run_bootloader (&ctx, &d_config.b_info, d_config.num_disks >0 ? &d_config.disks[0 ] :NULL , domid);if (ret) {fprintf (stderr,"failed to run bootloader: %d\n" , ret); goto error_out;
@@ -1404,18 +1392,18 @@ start: goto error_out; } -for (i =0 ; i < num_disks; i++) { - disks[i].domid = domid; - ret =libxl_device_disk_add (&ctx, domid, &disks[i]); +for (i =0 ; i < d_config.num_disks; i++) { + d_config.disks[i].domid = domid; + ret =libxl_device_disk_add (&ctx, domid, &d_config.disks[i]);if (ret) {fprintf (stderr,"cannot add disk %d to domain: %d\n" , i, ret); ret =ERROR_FAIL ; goto error_out; } } -for (i =0 ; i < num_vifs; i++) { - vifs[i].domid = domid; - ret =libxl_device_nic_add (&ctx, domid, &vifs[i]); +for (i =0 ; i < d_config.num_vifs; i++) { + d_config.vifs[i].domid = domid; + ret =libxl_device_nic_add (&ctx, domid, &d_config.vifs[i]);if (ret) {fprintf (stderr,"cannot add nic %d to domain: %d\n" , i, ret); ret =ERROR_FAIL ;
@@ -1423,9 +1411,9 @@ start: } }if (!d_config.c_info.hvm) { -for (i =0 ; i < num_vif2s; i++) { - vif2s[i].domid = domid; - ret =libxl_device_net2_add (&ctx, domid, &(vif2s[i])); +for (i =0 ; i < d_config.num_vif2s; i++) { + d_config.vif2s[i].domid = domid; + ret =libxl_device_net2_add (&ctx, domid, &d_config.vif2s[i]);if (ret) {fprintf (stderr,"cannot add net2 %d to domain: %d\n" , i, ret); ret =ERROR_FAIL ;
@@ -1435,28 +1423,30 @@ start: }if (d_config.c_info.hvm) { dm_info.domid = domid; -MUST (libxl_create_device_model (&ctx, &dm_info, disks, num_disks, - vifs, num_vifs, &dm_starting) ); - }else { -for (i =0 ; i < num_vfbs; i++) { - vfbs[i].domid = domid; -libxl_device_vfb_add (&ctx, domid, &vfbs[i]); - vkbs[i].domid = domid; -libxl_device_vkb_add (&ctx, domid, &vkbs[i]); +MUST (libxl_create_device_model (&ctx, &dm_info, + d_config.disks, d_config.num_disks, + d_config.vifs, d_config.num_vifs, + &dm_starting) ); + }else { +for (i =0 ; i < d_config.num_vfbs; i++) { + d_config.vfbs[i].domid = domid; +libxl_device_vfb_add (&ctx, domid, &d_config.vfbs[i]); + d_config.vkbs[i].domid = domid; +libxl_device_vkb_add (&ctx, domid, &d_config.vkbs[i]); }init_console_info (&console,0 , &state); console.domid = domid; -if (num_vfbs) +if (d_config.num_vfbs) console.constype =CONSTYPE_IOEMU ;libxl_device_console_add (&ctx, domid, &console); -if (num_vfbs) -libxl_create_xenpv_qemu (&ctx, vfbs,1 , &console, &dm_starting); +if (d_config.num_vfbs) +libxl_create_xenpv_qemu (&ctx, d_config.vfbs,1 , &console, &dm_starting); }if (dm_starting)MUST (libxl_confirm_device_model_startup (&ctx, dm_starting) ); -for (i =0 ; i < num_pcidevs; i++) -libxl_device_pci_add (&ctx, domid, &pcidevs[i]); +for (i =0 ; i < d_config.num_pcidevs; i++) +libxl_device_pci_add (&ctx, domid, &d_config.pcidevs[i]);if (!paused)libxl_domain_unpause (&ctx, domid);
@@ -1521,9 +1511,9 @@ start: }LOG ("Waiting for domain %s (domid %d) to die [pid %ld]" , d_config.c_info.name, domid, (long )getpid ()); - w1 = (libxl_waiter *)xmalloc (sizeof (libxl_waiter) * num_disks); + w1 = (libxl_waiter *)xmalloc (sizeof (libxl_waiter) * d_config.num_disks); w2 = (libxl_waiter *)xmalloc (sizeof (libxl_waiter)); -libxl_wait_for_disk_ejects (&ctx, domid, disks, num_disks, w1); +libxl_wait_for_disk_ejects (&ctx, domid, d_config.disks, d_config.num_disks, w1);libxl_wait_for_domain_death (&ctx, domid, w2);libxl_get_wait_fd (&ctx, &fd);while (1 ) {
@@ -2086,14 +2076,7 @@ void list_domains_details(void)char *config_file;uint8_t *data;int nb_domain, i, len, rc; -int num_disks =0 , num_vifs =0 , num_vif2s =0 , num_pcidevs =0 , num_vfbs =0 , num_vkbs =0 ;libxl_device_model_info dm_info; -libxl_device_disk *disks =NULL ; -libxl_device_nic *vifs =NULL ; -libxl_device_net2 *vif2s =NULL ; -libxl_device_pci *pcidevs =NULL ; -libxl_device_vfb *vfbs =NULL ; -libxl_device_vkb *vkbs =NULL ; info =libxl_list_domain (&ctx, &nb_domain);
@@ -2106,9 +2089,9 @@ void list_domains_details(void)if (rc)continue ;CHK_ERRNO (asprintf (&config_file,"<domid %d data>" , info[i].domid)); - memset(&d_config, 0x00, sizeof(d_config); -parse_config_data (config_file, (char *)data, len, &d_config, &disks, &num_disks, &vifs, &num_vifs, &vif2s, &num_vif2s, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs, &dm_info); -printf_info (info[i].domid, &d_config, disks, num_disks, vifs, num_vifs, pcidevs, num_pcidevs, vfbs, num_vfbs, vkbs, num_vkbs, &dm_info); +memset (&d_config,0x00 ,sizeof (d_config)); +parse_config_data (config_file, (char *)data, len, &d_config, &dm_info); +printf_info (info[i].domid, &d_config, &dm_info);free (data);free (config_file); }
PATCH 1/1 xl: simplify configuration parsing with local variables
In reply to Ian Campbell# HG changeset patch
# User Ian Campbell <[email protected]> # Date 1280225499 -3600
# Node ID 06c6310a3c7b70196bd532dc3eec2300b5abdd5d # Parent d06f5e9633d3390cf5ea451fe39e48ca0b7bdbd4
xl: simplify configuration parsing with local variables
Replace repeated patterns of "d_config->THING[d_config->num_THING]" with a single local variable.
tools/libxl/xl_cmdimpl.c +106 -83
@@ -708,58 +708,63 @@ static void parse_config_data(const char d_config->num_disks =0 ; d_config->disks =NULL ;while ((buf =xlu_cfg_get_listitem (vbds, d_config->num_disks)) !=NULL ) { +libxl_device_disk *disk;char *buf2 =strdup (buf);char *p, *p2; + d_config->disks = (libxl_device_disk *)realloc (d_config->disks,sizeof (libxl_device_disk) * (d_config->num_disks +1 )); - d_config->disks[d_config->num_disks].backend_domid =0 ; - d_config->disks[d_config->num_disks].domid =0 ; - d_config->disks[d_config->num_disks].unpluggable =0 ; + disk = d_config->disks + d_config->num_disks; + + disk->backend_domid =0 ; + disk->domid =0 ; + disk->unpluggable =0 ; + p =strtok (buf2,",:" );while (*p ==' ' ) p++;if (!strcmp (p,"phy" )) { - d_config->disks[d_config->num_disks].phystype =PHYSTYPE_PHY ; + disk->phystype =PHYSTYPE_PHY ; }else if (!strcmp (p,"file" )) { - d_config->disks[d_config->num_disks].phystype =PHYSTYPE_FILE ; + disk->phystype =PHYSTYPE_FILE ; }else if (!strcmp (p,"tap" )) { p =strtok (NULL ,":" );if (!strcmp (p,"aio" )) { - d_config->disks[d_config->num_disks].phystype =PHYSTYPE_AIO ; + disk->phystype =PHYSTYPE_AIO ; }else if (!strcmp (p,"vhd" )) { - d_config->disks[d_config->num_disks].phystype =PHYSTYPE_VHD ; + disk->phystype =PHYSTYPE_VHD ; }else if (!strcmp (p,"qcow" )) { - d_config->disks[d_config->num_disks].phystype =PHYSTYPE_QCOW ; + disk->phystype =PHYSTYPE_QCOW ; }else if (!strcmp (p,"qcow2" )) { - d_config->disks[d_config->num_disks].phystype =PHYSTYPE_QCOW2 ; + disk->phystype =PHYSTYPE_QCOW2 ; } } p =strtok (NULL ,"," );while (*p ==' ' ) p++; - d_config->disks[d_config->num_disks].physpath=strdup (p); + disk->physpath=strdup (p); p =strtok (NULL ,"," );while (*p ==' ' ) p++; p2 =strchr (p,':' );if (p2 ==NULL ) { - d_config->disks[d_config->num_disks].virtpath =strdup (p); - d_config->disks[d_config->num_disks].is_cdrom =0 ; - d_config->disks[d_config->num_disks].unpluggable =1 ; + disk->virtpath =strdup (p); + disk->is_cdrom =0 ; + disk->unpluggable =1 ; }else { *p2 ='\0' ; - d_config->disks[d_config->num_disks].virtpath =strdup (p); + disk->virtpath =strdup (p);if (!strcmp (p2 +1 ,"cdrom" )) { - d_config->disks[d_config->num_disks].is_cdrom =1 ; - d_config->disks[d_config->num_disks].unpluggable =1 ; + disk->is_cdrom =1 ; + disk->unpluggable =1 ; }else - d_config->disks[d_config->num_disks].is_cdrom =0 ; + disk->is_cdrom =0 ; } p =strtok (NULL ,"," );while (*p ==' ' ) p++; - d_config->disks[d_config->num_disks].readwrite = (p[0 ] =='w' ) ?1 :0 ; -free (buf2); - d_config->num_disks = d_config->num_disks +1 ; + disk->readwrite = (p[0 ] =='w' ) ?1 :0 ; +free (buf2); + d_config->num_disks++; } }
@@ -767,10 +772,14 @@ static void parse_config_data(const char d_config->num_vifs =0 ; d_config->vifs =NULL ;while ((buf =xlu_cfg_get_listitem (nics, d_config->num_vifs)) !=NULL ) { +libxl_device_nic *nic;char *buf2 =strdup (buf);char *p, *p2; + d_config->vifs = (libxl_device_nic *)realloc (d_config->vifs,sizeof (libxl_device_nic) * (d_config->num_vifs+1 )); -init_nic_info (d_config->vifs + d_config->num_vifs, d_config->num_vifs); + nic = d_config->vifs + d_config->num_vifs; +init_nic_info (nic, d_config->num_vifs); + p =strtok (buf2,"," );if (!p) goto skip;
@@ -781,39 +790,39 @@ static void parse_config_data(const charbreak ; *p2 ='\0' ;if (!strcmp (p,"model" )) { - d_config->vifs[d_config->num_vifs].model =strdup (p2 +1 ); + nic->model =strdup (p2 +1 ); }else if (!strcmp (p,"mac" )) {char *p3 = p2 +1 ; *(p3 +2 ) ='\0' ; - d_config->vifs[d_config->num_vifs].mac[0 ] =strtol (p3,NULL ,16 ); - p3 = p3 +3 ; - *(p3 +2 ) ='\0' ; - d_config->vifs[d_config->num_vifs].mac[1 ] =strtol (p3,NULL ,16 ); - p3 = p3 +3 ; - *(p3 +2 ) ='\0' ; - d_config->vifs[d_config->num_vifs].mac[2 ] =strtol (p3,NULL ,16 ); - p3 = p3 +3 ; - *(p3 +2 ) ='\0' ; - d_config->vifs[d_config->num_vifs].mac[3 ] =strtol (p3,NULL ,16 ); - p3 = p3 +3 ; - *(p3 +2 ) ='\0' ; - d_config->vifs[d_config->num_vifs].mac[4 ] =strtol (p3,NULL ,16 ); - p3 = p3 +3 ; - *(p3 +2 ) ='\0' ; - d_config->vifs[d_config->num_vifs].mac[5 ] =strtol (p3,NULL ,16 ); + nic->mac[0 ] =strtol (p3,NULL ,16 ); + p3 = p3 +3 ; + *(p3 +2 ) ='\0' ; + nic->mac[1 ] =strtol (p3,NULL ,16 ); + p3 = p3 +3 ; + *(p3 +2 ) ='\0' ; + nic->mac[2 ] =strtol (p3,NULL ,16 ); + p3 = p3 +3 ; + *(p3 +2 ) ='\0' ; + nic->mac[3 ] =strtol (p3,NULL ,16 ); + p3 = p3 +3 ; + *(p3 +2 ) ='\0' ; + nic->mac[4 ] =strtol (p3,NULL ,16 ); + p3 = p3 +3 ; + *(p3 +2 ) ='\0' ; + nic->mac[5 ] =strtol (p3,NULL ,16 ); }else if (!strcmp (p,"bridge" )) { - d_config->vifs[d_config->num_vifs].bridge =strdup (p2 +1 ); + nic->bridge =strdup (p2 +1 ); }else if (!strcmp (p,"type" )) {if (!strcmp (p2 +1 ,"ioemu" )) - d_config->vifs[d_config->num_vifs].nictype =NICTYPE_IOEMU ; + nic->nictype =NICTYPE_IOEMU ;else - d_config->vifs[d_config->num_vifs].nictype =NICTYPE_VIF ; + nic->nictype =NICTYPE_VIF ; }else if (!strcmp (p,"ip" )) { -inet_pton (AF_INET , p2 +1 , &d_config->vifs[d_config->num_vifs].ip); +inet_pton (AF_INET , p2 +1 , &nic->ip); }else if (!strcmp (p,"script" )) { - d_config->vifs[d_config->num_vifs].script =strdup (p2 +1 ); + nic->script =strdup (p2 +1 ); }else if (!strcmp (p,"vifname" )) { - d_config->vifs[d_config->num_vifs].ifname =strdup (p2 +1 ); + nic->ifname =strdup (p2 +1 ); }else if (!strcmp (p,"rate" )) {fprintf (stderr,"the rate parameter for vifs is currently not supported\n" ); }else if (!strcmp (p,"accel" )) {
@@ -822,7 +831,7 @@ static void parse_config_data(const char }while ((p =strtok (NULL ,"," )) !=NULL ); skip:free (buf2); - d_config->num_vifs = d_config->num_vifs +1 ; + d_config->num_vifs++; } }
@@ -830,39 +839,42 @@ skip: d_config->num_vif2s =0 ; d_config->vif2s =NULL ;while ((buf =xlu_cfg_get_listitem (net2s, d_config->num_vif2s))) { +libxl_device_net2 *net2;char *buf2 =strdup (buf);char *p; d_config->vif2s =realloc (d_config->vif2s,sizeof (libxl_device_net2) * (d_config->num_vif2s +1 )); -init_net2_info (d_config->vif2s + d_config->num_vif2s, d_config->num_vif2s); + net2 = d_config->vif2s + d_config->num_vif2s; + +init_net2_info (net2, d_config->num_vif2s);for (p =strtok (buf2,"," ); p; p =strtok (buf2,"," )) {while (isblank (*p)) p++;if (!strncmp ("front_mac=" , p,10 )) { -libxl_strtomac (p +10 , d_config->vif2s[d_config->num_vif2s].front_mac); +libxl_strtomac (p +10 , net2->front_mac); }else if (!strncmp ("back_mac=" , p,9 )) { -libxl_strtomac (p +9 , d_config->vif2s[d_config->num_vif2s].back_mac); +libxl_strtomac (p +9 , net2->back_mac); }else if (!strncmp ("backend=" , p,8 )) { -domain_qualifier_to_domid (p +8 , &d_config->vif2s[d_config->num_vif2s].backend_domid,0 ); +domain_qualifier_to_domid (p +8 , &net2->backend_domid,0 ); }else if (!strncmp ("trusted=" , p,8 )) { - d_config->vif2s[d_config->num_vif2s].trusted = (*(p +8 ) =='1' ); + net2->trusted = (*(p +8 ) =='1' ); }else if (!strncmp ("back_trusted=" , p,13 )) { - d_config->vif2s[d_config->num_vif2s].back_trusted = (*(p +13 ) =='1' ); + net2->back_trusted = (*(p +13 ) =='1' ); }else if (!strncmp ("bridge=" , p,7 )) { - d_config->vif2s[d_config->num_vif2s].bridge =strdup (p +13 ); + net2->bridge =strdup (p +13 ); }else if (!strncmp ("filter_mac=" , p,11 )) { - d_config->vif2s[d_config->num_vif2s].filter_mac = (*(p +11 ) =='1' ); + net2->filter_mac = (*(p +11 ) =='1' ); }else if (!strncmp ("front_filter_mac=" , p,17 )) { - d_config->vif2s[d_config->num_vif2s].front_filter_mac = (*(p +17 ) =='1' ); + net2->front_filter_mac = (*(p +17 ) =='1' ); }else if (!strncmp ("pdev=" , p,5 )) { - d_config->vif2s[d_config->num_vif2s].pdev =strtoul (p +5 ,NULL ,10 ); + net2->pdev =strtoul (p +5 ,NULL ,10 ); }else if (!strncmp ("max_bypasses=" , p,13 )) { - d_config->vif2s[d_config->num_vif2s].max_bypasses =strtoul (p +13 ,NULL ,10 ); - } - } -free (buf2); - ++d_config->num_vif2s; + net2->max_bypasses =strtoul (p +13 ,NULL ,10 ); + } + } +free (buf2); + d_config->num_vif2s++; } }
@@ -872,13 +884,19 @@ skip: d_config->vfbs =NULL ; d_config->vkbs =NULL ;while ((buf =xlu_cfg_get_listitem (cvfbs, d_config->num_vfbs)) !=NULL ) { +libxl_device_vfb *vfb; +libxl_device_vkb *vkb; +char *buf2 =strdup (buf);char *p, *p2; + d_config->vfbs = (libxl_device_vfb *)realloc (d_config->vfbs,sizeof (libxl_device_vfb) * (d_config->num_vfbs +1 )); -init_vfb_info (d_config->vfbs + d_config->num_vfbs, d_config->num_vfbs); + vfb = d_config->vfbs + d_config->num_vfbs; +init_vfb_info (vfb, d_config->num_vfbs); d_config->vkbs = (libxl_device_vkb *)realloc (d_config->vkbs,sizeof (libxl_device_vkb) * (d_config->num_vkbs +1 )); -init_vkb_info (d_config->vkbs + d_config->num_vkbs, d_config->num_vkbs); + vkb = d_config->vkbs + d_config->num_vkbs; +init_vkb_info (vkb, d_config->num_vkbs); p =strtok (buf2,"," );if (!p)
@@ -890,31 +908,31 @@ skip:break ; *p2 ='\0' ;if (!strcmp (p,"vnc" )) { - d_config->vfbs[d_config->num_vfbs].vnc =atoi (p2 +1 ); + vfb->vnc =atoi (p2 +1 ); }else if (!strcmp (p,"vnclisten" )) { - d_config->vfbs[d_config->num_vfbs].vnclisten =strdup (p2 +1 ); + vfb->vnclisten =strdup (p2 +1 ); }else if (!strcmp (p,"vncpasswd" )) { - d_config->vfbs[d_config->num_vfbs].vncpasswd =strdup (p2 +1 ); + vfb->vncpasswd =strdup (p2 +1 ); }else if (!strcmp (p,"vncdisplay" )) { - d_config->vfbs[d_config->num_vfbs].vncdisplay =atoi (p2 +1 ); + vfb->vncdisplay =atoi (p2 +1 ); }else if (!strcmp (p,"vncunused" )) { - d_config->vfbs[d_config->num_vfbs].vncunused =atoi (p2 +1 ); + vfb->vncunused =atoi (p2 +1 ); }else if (!strcmp (p,"keymap" )) { - d_config->vfbs[d_config->num_vfbs].keymap =strdup (p2 +1 ); + vfb->keymap =strdup (p2 +1 ); }else if (!strcmp (p,"sdl" )) { - d_config->vfbs[d_config->num_vfbs].sdl =atoi (p2 +1 ); + vfb->sdl =atoi (p2 +1 ); }else if (!strcmp (p,"opengl" )) { - d_config->vfbs[d_config->num_vfbs].opengl =atoi (p2 +1 ); + vfb->opengl =atoi (p2 +1 ); }else if (!strcmp (p,"display" )) { - d_config->vfbs[d_config->num_vfbs].display =strdup (p2 +1 ); + vfb->display =strdup (p2 +1 ); }else if (!strcmp (p,"xauthority" )) { - d_config->vfbs[d_config->num_vfbs].xauthority =strdup (p2 +1 ); + vfb->xauthority =strdup (p2 +1 ); } }while ((p =strtok (NULL ,"," )) !=NULL ); skip_vfb:free (buf2); - d_config->num_vfbs = d_config->num_vfbs +1 ; - d_config->num_vkbs = d_config->num_vkbs +1 ; + d_config->num_vfbs++; + d_config->num_vkbs++; } }
@@ -928,11 +946,15 @@ skip_vfb: d_config->num_pcidevs =0 ; d_config->pcidevs =NULL ;while ((buf =xlu_cfg_get_listitem (pcis, d_config->num_pcidevs)) !=NULL ) { +libxl_device_pci *pcidev;unsigned int domain =0 , bus =0 , dev =0 , func =0 , vdevfn =0 ;char *buf2 =strdup (buf);char *p; + d_config->pcidevs = (libxl_device_pci *)realloc (d_config->pcidevs,sizeof (libxl_device_pci) * (d_config->num_pcidevs +1 )); -memset (d_config->pcidevs + d_config->num_pcidevs,0x00 ,sizeof (libxl_device_pci)); + pcidev = d_config->pcidevs + d_config->num_pcidevs; +memset (pcidev,0x00 ,sizeof (libxl_device_pci)); + p =strtok (buf2,"," );if (!p) goto skip_pci;
@@ -943,21 +965,22 @@ skip_vfb: goto skip_pci; } } -libxl_device_pci_init (d_config->pcidevs + d_config->num_pcidevs, domain, bus, dev, func, vdevfn); - d_config->pcidevs[d_config->num_pcidevs].msitranslate = pci_msitranslate; - d_config->pcidevs[d_config->num_pcidevs].power_mgmt = pci_power_mgmt; + +libxl_device_pci_init (pcidev, domain, bus, dev, func, vdevfn); + pcidev->msitranslate = pci_msitranslate; + pcidev->power_mgmt = pci_power_mgmt;while ((p =strtok (NULL ,",=" )) !=NULL ) {while (*p ==' ' ) p++;if (!strcmp (p,"msitranslate" )) { p =strtok (NULL ,",=" ); - d_config->pcidevs[d_config->num_pcidevs].msitranslate =atoi (p); + pcidev->msitranslate =atoi (p); }else if (!strcmp (p,"power_mgmt" )) { p =strtok (NULL ,",=" ); - d_config->pcidevs[d_config->num_pcidevs].power_mgmt =atoi (p); - } - } - d_config->num_pcidevs = d_config->num_pcidevs +1 ; + pcidev->power_mgmt =atoi (p); + } + } + d_config->num_pcidevs++; skip_pci:free (buf2); }