weston-launch: return better value if weston dies because of a signal
authorPhilipp Brüschweiler <blei42@gmail.com>
Sun, 10 Mar 2013 14:14:01 +0000 (15:14 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 19 Mar 2013 18:28:23 +0000 (14:28 -0400)
Before this commit, weston-launch returned 0 if weston was killed by a
signal. This makes it hard to automatically test weston by using
weston-launch, as there is no way to know why weston was terminated.

This commit makes weston-launch return 10+N instead, where N is the code
of the signal that terminated weston. 10 was chosen because it allows a
script to distinguish it from the case that weston-launch itself was
killed by a signal (128+N), and does not overlap the standard exit codes
defined in sysexits.h.

Partial fix for https://bugs.freedesktop.org/show_bug.cgi?id=60935. I
can't reproduce the SIGHUP using the fbdev backend.

v3: better commit message.

src/weston-launch.c

index 98f0111..407d135 100644 (file)
@@ -420,7 +420,7 @@ static int
 handle_signal(struct weston_launch *wl)
 {
        struct signalfd_siginfo sig;
-       int pid, status;
+       int pid, status, ret;
 
        if (read(wl->signalfd, &sig, sizeof sig) != sizeof sig) {
                error(0, errno, "reading signalfd failed");
@@ -432,7 +432,19 @@ handle_signal(struct weston_launch *wl)
                pid = waitpid(-1, &status, 0);
                if (pid == wl->child) {
                        wl->child = 0;
-                       quit(wl, WIFEXITED(status) ? WEXITSTATUS(status) : 0);
+                       if (WIFEXITED(status))
+                               ret = WEXITSTATUS(status);
+                       else if (WIFSIGNALED(status))
+                               /*
+                                * If weston dies because of signal N, we
+                                * return 10+N. This is distinct from
+                                * weston-launch dying because of a signal
+                                * (128+N).
+                                */
+                               ret = 10 + WTERMSIG(status);
+                       else
+                               ret = 0;
+                       quit(wl, ret);
                }
                break;
        case SIGTERM: