chiark / gitweb /
journal: fix against (theoretical) undefined behavior
[elogind.git] / src / core / busname.c
index c45265658c21468c30cba21c0cee089446aebd97..034e5f60d12373a5fd9dbbbc91f83088b5bdf490 100644 (file)
@@ -197,6 +197,8 @@ static void busname_unwatch_fd(BusName *n) {
 static void busname_close_fd(BusName *n) {
         assert(n);
 
+        busname_unwatch_fd(n);
+
         if (n->starter_fd <= 0)
                 return;
 
@@ -333,6 +335,11 @@ static void busname_enter_running(BusName *n) {
 
         if (unit_stop_pending(UNIT(n))) {
                 log_debug_unit(UNIT(n)->id, "Suppressing activation request on %s since unit stop is scheduled.", UNIT(n)->id);
+
+                /* Flush all queued activation reqeuest by closing and reopening the connection */
+
+                busname_close_fd(n);
+                busname_enter_listening(n);
                 return;
         }
 
@@ -519,18 +526,13 @@ static void busname_trigger_notify(Unit *u, Unit *other) {
 
         s = SERVICE(other);
 
-        if (s->state == SERVICE_FAILED) {
-                if (s->result == SERVICE_FAILURE_START_LIMIT)
-                        busname_enter_dead(n, BUSNAME_FAILURE_SERVICE_FAILED_PERMANENT);
-                else
-                        busname_enter_listening(n);
-        }
-
-        if (IN_SET(n->state,
-                   SERVICE_DEAD,
-                   SERVICE_STOP, SERVICE_STOP_SIGTERM, SERVICE_STOP_SIGKILL,
-                   SERVICE_STOP_POST, SERVICE_FINAL_SIGTERM, SERVICE_FINAL_SIGKILL,
-                   SERVICE_AUTO_RESTART))
+        if (s->state == SERVICE_FAILED && s->result == SERVICE_FAILURE_START_LIMIT)
+                busname_enter_dead(n, BUSNAME_FAILURE_SERVICE_FAILED_PERMANENT);
+        else if (IN_SET(s->state,
+                        SERVICE_DEAD, SERVICE_FAILED,
+                        SERVICE_STOP, SERVICE_STOP_SIGTERM, SERVICE_STOP_SIGKILL,
+                        SERVICE_STOP_POST, SERVICE_FINAL_SIGTERM, SERVICE_FINAL_SIGKILL,
+                        SERVICE_AUTO_RESTART))
                 busname_enter_listening(n);
 }