From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:34160) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QAdtF-0005aU-Ti for qemu-devel@nongnu.org; Fri, 15 Apr 2011 03:56:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QAdtE-00034r-P4 for qemu-devel@nongnu.org; Fri, 15 Apr 2011 03:56:29 -0400 Received: from os.inf.tu-dresden.de ([141.76.48.99]:51061) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QAdtE-00034i-Jk for qemu-devel@nongnu.org; Fri, 15 Apr 2011 03:56:28 -0400 Received: from erwin.inf.tu-dresden.de ([141.76.48.80] helo=x) by os.inf.tu-dresden.de with esmtp (Exim 4.75) id 1QAdtC-0006sy-Fy for qemu-devel@nongnu.org; Fri, 15 Apr 2011 09:56:26 +0200 From: Adam Lackorzynski Date: Fri, 15 Apr 2011 09:56:26 +0200 Message-Id: <1302854186-6772-1-git-send-email-adam@os.inf.tu-dresden.de> Subject: [Qemu-devel] [PATCH] multiboot: Support quotable commas in module list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Support quoting of ',' (and '\') to allow commas in the parameter list of modules. Signed-off-by: Adam Lackorzynski --- 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