exit shell cleanly upon receiving SIGHUP
[busybox-power] / debian / patches / 0002-ash-install-SIGHUP-signal-handler-when-interactive.patch
1 From c96672c9c603498d7c4775b2a372cbe9b0ba6dbf Mon Sep 17 00:00:00 2001
2 From: Dennis Groenen <tj.groenen@gmail.com>
3 Date: Sat, 22 Sep 2012 11:38:11 +0200
4 Subject: [PATCH 2/2] ash: install SIGHUP signal handler when interactive
5
6 ---
7  include/libbb.h   |  2 ++
8  procps/Kbuild.src |  1 +
9  shell/ash.c       | 23 +++++++++++++++++++++++
10  3 files changed, 26 insertions(+)
11
12 diff --git a/include/libbb.h b/include/libbb.h
13 index 2cc1466..8694d52 100644
14 --- a/include/libbb.h
15 +++ b/include/libbb.h
16 @@ -1097,6 +1097,8 @@ int kill_main(int argc, char **argv) IF_KILL(MAIN_EXTERNALLY_VISIBLE);
17  int chown_main(int argc, char **argv) IF_CHOWN(MAIN_EXTERNALLY_VISIBLE);
18  /* Used by ftpd */
19  int ls_main(int argc, char **argv) IF_LS(MAIN_EXTERNALLY_VISIBLE);
20 +/* Used by ash */
21 +int pgrep_main(int argc, char **argv) IF_PKILL(MAIN_EXTERNALLY_VISIBLE);
22  /* Don't need IF_xxx() guard for these */
23  int gunzip_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
24  int bunzip2_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
25 diff --git a/procps/Kbuild.src b/procps/Kbuild.src
26 index 89b1cc0..0718d32 100644
27 --- a/procps/Kbuild.src
28 +++ b/procps/Kbuild.src
29 @@ -11,6 +11,7 @@ lib-$(CONFIG_FREE)    += free.o
30  lib-$(CONFIG_FUSER)    += fuser.o
31  lib-$(CONFIG_KILL)     += kill.o
32  lib-$(CONFIG_ASH)      += kill.o  # used for built-in kill by ash
33 +lib-$(CONFIG_ASH)      += pgrep.o  # used by ash to signal its process group
34  lib-$(CONFIG_PGREP)    += pgrep.o
35  lib-$(CONFIG_PKILL)    += pgrep.o
36  lib-$(CONFIG_PIDOF)    += pidof.o
37 diff --git a/shell/ash.c b/shell/ash.c
38 index d025da4..5885b04 100644
39 --- a/shell/ash.c
40 +++ b/shell/ash.c
41 @@ -3378,6 +3378,26 @@ static void setjobctl(int);
42  #endif
43  
44  /*
45 + * Hangup all children and exit cleany.
46 + */
47 +static void
48 +signal_pgrp_exit(int signo)
49 +{
50 +       const char *args[] = {
51 +               "pkill",
52 +               xasprintf("-%d", SIGHUP),
53 +               "-P",
54 +               xasprintf("%d", getpid()),
55 +               NULL
56 +       };
57 +
58 +       pgrep_main(4, (char**)args);
59 +
60 +       exitstatus = 128 + signo;
61 +       exitshell(); // exit shell cleanly
62 +}
63 +
64 +/*
65   * Ignore a signal.
66   */
67  static void
68 @@ -13160,6 +13180,9 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
69         setstackmark(&smark);
70         procargs(argv);
71  
72 +       if (iflag)
73 +               signal(SIGHUP, signal_pgrp_exit);
74 +
75  #if ENABLE_FEATURE_EDITING_SAVEHISTORY
76         if (iflag) {
77                 const char *hp = lookupvar("HISTFILE");
78 -- 
79 1.7.12
80