Samuel Thibault
2008-Aug-26 16:32 UTC
[Xen-devel] [PATCH] stubdom: support quotes in argument passing
stubdom: support quotes in argument passing Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com> diff -r c2472ded5c7c extras/mini-os/main.c --- a/extras/mini-os/main.c Tue Aug 26 15:16:57 2008 +0100 +++ b/extras/mini-os/main.c Tue Aug 26 17:26:28 2008 +0100 @@ -42,7 +42,7 @@ extern char __app_bss_start, __app_bss_e extern char __app_bss_start, __app_bss_end; static void call_main(void *p) { - char *c; + char *c, quote; #ifdef CONFIG_QEMU char *domargs, *msg; #endif @@ -101,32 +101,53 @@ static void call_main(void *p) argc = 1; -#define PARSE_ARGS(ARGS,START,END) \ +#define PARSE_ARGS(ARGS,START,QUOTE,END) \ c = ARGS; \ + quote = 0; \ while (*c) { \ if (*c != '' '') { \ START; \ - while (*c && *c != '' '') \ + while (*c) { \ + if (quote) { \ + if (*c == quote) { \ + quote = 0; \ + QUOTE; \ + continue; \ + } \ + } else if (*c == '' '') \ + break; \ + if (*c == ''"'' || *c == ''\'''') { \ + quote = *c; \ + QUOTE; \ + continue; \ + } \ c++; \ + } \ } else { \ END; \ while (*c == '' '') \ c++; \ } \ + } \ + if (quote) {\ + printk("Warning: unterminated quotation %c\n", quote); \ + quote = 0; \ } +#define PARSE_ARGS_COUNT(ARGS) PARSE_ARGS(ARGS, argc++, c++, ) +#define PARSE_ARGS_STORE(ARGS) PARSE_ARGS(ARGS, argv[argc++] = c, memmove(c, c + 1, strlen(c + 1) + 1), *c++ = 0) - PARSE_ARGS((char*)start_info.cmd_line, argc++, ); + PARSE_ARGS_COUNT((char*)start_info.cmd_line); #ifdef CONFIG_QEMU - PARSE_ARGS(domargs, argc++, ); + PARSE_ARGS_COUNT(domargs); #endif argv = alloca((argc + 1) * sizeof(char *)); argv[0] = "main"; argc = 1; - PARSE_ARGS((char*)start_info.cmd_line, argv[argc++] = c, *c++ = 0) + PARSE_ARGS_STORE((char*)start_info.cmd_line) #ifdef CONFIG_QEMU - PARSE_ARGS(domargs, argv[argc++] = c, *c++ = 0) + PARSE_ARGS_STORE(domargs) #endif argv[argc] = NULL; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel