summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Brüschweiler <blei42@gmail.com>2013-03-10 15:14:01 +0100
committerKristian Høgsberg <krh@bitplanet.net>2013-03-19 14:28:23 -0400
commit7a3ec74cb61c0faae18dfec3782f58b91a193801 (patch)
tree5aa207a0956d8c7b99d9784e6295b7c99d7a1018
parentff253129c5b7f2f841d50f3e5dce675b2d31464e (diff)
weston-launch: return better value if weston dies because of a signal
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.
-rw-r--r--src/weston-launch.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/weston-launch.c b/src/weston-launch.c
index 98f01113..407d1356 100644
--- a/src/weston-launch.c
+++ b/src/weston-launch.c
@@ -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: