]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
spawn: parse args - accept quotes also inside argument like bash
authorJaroslav Kysela <perex@perex.cz>
Thu, 21 Dec 2017 19:08:02 +0000 (20:08 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 21 Dec 2017 19:08:21 +0000 (20:08 +0100)
src/spawn.c

index f1625e34d2756085d3c4a12234f0579a5c9e1df1..24a3ea9315817151bfa161a6047d3680c5fa6779 100644 (file)
@@ -362,7 +362,7 @@ spawn_parse_args(char ***argv, int argc, const char *cmd, const char **replace)
 {
   char *s, *f, *p, *a;
   const char **r;
-  int i = 0, l, eow = 0;
+  int i = 0, l, eow;
 
   if (!argv || !cmd)
     return -1;
@@ -374,8 +374,8 @@ spawn_parse_args(char ***argv, int argc, const char *cmd, const char **replace)
     while (*s == ' ')
       s++;
     f = s;
-    eow = *s == '\'' || *s == '"' ? *s++ : ' ';
-    while (*s && *s != eow) {
+    eow = 0;
+    while (*s) {
       if (*s == '\\') {
         l = *(s + 1);
         if (l == 'b')
@@ -398,6 +398,18 @@ spawn_parse_args(char ***argv, int argc, const char *cmd, const char **replace)
           if (*s)
             s++;
         }
+      } else if (eow) {
+        if (*s == eow) {
+          memmove(s, s + 1, strlen(s));
+          eow = 0;
+        } else {
+          s++;
+        }
+      } else if (*s == '\'' || *s == '"') {
+        eow = *s;
+        memmove(s, s + 1, strlen(s));
+      } else if (*s == ' ') {
+        break;
       } else {
         s++;
       }