X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-inhibit.c;h=2007ec79e4b35a8ff12d1879bef8c5127ed313dc;hb=4943c1c94ba751c98763f4232b4350481b22c90a;hp=2f7a758e7cf2bba48efe87b6b500eee00f84b483;hpb=f8e2fb7b14e53f5a4bcfd66d26910af1dee185c6;p=elogind.git diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c index 2f7a758e7..2007ec79e 100644 --- a/src/login/logind-inhibit.c +++ b/src/login/logind-inhibit.c @@ -28,7 +28,7 @@ #include "util.h" #include "mkdir.h" - +#include "path-util.h" #include "logind-inhibit.h" Inhibitor* inhibitor_new(Manager *m, const char* id) { @@ -46,7 +46,7 @@ Inhibitor* inhibitor_new(Manager *m, const char* id) { return NULL; } - i->id = file_name_from_path(i->state_file); + i->id = path_get_file_name(i->state_file); if (hashmap_put(m->inhibitors, i->id, i) < 0) { free(i->state_file); @@ -97,9 +97,11 @@ int inhibitor_save(Inhibitor *i) { fprintf(f, "# This is private data. Do not parse.\n" "WHAT=%s\n" + "MODE=%s\n" "UID=%lu\n" "PID=%lu\n", inhibit_what_to_string(i->what), + inhibit_mode_to_string(i->mode), (unsigned long) i->uid, (unsigned long) i->pid); @@ -150,9 +152,12 @@ int inhibitor_start(Inhibitor *i) { if (i->started) return 0; - log_debug("Inhibitor %s (%s) pid=%lu uid=%lu started.", + dual_timestamp_get(&i->since); + + log_debug("Inhibitor %s (%s) pid=%lu uid=%lu mode=%s started.", strna(i->who), strna(i->why), - (unsigned long) i->pid, (unsigned long) i->uid); + (unsigned long) i->pid, (unsigned long) i->uid, + inhibit_mode_to_string(i->mode)); inhibitor_save(i); @@ -167,9 +172,10 @@ int inhibitor_stop(Inhibitor *i) { assert(i); if (i->started) - log_debug("Inhibitor %s (%s) pid=%lu uid=%lu stopped.", + log_debug("Inhibitor %s (%s) pid=%lu uid=%lu mode=%s stopped.", strna(i->who), strna(i->why), - (unsigned long) i->pid, (unsigned long) i->uid); + (unsigned long) i->pid, (unsigned long) i->uid, + inhibit_mode_to_string(i->mode)); if (i->state_file) unlink(i->state_file); @@ -183,13 +189,15 @@ int inhibitor_stop(Inhibitor *i) { int inhibitor_load(Inhibitor *i) { InhibitWhat w; + InhibitMode mm; int r; char *cc, *what = NULL, *uid = NULL, *pid = NULL, *who = NULL, - *why = NULL; + *why = NULL, + *mode = NULL; r = parse_env_file(i->state_file, NEWLINE, "WHAT", &what, @@ -197,17 +205,25 @@ int inhibitor_load(Inhibitor *i) { "PID", &pid, "WHO", &who, "WHY", &why, + "MODE", &mode, "FIFO", &i->fifo_path, NULL); if (r < 0) goto finish; - w = inhibit_what_from_string(what); + w = what ? inhibit_what_from_string(what) : 0; if (w >= 0) i->what = w; - parse_uid(uid, &i->uid); - parse_pid(pid, &i->pid); + mm = mode ? inhibit_mode_from_string(mode) : INHIBIT_BLOCK; + if (mm >= 0) + i->mode = mm; + + if (uid) + parse_uid(uid, &i->uid); + + if (pid) + parse_pid(pid, &i->pid); if (who) { cc = cunescape(who); @@ -312,7 +328,7 @@ void inhibitor_remove_fifo(Inhibitor *i) { } } -InhibitWhat manager_inhibit_what(Manager *m) { +InhibitWhat manager_inhibit_what(Manager *m, InhibitMode mm) { Inhibitor *i; Iterator j; InhibitWhat what = 0; @@ -320,22 +336,52 @@ InhibitWhat manager_inhibit_what(Manager *m) { assert(m); HASHMAP_FOREACH(i, m->inhibitor_fds, j) - what |= i->what; + if (i->mode == mm) + what |= i->what; return what; } +bool manager_is_inhibited(Manager *m, InhibitWhat w, InhibitMode mm, dual_timestamp *since) { + Inhibitor *i; + Iterator j; + struct dual_timestamp ts = { 0, 0 }; + bool inhibited = false; + + assert(m); + assert(w > 0 && w < _INHIBIT_WHAT_MAX); + + HASHMAP_FOREACH(i, m->inhibitor_fds, j) { + if (!(i->what & w)) + continue; + + if (i->mode != mm) + continue; + + if (!inhibited || + i->since.monotonic < ts.monotonic) + ts = i->since; + + inhibited = true; + } + + if (since) + *since = ts; + + return inhibited; +} + const char *inhibit_what_to_string(InhibitWhat w) { static const char* const table[_INHIBIT_WHAT_MAX] = { [0] = "", [INHIBIT_SHUTDOWN] = "shutdown", - [INHIBIT_SUSPEND] = "suspend", + [INHIBIT_SLEEP] = "sleep", [INHIBIT_IDLE] = "idle", - [INHIBIT_SHUTDOWN|INHIBIT_SUSPEND] = "shutdown:suspend", + [INHIBIT_SHUTDOWN|INHIBIT_SLEEP] = "shutdown:sleep", [INHIBIT_SHUTDOWN|INHIBIT_IDLE] = "shutdown:idle", - [INHIBIT_SHUTDOWN|INHIBIT_SUSPEND|INHIBIT_IDLE] = "shutdown:suspend:idle", - [INHIBIT_SUSPEND|INHIBIT_IDLE] = "suspend:idle" + [INHIBIT_SHUTDOWN|INHIBIT_SLEEP|INHIBIT_IDLE] = "shutdown:sleep:idle", + [INHIBIT_SLEEP|INHIBIT_IDLE] = "sleep:idle" }; if (w < 0 || w >= _INHIBIT_WHAT_MAX) @@ -352,8 +398,8 @@ InhibitWhat inhibit_what_from_string(const char *s) { FOREACH_WORD_SEPARATOR(w, l, s, ":", state) { if (l == 8 && strncmp(w, "shutdown", l) == 0) what |= INHIBIT_SHUTDOWN; - else if (l == 7 && strncmp(w, "suspend", l) == 0) - what |= INHIBIT_SUSPEND; + else if (l == 5 && strncmp(w, "sleep", l) == 0) + what |= INHIBIT_SLEEP; else if (l == 4 && strncmp(w, "idle", l) == 0) what |= INHIBIT_IDLE; else @@ -363,3 +409,10 @@ InhibitWhat inhibit_what_from_string(const char *s) { return what; } + +static const char* const inhibit_mode_table[_INHIBIT_MODE_MAX] = { + [INHIBIT_BLOCK] = "block", + [INHIBIT_DELAY] = "delay" +}; + +DEFINE_STRING_TABLE_LOOKUP(inhibit_mode, InhibitMode);