about summary refs log tree commit diff
path: root/src/libutil
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/util.cc16
-rw-r--r--src/libutil/util.hh2
2 files changed, 14 insertions, 4 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 1576e1e8b0f2..ae5af249203e 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -641,6 +641,7 @@ Pid::Pid()
 {
     pid = -1;
     separatePG = false;
+    killSignal = SIGKILL;
 }
 
 
@@ -654,6 +655,7 @@ void Pid::operator =(pid_t pid)
 {
     if (this->pid != pid) kill();
     this->pid = pid;
+    killSignal = SIGKILL; // reset signal to default
 }
 
 
@@ -669,10 +671,10 @@ void Pid::kill()
     
     printMsg(lvlError, format("killing process %1%") % pid);
 
-    /* Send a KILL signal to the child.  If it has its own process
-       group, send the signal to every process in the child process
-       group (which hopefully includes *all* its children). */
-    if (::kill(separatePG ? -pid : pid, SIGKILL) != 0)
+    /* Send the requested signal to the child.  If it has its own
+       process group, send the signal to every process in the child
+       process group (which hopefully includes *all* its children). */
+    if (::kill(separatePG ? -pid : pid, killSignal) != 0)
         printMsg(lvlError, (SysError(format("killing process %1%") % pid).msg()));
 
     /* Wait until the child dies, disregarding the exit status. */
@@ -710,6 +712,12 @@ void Pid::setSeparatePG(bool separatePG)
 }
 
 
+void Pid::setKillSignal(int signal)
+{
+    this->killSignal = signal;
+}
+
+
 void killUser(uid_t uid)
 {
     debug(format("killing all processes running under uid `%1%'") % uid);
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 3c4629957a7b..4d284ccfdc68 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -213,6 +213,7 @@ class Pid
 {
     pid_t pid;
     bool separatePG;
+    int killSignal;
 public:
     Pid();
     ~Pid();
@@ -221,6 +222,7 @@ public:
     void kill();
     int wait(bool block);
     void setSeparatePG(bool separatePG);
+    void setKillSignal(int signal);
 };