logind: at start-up automatically clean up orphaned inhibitors

This commit is contained in:
Lennart Poettering 2019-07-23 10:33:39 +02:00
parent 290320effa
commit 11eae36d29
3 changed files with 30 additions and 2 deletions

View file

@ -13,6 +13,7 @@
#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"
@ -350,6 +351,24 @@ static void inhibitor_remove_fifo(Inhibitor *i) {
}
}
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;

View file

@ -60,6 +60,8 @@ void inhibitor_stop(Inhibitor *i);
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);

View file

@ -1145,8 +1145,15 @@ static int manager_startup(Manager *m) {
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);