X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind-inhibit.c;h=c43ae23acf6adf8d76b4ccf4bbe1b0510c9352ee;hp=60b6237ce5e71b3604bbee4b528a74cfa2956992;hb=2c4f86c1298f402220965682ab0e7729e150a562;hpb=a34faf579d2be139b0b9e8cd0c73ad4d918ef736 diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c index 60b6237ce..c43ae23ac 100644 --- a/src/login/logind-inhibit.c +++ b/src/login/logind-inhibit.c @@ -30,6 +30,7 @@ #include "mkdir.h" #include "path-util.h" #include "logind-inhibit.h" +#include "fileio.h" Inhibitor* inhibitor_new(Manager *m, const char* id) { Inhibitor *i; @@ -348,7 +349,31 @@ InhibitWhat manager_inhibit_what(Manager *m, InhibitMode mm) { return what; } -bool manager_is_inhibited(Manager *m, InhibitWhat w, InhibitMode mm, dual_timestamp *since) { +static int pid_is_active(Manager *m, pid_t pid) { + Session *s; + int r; + + r = manager_get_session_by_pid(m, pid, &s); + if (r < 0) + return r; + + /* If there's no session assigned to it, then it's globally + * active on all ttys */ + if (r == 0) + return 1; + + return session_is_active(s); +} + +bool manager_is_inhibited( + Manager *m, + InhibitWhat w, + InhibitMode mm, + dual_timestamp *since, + bool ignore_inactive, + bool ignore_uid, + uid_t uid) { + Inhibitor *i; Iterator j; struct dual_timestamp ts = { 0, 0 }; @@ -364,6 +389,12 @@ bool manager_is_inhibited(Manager *m, InhibitWhat w, InhibitMode mm, dual_timest if (i->mode != mm) continue; + if (ignore_inactive && pid_is_active(m, i->pid) <= 0) + continue; + + if (ignore_uid && i->uid == uid) + continue; + if (!inhibited || i->since.monotonic < ts.monotonic) ts = i->since; @@ -378,22 +409,34 @@ bool manager_is_inhibited(Manager *m, InhibitWhat w, InhibitMode mm, dual_timest } const char *inhibit_what_to_string(InhibitWhat w) { - - static const char* const table[_INHIBIT_WHAT_MAX] = { - [0] = "", - [INHIBIT_SHUTDOWN] = "shutdown", - [INHIBIT_SLEEP] = "sleep", - [INHIBIT_IDLE] = "idle", - [INHIBIT_SHUTDOWN|INHIBIT_SLEEP] = "shutdown:sleep", - [INHIBIT_SHUTDOWN|INHIBIT_IDLE] = "shutdown:idle", - [INHIBIT_SHUTDOWN|INHIBIT_SLEEP|INHIBIT_IDLE] = "shutdown:sleep:idle", - [INHIBIT_SLEEP|INHIBIT_IDLE] = "sleep:idle" - }; + static __thread char buffer[97]; + char *p; if (w < 0 || w >= _INHIBIT_WHAT_MAX) return NULL; - return table[w]; + p = buffer; + if (w & INHIBIT_SHUTDOWN) + p = stpcpy(p, "shutdown:"); + if (w & INHIBIT_SLEEP) + p = stpcpy(p, "sleep:"); + if (w & INHIBIT_IDLE) + p = stpcpy(p, "idle:"); + if (w & INHIBIT_HANDLE_POWER_KEY) + p = stpcpy(p, "handle-power-key:"); + if (w & INHIBIT_HANDLE_SUSPEND_KEY) + p = stpcpy(p, "handle-suspend-key:"); + if (w & INHIBIT_HANDLE_HIBERNATE_KEY) + p = stpcpy(p, "handle-hibernate-key:"); + if (w & INHIBIT_HANDLE_LID_SWITCH) + p = stpcpy(p, "handle-lid-switch:"); + + if (p > buffer) + *(p-1) = 0; + else + *p = 0; + + return buffer; } InhibitWhat inhibit_what_from_string(const char *s) { @@ -402,18 +445,25 @@ InhibitWhat inhibit_what_from_string(const char *s) { size_t l; FOREACH_WORD_SEPARATOR(w, l, s, ":", state) { - if (l == 8 && strncmp(w, "shutdown", l) == 0) + if (l == 8 && strneq(w, "shutdown", l)) what |= INHIBIT_SHUTDOWN; - else if (l == 5 && strncmp(w, "sleep", l) == 0) + else if (l == 5 && strneq(w, "sleep", l)) what |= INHIBIT_SLEEP; - else if (l == 4 && strncmp(w, "idle", l) == 0) + else if (l == 4 && strneq(w, "idle", l)) what |= INHIBIT_IDLE; + else if (l == 16 && strneq(w, "handle-power-key", l)) + what |= INHIBIT_HANDLE_POWER_KEY; + else if (l == 18 && strneq(w, "handle-suspend-key", l)) + what |= INHIBIT_HANDLE_SUSPEND_KEY; + else if (l == 20 && strneq(w, "handle-hibernate-key", l)) + what |= INHIBIT_HANDLE_HIBERNATE_KEY; + else if (l == 17 && strneq(w, "handle-lid-switch", l)) + what |= INHIBIT_HANDLE_LID_SWITCH; else return _INHIBIT_WHAT_INVALID; } return what; - } static const char* const inhibit_mode_table[_INHIBIT_MODE_MAX] = {