chiark / gitweb /
initctl: don't use dbus connection after PID 1 got respawned
authorLennart Poettering <lennart@poettering.net>
Tue, 1 Nov 2011 17:18:17 +0000 (18:18 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 1 Nov 2011 17:21:32 +0000 (18:21 +0100)
After reexec PID 1 our bus connection is invalidated. Hence don't try to
reuse it, just terminate so that when we are spawned the next time we
just get a new one.

Spotted by Marti Raudsepp.

src/initctl.c

index eaa717ad916bdb55115870696123397bb012759e..097c85fdd4c8c897a8912c95954c2a89d7d97ded 100644 (file)
@@ -56,6 +56,8 @@ typedef struct Server {
         unsigned n_fifos;
 
         DBusConnection *bus;
+
+        bool quit;
 } Server;
 
 struct Fifo {
@@ -174,6 +176,13 @@ static void request_process(Server *s, const struct init_request *req) {
                         case 'U':
                                 if (kill(1, SIGTERM) < 0)
                                         log_error("kill() failed: %m");
+
+                                /* The bus connection will be
+                                 * terminated if PID 1 is reexecuted,
+                                 * hence let's just exit here, and
+                                 * rely on that we'll be restarted on
+                                 * the next request */
+                                s->quit = true;
                                 break;
 
                         case 'q':
@@ -404,7 +413,7 @@ int main(int argc, char *argv[]) {
                   "READY=1\n"
                   "STATUS=Processing requests...");
 
-        for (;;) {
+        while (!server.quit) {
                 struct epoll_event event;
                 int k;