File: 0021-Make-pid1-forward-sigalarm-to-stage2-process.patch

package info (click to toggle)
runit 2.2.0-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 2,116 kB
  • sloc: ansic: 6,033; sh: 2,540; makefile: 399
file content (87 lines) | stat: -rw-r--r-- 2,176 bytes parent folder | download | duplicates (2)
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