1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
From: Dmitry Bogatov <KAction@debian.org>
Date: Sun, 25 Aug 2019 19:02:46 +0000
Forwarded: <not-needed>
Subject: Make pid1 forward sigalarm to stage2 process
---
runit-2.2.0/src/runit.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
--- a/runit-2.2.0/src/runit.c
+++ b/runit-2.2.0/src/runit.c
@@ -31,6 +31,7 @@
int sigc =0;
int sigi =0;
int sigp =0;
+int siga =0;
void sig_cont_handler (void) {
sigc++;
@@ -44,6 +45,10 @@
sigp++;
write(selfpipe[1], "", 1);
}
+void sig_alarm_handler (void) {
+ siga++;
+ write(selfpipe[1], "", 1);
+}
void sig_child_handler (void) { write(selfpipe[1], "", 1); }
void sync_if_needed() {
@@ -69,6 +74,7 @@
setsid();
sig_block(sig_alarm);
+ sig_catch(sig_alarm, sig_alarm_handler);
sig_block(sig_child);
sig_catch(sig_child, sig_child_handler);
sig_block(sig_cont);
@@ -154,6 +160,7 @@
for (;;) {
int child;
+ sig_unblock(sig_alarm);
sig_unblock(sig_child);
sig_unblock(sig_cont);
sig_unblock(sig_int);
@@ -166,6 +173,7 @@
FD_SET(x.fd, &rfds);
select(x.fd +1, &rfds, (fd_set*)0, (fd_set*)0, &t);
#endif
+ sig_block(sig_alarm);
sig_block(sig_cont);
sig_block(sig_child);
sig_block(sig_int);
@@ -220,7 +228,7 @@
}
/* sig? */
- if (!sigc && !sigi && !sigp) {
+ if (!sigc && !sigi && !sigp && !siga) {
#ifdef DEBUG
strerr_warn2(WARNING, "poll: ", &strerr_sys);
#endif
@@ -228,7 +236,7 @@
}
if (st != 1) {
strerr_warn2(WARNING, "signals only work in stage 2.", 0);
- sigc =sigi =sigp =0;
+ sigc =sigi =sigp =siga =0;
continue;
}
if (sigi && (stat(CTRLALTDEL, &s) != -1) && (s.st_mode & S_IXUSR)) {
@@ -295,7 +303,13 @@
/* enter stage 3 */
break;
}
- sigc =sigi =sigp =0;
+ /* Recenty patched version of {runsvdir} perform out-of-schedule rescan of service directory
+ * upon receiving SIGALRM. */
+ if (siga) {
+ kill(pid, sig_alarm);
+ }
+
+ sigc =sigi =sigp =siga =0;
#ifdef DEBUG
strerr_warn2(WARNING, "no request.", 0);
#endif
|