static int download_pipe(download_t *dn, const char *args) { char **argv = NULL; int r; download_pipe_close(dn); gtimer_disarm(&dn->pipe_read_timer); /* Arguments */ if (spawn_parse_args(&argv, 64, args, NULL)) { tvherror(dn->log, "pipe: unable to parse arguments (%s)", args); return -1; } /* Grab */ r = spawn_and_give_stdout(argv[0], argv, NULL, &dn->pipe_fd, &dn->pipe_pid, 1); spawn_free_args(argv); if (r < 0) { dn->pipe_fd = -1; dn->pipe_pid = 0; tvherror(dn->log, "pipe: cannot start (%s)", args); return -1; } fcntl(dn->pipe_fd, F_SETFL, fcntl(dn->pipe_fd, F_GETFL) | O_NONBLOCK); gtimer_arm_ms(&dn->pipe_read_timer, download_pipe_read, dn, 250); return 0; }
static void _xmltv_load_grabbers ( void ) { int outlen = -1, rd = -1; size_t i, p, n; char *outbuf; char name[1000]; char *tmp, *tmp2 = NULL, *path; /* Load data */ if (spawn_and_give_stdout(XMLTV_FIND, NULL, NULL, &rd, NULL, 1) >= 0) outlen = file_readall(rd, &outbuf); if (rd >= 0) close(rd); /* Process */ if ( outlen > 0 ) { p = n = i = 0; while ( i < outlen ) { if ( outbuf[i] == '\n' || outbuf[i] == '\0' ) { outbuf[i] = '\0'; sprintf(name, "XMLTV: %s", &outbuf[n]); epggrab_module_int_create(NULL, NULL, &outbuf[p], name, 3, &outbuf[p], 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; } i++; } free(outbuf); /* Internal search */ } else if ((tmp = getenv("PATH"))) { tvhdebug("epggrab", "using internal grab search"); char bin[256]; char *argv[] = { NULL, (char *)"--description", NULL }; path = strdup(tmp); tmp = strtok_r(path, ":", &tmp2); while (tmp) { DIR *dir; struct dirent *de; struct stat st; if ((dir = opendir(tmp))) { while ((de = readdir(dir))) { if (strstr(de->d_name, XMLTV_GRAB) != de->d_name) continue; snprintf(bin, sizeof(bin), "%s/%s", tmp, de->d_name); if (epggrab_module_find_by_id(bin)) continue; if (stat(bin, &st)) continue; if (!(st.st_mode & S_IEXEC)) continue; if (!S_ISREG(st.st_mode)) continue; rd = -1; if (spawn_and_give_stdout(bin, argv, NULL, &rd, NULL, 1) >= 0 && (outlen = file_readall(rd, &outbuf)) > 0) { close(rd); if (outbuf[outlen-1] == '\n') outbuf[outlen-1] = '\0'; snprintf(name, sizeof(name), "XMLTV: %s", outbuf); epggrab_module_int_create(NULL, NULL, bin, name, 3, bin, NULL, _xmltv_parse, NULL, NULL); free(outbuf); } else { if (rd >= 0) close(rd); } } closedir(dir); } tmp = strtok_r(NULL, ":", &tmp2); } free(path); } }