summaryrefslogtreecommitdiff
path: root/src/supervision
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2018-03-02 12:09:48 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2018-03-02 12:09:48 +0000
commit1747a0f5142f0c36a61b37786368f05bcb3060f3 (patch)
tree513ca73e83f6d9bdc39784d3c0f085c418f24720 /src/supervision
parentfa342a6615c39c1760a41011f713f696d1eb5c33 (diff)
downloads6-1747a0f5142f0c36a61b37786368f05bcb3060f3.tar.xz
Make s6-svwait et al. exit instead of hang if s6-supervise dies
Diffstat (limited to 'src/supervision')
-rw-r--r--src/supervision/s6-svlisten.c3
-rw-r--r--src/supervision/s6-svlisten1.c3
-rw-r--r--src/supervision/s6-svwait.c3
-rw-r--r--src/supervision/s6_svlisten_loop.c5
4 files changed, 9 insertions, 5 deletions
diff --git a/src/supervision/s6-svlisten.c b/src/supervision/s6-svlisten.c
index 7e1b930..e44ba87 100644
--- a/src/supervision/s6-svlisten.c
+++ b/src/supervision/s6-svlisten.c
@@ -72,7 +72,8 @@ int main (int argc, char const **argv, char const *const *envp)
if (!pid) strerr_diefu2sys(111, "spawn ", argv[argc1 + 1]) ;
if (wantrestart) s6_svlisten_loop(&foo, 0, 1, or, &deadline, spfd, &s6_svlisten_signal_handler) ;
e = s6_svlisten_loop(&foo, wantup, wantready, or, &deadline, spfd, &s6_svlisten_signal_handler) ;
- if (e) strerr_dief1x(e, "some services reported permanent failure") ;
+ if (e < 0) strerr_dief1x(102, "supervisor died") ;
+ else if (e > 0) strerr_dief1x(e, "some services reported permanent failure") ;
}
return 0 ;
}
diff --git a/src/supervision/s6-svlisten1.c b/src/supervision/s6-svlisten1.c
index 62afc15..69d8ac7 100644
--- a/src/supervision/s6-svlisten1.c
+++ b/src/supervision/s6-svlisten1.c
@@ -53,6 +53,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
if (!pid) strerr_diefu2sys(111, "spawn ", argv[1]) ;
if (wantrestart) s6_svlisten_loop(&foo, 0, 1, 1, &deadline, spfd, &s6_svlisten_signal_handler) ;
e = s6_svlisten_loop(&foo, wantup, wantready, 1, &deadline, spfd, &s6_svlisten_signal_handler) ;
- if (e) strerr_dief2x(1, argv[0], " failed permanently: the finish script exited 125") ;
+ if (e < 0) strerr_dief1x(102, "supervisor died") ;
+ else if (e > 0) strerr_dief2x(1, argv[0], " failed permanently: the finish script exited 125") ;
return 0 ;
}
diff --git a/src/supervision/s6-svwait.c b/src/supervision/s6-svwait.c
index 28d1c3d..f2bd34c 100644
--- a/src/supervision/s6-svwait.c
+++ b/src/supervision/s6-svwait.c
@@ -52,7 +52,8 @@ int main (int argc, char const *const *argv)
unsigned char readystate[bitarray_div8(argc)] ;
s6_svlisten_init(argc, argv, &foo, ids, upstate, readystate, &deadline) ;
e = s6_svlisten_loop(&foo, wantup, wantready, or, &deadline, -1, 0) ;
- if (e) strerr_dief1x(e, "some services reported permanent failure") ;
+ if (e < 0) strerr_dief1x(102, "supervisor died") ;
+ else if (e > 0) strerr_dief1x(e, "some services reported permanent failure") ;
}
return 0 ;
}
diff --git a/src/supervision/s6_svlisten_loop.c b/src/supervision/s6_svlisten_loop.c
index c98fe83..8c6500c 100644
--- a/src/supervision/s6_svlisten_loop.c
+++ b/src/supervision/s6_svlisten_loop.c
@@ -27,7 +27,7 @@ void s6_svlisten_init (int argc, char const *const *argv, s6_svlisten_t *foo, ui
memcpy(s, argv[i], len) ;
s[len] = '/' ;
memcpy(s + len + 1, S6_SUPERVISE_EVENTDIR, sizeof(S6_SUPERVISE_EVENTDIR)) ;
- foo->ids[i] = ftrigr_subscribe_g(&foo->a, s, "[DuUdO]", FTRIGR_REPEAT, deadline) ;
+ foo->ids[i] = ftrigr_subscribe_g(&foo->a, s, "[DuUdOx]", FTRIGR_REPEAT, deadline) ;
if (!foo->ids[i]) strerr_diefu2sys(111, "subscribe to events for ", argv[i]) ;
if (!s6_svstatus_read(argv[i], &status)) strerr_diefu1sys(111, "s6_svstatus_read") ;
bitarray_poke(foo->upstate, i, status.pid && !status.flagfinishing) ;
@@ -72,7 +72,8 @@ int s6_svlisten_loop (s6_svlisten_t *foo, int wantup, int wantready, int or, tai
size_t j = 0 ;
for (; j < sa.len ; j++)
{
- if (sa.s[j] == 'O')
+ if (sa.s[j] == 'x') return -1 ;
+ else if (sa.s[j] == 'O')
{
if (wantup)
{