All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [PATCH 5/9] xl: disks: replace config file disk spec parser with call to xlu_disk_parse
Date: Thu, 2 Jun 2011 18:55:42 +0100	[thread overview]
Message-ID: <1307037346-31251-6-git-send-email-ian.jackson@eu.citrix.com> (raw)
In-Reply-To: <1307037346-31251-5-git-send-email-ian.jackson@eu.citrix.com>

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/xl_cmdimpl.c |  163 ++++++---------------------------------------
 1 files changed, 22 insertions(+), 141 deletions(-)

diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index ecfcac4..63ac79a 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -477,148 +477,31 @@ static int parse_action_on_shutdown(const char *buf, libxl_action_on_shutdown *a
 #define DSTATE_RW        5
 #define DSTATE_TERMINAL  6
 
-static int parse_disk_config(libxl_device_disk *disk, char *buf2)
+static void parse_disk_config_multistring(XLU_Config **config,
+                                          int nspecs, const char *const *specs,
+                                          libxl_device_disk *disk)
 {
-    int state = DSTATE_INITIAL;
-    char *p, *end, *tok;
+    int e;
 
     memset(disk, 0, sizeof(*disk));
 
-    for(tok = p = buf2, end = buf2 + strlen(buf2) + 1; p < end; p++) {
-        switch(state){
-        case DSTATE_INITIAL:
-            if ( *p == ':' ) {
-                *p = '\0';
-                if ( !strcmp(tok, "phy") ) {
-                    state = DSTATE_PHYSPATH;
-                    disk->format = LIBXL_DISK_FORMAT_RAW;
-                    disk->backend = LIBXL_DISK_BACKEND_PHY;
-                }else if ( !strcmp(tok, "file") ) {
-                    state = DSTATE_PHYSPATH;
-                    disk->format = LIBXL_DISK_FORMAT_RAW;
-                    disk->backend = LIBXL_DISK_BACKEND_TAP;
-                }else if ((!strcmp(tok, "tap")) ||
-                          (!strcmp(tok, "tap2"))) {
-                    state = DSTATE_TAP;
-                }else{
-                    fprintf(stderr, "Unknown disk type: %s\n", tok);
-                    return 0;
-                }
-                tok = p + 1;
-            } else if (*p == ',') {
-                state = DSTATE_VIRTPATH;
-                disk->format = LIBXL_DISK_FORMAT_EMPTY;
-                disk->backend = LIBXL_DISK_BACKEND_TAP;
-                disk->pdev_path = strdup("");
-                tok = p + 1;
-            }
-            break;
-        case DSTATE_TAP:
-            if (*p == ',') {
-                disk->format = LIBXL_DISK_FORMAT_RAW;
-                disk->backend = LIBXL_DISK_BACKEND_TAP;
-                state = DSTATE_PHYSPATH;
-            } else if ( *p == ':' ) {
-                *p = '\0';
-                if (!strcmp(tok, "aio")) {
-                    tok = p + 1;
-                    break;
-                }
-                if (!strcmp(tok, "vhd")) {
-                    disk->format = LIBXL_DISK_FORMAT_VHD;
-                    disk->backend = LIBXL_DISK_BACKEND_TAP;
-                }else if ( !strcmp(tok, "qcow") ) {
-                    disk->format = LIBXL_DISK_FORMAT_QCOW;
-                    disk->backend = LIBXL_DISK_BACKEND_QDISK;
-                }else if ( !strcmp(tok, "qcow2") ) {
-                    disk->format = LIBXL_DISK_FORMAT_QCOW2;
-                    disk->backend = LIBXL_DISK_BACKEND_QDISK;
-                }else if (!strcmp(tok, "raw")) {
-                    disk->format = LIBXL_DISK_FORMAT_RAW;
-                    disk->backend = LIBXL_DISK_BACKEND_TAP;
-                }
-                else {
-                    fprintf(stderr, "Unknown tapdisk type: %s\n", tok);
-                    return 0;
-                }
-
-                tok = p + 1;
-                state = DSTATE_PHYSPATH;
-                break;
-            } else {
-                break;
-            }
-        case DSTATE_PHYSPATH:
-            if ( *p == ',' ) {
-                int ioemu_len;
-
-                *p = '\0';
-                disk->pdev_path = (*tok) ? strdup(tok) : NULL;
-                tok = p + 1;
-
-                /* hack for ioemu disk spec */
-                ioemu_len = strlen("ioemu:");
-                state = DSTATE_VIRTPATH;
-                if ( tok + ioemu_len < end &&
-                    !strncmp(tok, "ioemu:", ioemu_len)) {
-                    tok += ioemu_len;
-                    p += ioemu_len;
-                }
-            }
-            break;
-        case DSTATE_VIRTPATH:
-            if ( *p == ',' || *p == ':' || *p == '\0' ) {
-                switch(*p) {
-                case ':':
-                    state = DSTATE_VIRTTYPE;
-                    break;
-                case ',':
-                    state = DSTATE_RW;
-                    break;
-                case '\0':
-                    state = DSTATE_TERMINAL;
-                    break;
-                }
-                if ( tok == p )
-                    goto out;
-                *p = '\0';
-                disk->vdev = (*tok) ? strdup(tok) : NULL;
-                tok = p + 1;
-            }
-            break;
-        case DSTATE_VIRTTYPE:
-            if ( *p == ',' || *p == '\0' ) {
-                *p = '\0';
-                if ( !strcmp(tok, "cdrom") ) {
-                    disk->is_cdrom = 1;
-                    disk->removable = 1;
-                }else{
-                    fprintf(stderr, "Unknown virtual disk type: %s\n", tok);
-                    return 0;
-                }
-                tok = p + 1;
-                state = (*p == ',') ? DSTATE_RW : DSTATE_TERMINAL;
-            }
-            break;
-        case DSTATE_RW:
-            if ( *p == '\0' ) {
-                disk->readwrite = (tok[0] == 'w');
-                tok = p + 1;
-                state = DSTATE_TERMINAL;
-            }
-            break;
-        case DSTATE_TERMINAL:
-            goto out;
-        }
+    if (!*config) {
+	*config = xlu_cfg_init(stderr, "command line");
+	if (!*config) { perror("xlu_cfg_init"); exit(-1); }
     }
 
-out:
-    if ( tok != p || state != DSTATE_TERMINAL ) {
-        fprintf(stderr, "parse error in disk config near '%s'\n", tok);
-        return 0;
+    e = xlu_disk_parse(*config, nspecs, specs, disk);
+    if (e == EINVAL) exit(-1);
+    if (e) {
+	fprintf(stderr,"xlu_disk_parse failed: %s\n",strerror(errno));
+	exit(-1);
     }
+}
 
-    return 1;
+static void parse_disk_config(XLU_Config **config, const char *spec,
+                              libxl_device_disk *disk)
+{
+    parse_disk_config_multistring(config, 1, &spec, disk);
 }
 
 static void parse_config_data(const char *configfile_filename_report,
@@ -835,9 +718,7 @@ static void parse_config_data(const char *configfile_filename_report,
 
             d_config->disks = (libxl_device_disk *) realloc(d_config->disks, sizeof (libxl_device_disk) * (d_config->num_disks + 1));
             disk = d_config->disks + d_config->num_disks;
-            if ( !parse_disk_config(disk, buf2) ) {
-                exit(1);
-            }
+            parse_disk_config(&config, buf2, disk);
 
             free(buf2);
             d_config->num_disks++;
@@ -1919,6 +1800,7 @@ static void cd_insert(const char *dom, const char *virtdev, char *phys)
 {
     libxl_device_disk disk; /* we don't free disk's contents */
     char *buf = NULL;
+    XLU_Config *config = 0;
 
     find_domain(dom);
 
@@ -1926,10 +1808,9 @@ static void cd_insert(const char *dom, const char *virtdev, char *phys)
         fprintf(stderr, "out of memory\n");
         return;
     }
-    if (!parse_disk_config(&disk, buf)) {
-        fprintf(stderr, "format error\n");
-        return;
-    }
+
+    parse_disk_config(&config, buf, &disk);
+
     disk.backend_domid = 0;
 
     libxl_cdrom_insert(ctx, domid, &disk);
-- 
1.5.6.5

  reply	other threads:[~2011-06-02 17:55 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-02 17:55 [PATCH 0/9] libxl: disk configuration handling Ian Jackson
2011-06-02 17:55 ` [PATCH 1/9] libxl: disks: Make LIBXL_DISK_BACKEND_UNKNOWN work Ian Jackson
2011-06-02 17:55   ` [PATCH 2/9] libxl: disks: new xlu_disk_parse function Ian Jackson
2011-06-02 17:55     ` [PATCH 3/9] libxl: disks: commit libxlu_disk_l.[ch] flex output Ian Jackson
2011-06-02 17:55       ` [PATCH 4/9] docs: update xl-disk-configuration.txt to describe new syntax Ian Jackson
2011-06-02 17:55         ` Ian Jackson [this message]
2011-06-02 17:55           ` [PATCH 6/9] xl: disks: replace block-attach disk config parser with call to xlu_parse_disk Ian Jackson
2011-06-02 17:55             ` [PATCH 7/9] libxl: disks: allow specification of "backendtype=phy|tap|qdisk" Ian Jackson
2011-06-02 17:55               ` [PATCH 8/9] xl: xl block-attach -N (dry run) option Ian Jackson
2011-06-02 17:55                 ` [PATCH 9/9] xl: new "check-xl-disk-parse" test script for disk parser Ian Jackson
2011-06-03 10:38                   ` Ian Campbell
2011-06-03 11:12                     ` Ian Jackson
2011-06-03 14:25                     ` Ian Jackson
2011-06-03 14:32                       ` Ian Campbell
2011-06-03 10:30                 ` [PATCH 8/9] xl: xl block-attach -N (dry run) option Ian Campbell
2011-06-03 11:17                   ` Ian Jackson
2011-06-03 14:54                   ` [PATCHES 00/08-11] xl dry run option, and disk parser test script Ian Jackson
2011-06-03 14:54                     ` [PATCH 08/11] xl: new global -N option for dry run Ian Jackson
2011-06-03 14:54                       ` [PATCH 09/11] xl: implement -N (dry run) global option for create and cpupool-create Ian Jackson
2011-06-03 14:54                         ` [PATCH 10/11] xl: xl block-attach -N (dry run) option Ian Jackson
2011-06-03 14:54                           ` [PATCH 11/11] xl: new "check-xl-disk-parse" test script for disk parser Ian Jackson
2011-06-03 15:09                             ` Ian Campbell
2011-06-03 15:05                           ` [PATCH 10/11] xl: xl block-attach -N (dry run) option Ian Campbell
2011-06-23 16:36                           ` Ian Campbell
2011-06-03 15:04                         ` [PATCH 09/11] xl: implement -N (dry run) global option for create and cpupool-create Ian Campbell
2011-06-03 15:04                       ` [PATCH 08/11] xl: new global -N option for dry run Ian Campbell
2011-06-03 10:38                 ` [PATCH 8/9] xl: xl block-attach -N (dry run) option Ian Campbell
2011-06-03 11:13                   ` Ian Jackson
2011-06-03 12:09                     ` Ian Campbell
2011-06-03 10:46                 ` Ian Campbell
2011-06-03 11:16                   ` Ian Jackson
2011-06-03 13:00                     ` Ian Campbell
2011-06-03 10:27               ` [PATCH 7/9] libxl: disks: allow specification of "backendtype=phy|tap|qdisk" Ian Campbell
2011-06-03 14:24                 ` Ian Jackson
2011-06-03 14:32                   ` Ian Campbell
2011-06-03 10:21             ` [PATCH 6/9] xl: disks: replace block-attach disk config parser with call to xlu_parse_disk Ian Campbell
2011-06-03 10:20           ` [PATCH 5/9] xl: disks: replace config file disk spec parser with call to xlu_disk_parse Ian Campbell
2011-06-03 10:19         ` [PATCH 4/9] docs: update xl-disk-configuration.txt to describe new syntax Ian Campbell
2011-06-03 10:19       ` [PATCH 3/9] libxl: disks: commit libxlu_disk_l.[ch] flex output Ian Campbell
2011-06-03 10:08     ` [PATCH 2/9] libxl: disks: new xlu_disk_parse function Ian Campbell
2011-06-03 11:10       ` Ian Jackson
2011-06-03 12:03         ` Ian Campbell
2011-06-03 14:06           ` Ian Campbell
2011-06-21 17:27             ` Ian Jackson
2011-06-22  8:19               ` Ian Campbell
2011-06-22 13:16                 ` Ian Campbell
2011-06-03 10:18     ` Ian Campbell
2011-06-03  8:42   ` [PATCH 1/9] libxl: disks: Make LIBXL_DISK_BACKEND_UNKNOWN work Ian Campbell
2011-06-03 14:24     ` Ian Jackson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1307037346-31251-6-git-send-email-ian.jackson@eu.citrix.com \
    --to=ian.jackson@eu.citrix.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.