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=f1b9cca834c95eb1b40c68646e5fc45b990d8a5c;hp=2007ec79e4b35a8ff12d1879bef8c5127ed313dc;hb=2a7cccf065c73abfe263d9c0b24bab24b6e68f29;hpb=4943c1c94ba751c98763f4232b4350481b22c90a diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c index 2007ec79e..f1b9cca83 100644 --- a/src/login/logind-inhibit.c +++ b/src/login/logind-inhibit.c @@ -84,7 +84,7 @@ int inhibitor_save(Inhibitor *i) { assert(i); - r = safe_mkdir("/run/systemd/inhibit", 0755, 0, 0); + r = mkdir_safe_label("/run/systemd/inhibit", 0755, 0, 0); if (r < 0) goto finish; @@ -163,7 +163,7 @@ int inhibitor_start(Inhibitor *i) { i->started = true; - manager_send_changed(i->manager, "Inhibited\0"); + manager_send_changed(i->manager, i->mode == INHIBIT_BLOCK ? "BlockInhibited\0" : "DelayInhibited\0"); return 0; } @@ -182,7 +182,7 @@ int inhibitor_stop(Inhibitor *i) { i->started = false; - manager_send_changed(i->manager, "Inhibited\0"); + manager_send_changed(i->manager, i->mode == INHIBIT_BLOCK ? "BlockInhibited\0" : "DelayInhibited\0"); return 0; } @@ -219,11 +219,17 @@ int inhibitor_load(Inhibitor *i) { if (mm >= 0) i->mode = mm; - if (uid) - parse_uid(uid, &i->uid); + if (uid) { + r = parse_uid(uid, &i->uid); + if (r < 0) + goto finish; + } - if (pid) - parse_pid(pid, &i->pid); + if (pid) { + r = parse_pid(pid, &i->pid); + if (r < 0) + goto finish; + } if (who) { cc = cunescape(who); @@ -272,7 +278,7 @@ int inhibitor_create_fifo(Inhibitor *i) { /* Create FIFO */ if (!i->fifo_path) { - r = safe_mkdir("/run/systemd/inhibit", 0755, 0, 0); + r = mkdir_safe_label("/run/systemd/inhibit", 0755, 0, 0); if (r < 0) return r; @@ -297,7 +303,7 @@ int inhibitor_create_fifo(Inhibitor *i) { zero(ev); ev.events = 0; - ev.data.u32 = FD_FIFO_BASE + i->fifo_fd; + ev.data.u32 = FD_OTHER_BASE + i->fifo_fd; if (epoll_ctl(i->manager->epoll_fd, EPOLL_CTL_ADD, i->fifo_fd, &ev) < 0) return -errno; @@ -342,7 +348,26 @@ 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; + + 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 }; @@ -358,6 +383,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; @@ -372,22 +403,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,12 +445,19 @@ InhibitWhat inhibit_what_from_string(const char *s) { what |= INHIBIT_SLEEP; else if (l == 4 && strncmp(w, "idle", l) == 0) what |= INHIBIT_IDLE; + else if (l == 16 && strncmp(w, "handle-power-key", l) == 0) + what |= INHIBIT_HANDLE_POWER_KEY; + else if (l == 18 && strncmp(w, "handle-suspend-key", l) == 0) + what |= INHIBIT_HANDLE_SUSPEND_KEY; + else if (l == 20 && strncmp(w, "handle-hibernate-key", l) == 0) + what |= INHIBIT_HANDLE_HIBERNATE_KEY; + else if (l == 17 && strncmp(w, "handle-lid-switch", l) == 0) + what |= INHIBIT_HANDLE_LID_SWITCH; else return _INHIBIT_WHAT_INVALID; } return what; - } static const char* const inhibit_mode_table[_INHIBIT_MODE_MAX] = {