qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH] multiboot: Support quotable commas in module list


From: Adam Lackorzynski
Subject: [Qemu-devel] [PATCH] multiboot: Support quotable commas in module list
Date: Fri, 15 Apr 2011 09:56:26 +0200

Support quoting of ',' (and '\') to allow commas in the parameter list of
modules.

Signed-off-by: Adam Lackorzynski <address@hidden>
---
 hw/multiboot.c |   33 +++++++++++++++++++++++++++++----
 1 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/hw/multiboot.c b/hw/multiboot.c
index 394ed01..73f01aa 100644
--- a/hw/multiboot.c
+++ b/hw/multiboot.c
@@ -95,13 +95,26 @@ typedef struct {
     int mb_mods_count;
 } MultibootState;
 
+static int mb_is_cmdline_quote(const char *c)
+{
+    return c[0] == '\\' && (c[1] == '\\' || c[1] == ',');
+}
+
 static uint32_t mb_add_cmdline(MultibootState *s, const char *cmdline)
 {
     int len = strlen(cmdline) + 1;
+    int ci, bi;
     target_phys_addr_t p = s->offset_cmdlines;
+    char *b = (char *)s->mb_buf + p;
 
-    pstrcpy((char *)s->mb_buf + p, len, cmdline);
-    s->offset_cmdlines += len;
+    for (ci = 0, bi = 0; ci < len - 1; ci++, bi++) {
+        if (mb_is_cmdline_quote(&cmdline[ci])) {
+            ci++;
+        }
+        b[bi] = cmdline[ci];
+    }
+    b[bi] = 0;
+    s->offset_cmdlines += bi + 1;
     return s->mb_buf_phys + p;
 }
 
@@ -124,6 +137,18 @@ static void mb_add_mod(MultibootState *s,
     s->mb_mods_count++;
 }
 
+static const char *mb_cmdline_next_module(const char *c)
+{
+    for (; *c; c++) {
+        if (mb_is_cmdline_quote(c)) {
+            c++;
+        } else if (c[0] == ',') {
+            return c;
+        }
+    }
+    return 0;
+}
+
 int load_multiboot(void *fw_cfg,
                    FILE *f,
                    const char *kernel_filename,
@@ -238,7 +263,7 @@ int load_multiboot(void *fw_cfg,
         const char *r = initrd_filename;
         mbs.mb_buf_size += strlen(r) + 1;
         mbs.mb_mods_avail = 1;
-        while ((r = strchr(r, ','))) {
+        while ((r = mb_cmdline_next_module(r))) {
            mbs.mb_mods_avail++;
            r++;
         }
@@ -261,7 +286,7 @@ int load_multiboot(void *fw_cfg,
             int mb_mod_length;
             uint32_t offs = mbs.mb_buf_size;
 
-            next_initrd = strchr(initrd_filename, ',');
+            next_initrd = (char *)mb_cmdline_next_module(initrd_filename);
             if (next_initrd)
                 *next_initrd = '\0';
             /* if a space comes after the module filename, treat everything
-- 
1.7.4.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]