iowatcher: Check program exit code properly
authorAndrew Price <anprice@redhat.com>
Fri, 28 Mar 2014 01:42:47 +0000 (01:42 +0000)
committerChris Mason <clm@fb.com>
Wed, 24 Sep 2014 19:02:09 +0000 (12:02 -0700)
The return value of posix_spawnp() was being checked but the exit status
of the child process was being ignored. This adds checks and error
reporting based on the status that waitpid returns.

Signed-off-by: Andrew Price <anprice@redhat.com>
iowatcher/tracers.c

index 8f9637283605ccd797d3a33902d77a4c066123f6..ed5efa181aa20f52e2034839f71afa6f5731dbc2 100644 (file)
@@ -182,6 +182,7 @@ int run_program2(int argc, char **argv)
 {
        int i;
        int err;
+       int status;
        pid_t pid;
 
        fprintf(stderr, "running");
@@ -191,11 +192,21 @@ int run_program2(int argc, char **argv)
 
        err = posix_spawnp(&pid, argv[0], NULL, NULL, argv, environ);
        if (err != 0) {
-               fprintf(stderr, "%s failed with exit code %d\n", argv[0], err);
-               return err;
+               fprintf(stderr, "Could not run '%s': %s\n", argv[0], strerror(err));
+               return -err;
        }
-       waitpid(pid, NULL, 0);
-       return 0;
+       waitpid(pid, &status, 0);
+       if (WIFEXITED(status)) {
+               err = WEXITSTATUS(status);
+               if (err == 127) /* spawnp failed after forking */
+                       fprintf(stderr, "Failed to run '%s'\n", argv[0]);
+               else if (err)
+                       fprintf(stderr, "'%s' failed with exit status %d\n", argv[0], err);
+       } else if (WIFSIGNALED(status)) {
+               fprintf(stderr, "'%s' killed by signal %d\n", argv[0], WTERMSIG(status));
+               return 1;
+       }
+       return err;
 }
 
 int wait_for_tracers(void)