]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
spawn_reap: wait for specified pid, check correctly return codes from waitpid(),...
authorJaroslav Kysela <perex@perex.cz>
Thu, 23 Apr 2015 07:03:59 +0000 (09:03 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 23 Apr 2015 07:03:59 +0000 (09:03 +0200)
src/config.c
src/spawn.c
src/spawn.h

index cf7574ddc725d20325706894b30eacf1d85336c1..890a8baae99df57384e1716b7d1e05b2e4d60b6b 100644 (file)
@@ -1178,6 +1178,7 @@ dobackup(const char *oldver)
   const char *root = hts_settings_get_root();
   char errtxt[128];
   const char **arg;
+  pid_t pid;
   int code;
 
   tvhinfo("config", "backup: migrating config from %s (running %s)",
@@ -1211,10 +1212,10 @@ dobackup(const char *oldver)
                                      root, oldver);
   tvhinfo("config", "backup: running, output file %s", outfile);
 
-  if (spawnv(argv[0], (void *)argv, NULL, 1, 1)) {
+  if (spawnv(argv[0], (void *)argv, &pid, 1, 1)) {
     code = -ENOENT;
   } else {
-    while ((code = spawn_reap(errtxt, sizeof(errtxt))) == -EAGAIN)
+    while ((code = spawn_reap(pid, errtxt, sizeof(errtxt))) == -EAGAIN)
       usleep(20000);
   }
 
index 6651f0b6cc3ddca16e59bd959bdb1fcd1b98d93a..7c2b4710045105182445776bfb10cdcfc6e4c22e 100644 (file)
@@ -230,13 +230,17 @@ find_exec ( const char *name, char *out, size_t len )
  * Reap one child
  */
 int
-spawn_reap(char *stxt, size_t stxtlen)
+spawn_reap(pid_t wpid, char *stxt, size_t stxtlen)
 {
   pid_t pid;
   int status, res;
   spawn_t *s;
 
-  pid = waitpid(-1, &status, WNOHANG);
+  pid = waitpid(wpid, &status, WNOHANG);
+  if(pid < 0 && ERRNO_AGAIN(errno))
+    return -EAGAIN;
+  if(pid < 0)
+    return -errno;
   if(pid < 1)
     return -EAGAIN;
 
@@ -279,7 +283,7 @@ spawn_reap(char *stxt, size_t stxtlen)
 static void
 spawn_reaper(void)
 {
-  while (spawn_reap(NULL, 0) != -EAGAIN) ;
+  while (spawn_reap(-1, NULL, 0) != -EAGAIN) ;
 }
 
 /**
index 1554a74943212d521c923fd9b8a24289c0fcd392..124220ca48f9d47089b2bce237f9139be5c6f806 100644 (file)
@@ -34,7 +34,7 @@ int spawn_and_give_stdout(const char *prog, char *argv[], char *envp[],
 
 int spawnv(const char *prog, char *argv[], pid_t *pid, int redir_stdout, int redir_stderr);
 
-int spawn_reap(char *stxt, size_t stxtlen);
+int spawn_reap(pid_t pid, char *stxt, size_t stxtlen);
 
 int spawn_kill(pid_t pid, int sig);