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

[Xen-devel] [PATCH] stubdom: support quotes in argument passing



stubdom: support quotes in argument passing

Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>

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@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®.