chiark / gitweb /
initctl: support 'telinit u/q'
authorTom Gundersen <teg@jklm.no>
Sat, 30 Jul 2011 16:23:10 +0000 (18:23 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 1 Aug 2011 21:22:24 +0000 (23:22 +0200)
We send SIGTERM (resp., SIGHUP) when we receive request for changing to
runlevel 'u' (resp., 'q').

As initctl is already async, we just send the signals rather than first
attempting to connect to sytemd over dbus and then falling back to kill.

src/initctl.c

index 7096a824b0ecfc092d1e752710c1533224ba6577..f36f1cc704fd49417004dd5593fcf5271c13149a 100644 (file)
@@ -165,7 +165,24 @@ static void request_process(Server *s, const struct init_request *req) {
                 if (!isprint(req->runlevel))
                         log_error("Got invalid runlevel. Ignoring.");
                 else
                 if (!isprint(req->runlevel))
                         log_error("Got invalid runlevel. Ignoring.");
                 else
-                        change_runlevel(s, req->runlevel);
+                        switch (req->runlevel) {
+
+                        /* we are async anyway, so just use kill for reexec/reload */
+                        case 'u':
+                        case 'U':
+                                if (kill(1, SIGTERM) < 0)
+                                        log_error("kill() failed: %m");
+                                break;
+
+                        case 'q':
+                        case 'Q':
+                                if (kill(1, SIGHUP) < 0)
+                                        log_error("kill() failed: %m");
+                                break;
+
+                        default:
+                                change_runlevel(s, req->runlevel);
+                        }
                 return;
 
         case INIT_CMD_POWERFAIL:
                 return;
 
         case INIT_CMD_POWERFAIL: