]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
XMTTV: allow to specify arguments for grabbers, fixes #2516
authorJaroslav Kysela <perex@perex.cz>
Mon, 1 Dec 2014 19:18:05 +0000 (20:18 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 1 Dec 2014 19:32:09 +0000 (20:32 +0100)
src/epggrab/module.c
src/epggrab/module/xmltv.c

index ce6afb73acb0bd3b9dd9b2f2c0b610bd42de75ea..826cf219dfd662c643cab4241c3699b3fb7a9c0a 100644 (file)
@@ -282,13 +282,31 @@ char *epggrab_module_grab_spawn ( void *m )
   int        rd = -1, outlen;
   char       *outbuf;
   epggrab_module_int_t *mod = m;
-  const char *argv[] = { NULL, "--quiet", NULL };
+  char **argv = NULL;
+  char *dargv[] = { (char *)mod->path, (char *)"--quiet", NULL };
 
   /* Debug */
   tvhlog(LOG_INFO, mod->id, "grab %s", mod->path);
 
+  /* Arguments */
+  if (spawn_parse_args(&argv, 64, mod->path, NULL)) {
+    tvhlog(LOG_ERR, mod->id, "unable to parse arguments");
+    return NULL;
+  }
+
+  if (argv && argv[1] == NULL) {
+    spawn_free_args(argv);
+    argv = dargv;
+  } else {
+    /* -- means no arguments */
+    if (argv && !strcmp(argv[1], "--") && argv[2] == NULL) {
+      free(argv[1]);
+      argv[1] = NULL;
+    }
+  }
+
   /* Grab */
-  outlen = spawn_and_give_stdout(mod->path, (char **)argv, NULL, &rd, NULL, 1);
+  outlen = spawn_and_give_stdout(argv[0], (char **)argv, NULL, &rd, NULL, 1);
 
   if (outlen < 0)
     goto error;
@@ -299,9 +317,14 @@ char *epggrab_module_grab_spawn ( void *m )
 
   close(rd);
 
+  if (argv != dargv)
+    spawn_free_args(argv);
+
   return outbuf;
 
 error:
+  if (argv && argv != dargv)
+    spawn_free_args(argv);
   if (rd >= 0)
     close(rd);
   tvhlog(LOG_ERR, mod->id, "no output detected");
index 55ef9ef1a55d6c771d607925c2437bb6bade5031..00f55815602b105081938f6fc02b5a3c49d22cfd 100755 (executable)
@@ -696,8 +696,13 @@ static void _xmltv_load_grabbers ( void )
         outbuf[i] = '\0';
         sprintf(name, "XMLTV: %s", &outbuf[n]);
         epggrab_module_int_create(NULL, &outbuf[p], name, 3, &outbuf[p],
-                                NULL, _xmltv_parse, NULL, NULL);
+                                  NULL, _xmltv_parse, NULL, NULL);
         p = n = i + 1;
+      } else if ( outbuf[i] == '\\') {
+        memmove(outbuf, outbuf + 1, strlen(outbuf));
+        if (outbuf[i])
+          i++;
+        continue;
       } else if ( outbuf[i] == '|' ) {
         outbuf[i] = '\0';
         n = i + 1;