From 6b152b942d2dcc832e37017fa617aab3e8620d75 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 1 Dec 2014 20:18:05 +0100 Subject: [PATCH] XMTTV: allow to specify arguments for grabbers, fixes #2516 --- src/epggrab/module.c | 27 +++++++++++++++++++++++++-- src/epggrab/module/xmltv.c | 7 ++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/epggrab/module.c b/src/epggrab/module.c index ce6afb73..826cf219 100644 --- a/src/epggrab/module.c +++ b/src/epggrab/module.c @@ -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"); diff --git a/src/epggrab/module/xmltv.c b/src/epggrab/module/xmltv.c index 55ef9ef1..00f55815 100755 --- a/src/epggrab/module/xmltv.c +++ b/src/epggrab/module/xmltv.c @@ -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;