[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] xl: support specifing '[vars]' in 'xl create'



Add support of specifing '[vars]' in 'xl create'.
It is said '[vars]' can be used in help message of 'xl create',
but in fact cannot now, so add this function.

After this fix:
# xl create pvguest1.conf
# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1024     2        r--    161.0
pvguest1                                    29   256     2        r--      0.5
# xl destroy pvguest1
# xl create pvguest1.conf vcpus=4 memory=512 'name="pv1"'
# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1024     2        r--    162.2
pv1                                         30   512     4        r--      0.2

Signed-off-by: Yu Zhiguo <yuzg@xxxxxxxxxxxxxx>

diff -r c87ec146229a -r 51bb2db1ed51 tools/libxl/xl.c
--- a/tools/libxl/xl.c  Fri Apr 23 15:04:26 2010 +0100
+++ b/tools/libxl/xl.c  Thu Apr 29 00:02:02 2010 +0800
@@ -777,7 +777,9 @@
     return r;
 }
 
-static int create_domain(int debug, int daemonize, const char *config_file, 
const char *restore_file, int paused, int migrate_fd /* -1 means none */, char 
**migration_domname_r)
+static int create_domain(int debug, int daemonize, const char *config_file, 
const char *restore_file,
+                         int paused, int migrate_fd /* -1 means none */, char 
**migration_domname_r,
+                         const char *extra_config)
 {
     libxl_domain_create_info info1;
     libxl_domain_build_info info2;
@@ -873,6 +875,21 @@
                                        &config_data, &config_len);
         if (ret) { fprintf(stderr, "Failed to read config file: %s: %s\n",
                            config_file, strerror(errno)); return ERROR_FAIL; }
+        if (!restore_file && extra_config && strlen(extra_config)) {
+            if (config_len > INT_MAX - (strlen(extra_config) + 2)) {
+                fprintf(stderr, "Failed to attach extra configration\n");
+                return ERROR_FAIL;
+            }
+            config_data = realloc(config_data, config_len + 
strlen(extra_config) + 2);
+            if (!config_data) {
+                fprintf(stderr, "Failed to realloc config_data\n");
+                return ERROR_FAIL;
+            }
+            strcat(config_data, "\n");
+            strcat(config_data, extra_config);
+            strcat(config_data, "\n");
+            config_len += (strlen(extra_config) + 2);
+        }
     } else {
         if (!config_data) {
             fprintf(stderr, "Config file not specified and"
@@ -1935,7 +1952,7 @@
     rc = create_domain(debug, daemonize,
                        0 /* no config file, use incoming */,
                        "incoming migration stream", 1,
-                       0, &migration_domname);
+                       0, &migration_domname, NULL);
     if (rc) {
         fprintf(stderr, "migration target: Domain creation failed"
                 " (code %d).\n", rc);
@@ -2045,7 +2062,7 @@
         exit(2);
     }
     rc = create_domain(debug, daemonize, config_file,
-                       checkpoint_file, paused, -1, 0);
+                       checkpoint_file, paused, -1, 0, NULL);
     exit(-rc);
 }
 
@@ -2291,6 +2308,8 @@
 {
     char *filename = NULL;
     int debug = 0, daemonize = 1;
+#define MAX_EXTRA       1024
+    char *p, extra_config[MAX_EXTRA];
     int opt, rc;
 
     while ((opt = getopt(argc, argv, "hde")) != -1) {
@@ -2310,14 +2329,26 @@
         }
     }
 
-    if (optind >= argc) {
-        help("create");
-        exit(2);
+    memset(extra_config, 0, MAX_EXTRA);
+    while (optind < argc) {
+        if ((p = strchr(argv[optind], '='))) {
+            if (strlen(extra_config) + 1 < MAX_EXTRA) {
+                if (strlen(extra_config))
+                    strcat(extra_config, "\n");
+                strcat(extra_config, argv[optind]);
+            }
+        } else if (!filename) {
+            filename = argv[optind];
+        } else {
+            help("create");
+            exit(2);
+        }
+
+        optind++;
     }
 
-    filename = argv[optind];
     rc = create_domain(debug, daemonize, filename, NULL, 0,
-                       -1, 0);
+                       -1, 0, extra_config);
     exit(-rc);
 }
 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.