Sorry, I sent an earlier version of the patch by mistake.
I'm attaching the correct one, which I tested and which works for me.
AndrĂ¡s
--
Reality is that which, when you stop believing in it, doesn't go away.
diff --git a/runit-2.1.2/man/runit.8 b/runit-2.1.2/man/runit.8
index 6c07cf8..d597fdd 100644
--- a/runit-2.1.2/man/runit.8
+++ b/runit-2.1.2/man/runit.8
@@ -75,6 +75,12 @@ exists and has the execute by owner permission set,
.B runit
is told to shutdown the system.
.P
+If
+.B runit
+receives a PWR signal,
+.B runit
+is told to shutdown the system.
+.P
if
.B runit
receives an INT signal, a ctrl-alt-del keyboard request is triggered.
diff --git a/runit-2.1.2/src/runit.c b/runit-2.1.2/src/runit.c
index 2bb4794..35cda0a 100644
--- a/runit-2.1.2/src/runit.c
+++ b/runit-2.1.2/src/runit.c
@@ -30,6 +30,7 @@ const char * const stage[3] ={
int selfpipe[2];
int sigc =0;
int sigi =0;
+int sigp =0;
void sig_cont_handler (void) {
sigc++;
@@ -39,6 +40,10 @@ void sig_int_handler (void) {
sigi++;
write(selfpipe[1], "", 1);
}
+void sig_pwr_handler (void) {
+ sigp++;
+ write(selfpipe[1], "", 1);
+}
void sig_child_handler (void) { write(selfpipe[1], "", 1); }
void sync_if_needed() {
@@ -71,6 +76,8 @@ int main (int argc, const char * const *argv, char * const *envp) {
sig_block(sig_hangup);
sig_block(sig_int);
sig_catch(sig_int, sig_int_handler);
+ sig_block(sig_pwr);
+ sig_catch(sig_pwr, sig_pwr_handler);
sig_block(sig_pipe);
sig_block(sig_term);
@@ -150,6 +157,7 @@ int main (int argc, const char * const *argv, char * const *envp) {
sig_unblock(sig_child);
sig_unblock(sig_cont);
sig_unblock(sig_int);
+ sig_unblock(sig_pwr);
#ifdef IOPAUSE_POLL
poll(&x, 1, 14000);
#else
@@ -161,6 +169,7 @@ int main (int argc, const char * const *argv, char * const *envp) {
sig_block(sig_cont);
sig_block(sig_child);
sig_block(sig_int);
+ sig_block(sig_pwr);
while (read(selfpipe[0], &ch, 1) == 1) {}
while ((child =wait_nohang(&wstat)) > 0)
@@ -211,7 +220,7 @@ int main (int argc, const char * const *argv, char * const *envp) {
}
/* sig? */
- if (!sigc && !sigi) {
+ if (!sigc && !sigi && !sigp) {
#ifdef DEBUG
strerr_warn2(WARNING, "poll: ", &strerr_sys);
#endif
@@ -244,7 +253,7 @@ int main (int argc, const char * const *argv, char * const *envp) {
sigi =0;
sigc++;
}
- if (sigc && (stat(STOPIT, &s) != -1) && (s.st_mode & S_IXUSR)) {
+ if ((sigp) || (sigc && (stat(STOPIT, &s) != -1) && (s.st_mode & S_IXUSR))) {
int i;
/* unlink(STOPIT); */
chmod(STOPIT, 0);
@@ -286,7 +295,7 @@ int main (int argc, const char * const *argv, char * const *envp) {
/* enter stage 3 */
break;
}
- sigc =sigi =0;
+ sigc =sigi =sigp =0;
#ifdef DEBUG
strerr_warn2(WARNING, "no request.", 0);
#endif
@@ -308,7 +317,7 @@ int main (int argc, const char * const *argv, char * const *envp) {
switch (pid) {
case 0:
case -1:
- if ((stat(REBOOT, &s) != -1) && (s.st_mode & S_IXUSR)) {
+ if ((!sigp) && ((stat(REBOOT, &s) != -1) && (s.st_mode & S_IXUSR))) {
strerr_warn2(INFO, "system reboot.", 0);
sync_if_needed();
reboot_system(RB_AUTOBOOT);
diff --git a/runit-2.1.2/src/sig.c b/runit-2.1.2/src/sig.c
index 423d18e..9d9d69b 100644
--- a/runit-2.1.2/src/sig.c
+++ b/runit-2.1.2/src/sig.c
@@ -9,6 +9,7 @@ int sig_cont = SIGCONT;
int sig_hangup = SIGHUP;
int sig_int = SIGINT;
int sig_pipe = SIGPIPE;
+int sig_pwr = SIGPWR;
int sig_term = SIGTERM;
void (*sig_defaulthandler)() = SIG_DFL;
diff --git a/runit-2.1.2/src/sig.h b/runit-2.1.2/src/sig.h
index 2a3c780..0ced62d 100644
--- a/runit-2.1.2/src/sig.h
+++ b/runit-2.1.2/src/sig.h
@@ -9,6 +9,7 @@ extern int sig_cont;
extern int sig_hangup;
extern int sig_int;
extern int sig_pipe;
+extern int sig_pwr;
extern int sig_term;
extern void (*sig_defaulthandler)();