#include "fd-util.h"
#include "fileio.h"
#include "format-util.h"
+#include "io-util.h"
#include "logind-dbus.h"
#include "logind-inhibit.h"
#include "mkdir.h"
}
}
+bool inhibitor_is_orphan(Inhibitor *i) {
+ assert(i);
+
+ if (!i->started)
+ return true;
+
+ if (!i->fifo_path)
+ return true;
+
+ if (i->fifo_fd < 0)
+ return true;
+
+ if (pipe_eof(i->fifo_fd) != 0)
+ return true;
+
+ return false;
+}
+
InhibitWhat manager_inhibit_what(Manager *m, InhibitMode mm) {
Inhibitor *i;
Iterator j;
int inhibitor_create_fifo(Inhibitor *i);
+bool inhibitor_is_orphan(Inhibitor *i);
+
InhibitWhat manager_inhibit_what(Manager *m, InhibitMode mm);
bool manager_is_inhibited(Manager *m, InhibitWhat w, InhibitMode mm, dual_timestamp *since, bool ignore_inactive, bool ignore_uid, uid_t uid, Inhibitor **offending);
HASHMAP_FOREACH(session, m->sessions, i)
(void) session_start(session, NULL, NULL);
- HASHMAP_FOREACH(inhibitor, m->inhibitors, i)
- inhibitor_start(inhibitor);
+ HASHMAP_FOREACH(inhibitor, m->inhibitors, i) {
+ (void) inhibitor_start(inhibitor);
+
+ /* Let's see if the inhibitor is dead now, then remove it */
+ if (inhibitor_is_orphan(inhibitor)) {
+ inhibitor_stop(inhibitor);
+ inhibitor_free(inhibitor);
+ }
+ }
HASHMAP_FOREACH(button, m->buttons, i)
button_check_switches(button);