summaryrefslogtreecommitdiff
path: root/src/login/logind-inhibit.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-11-05 01:10:21 +0100
committerLennart Poettering <lennart@poettering.net>2013-11-05 01:13:05 +0100
commitcc3773810855956bad92337cee8fa193584ab62e (patch)
treeea8a067a1b879d0ef11bac1dbc99757d8ad7b445 /src/login/logind-inhibit.c
parent6d1bd3b2bbae29dbd3862fdb9af2b472b01c480e (diff)
logind: port logind to libsystemd-bus
Diffstat (limited to 'src/login/logind-inhibit.c')
-rw-r--r--src/login/logind-inhibit.c106
1 files changed, 54 insertions, 52 deletions
diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c
index e77088364a..3bc4642071 100644
--- a/src/login/logind-inhibit.c
+++ b/src/login/logind-inhibit.c
@@ -21,7 +21,6 @@
#include <errno.h>
#include <fcntl.h>
-#include <sys/epoll.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
@@ -64,12 +63,13 @@ Inhibitor* inhibitor_new(Manager *m, const char* id) {
void inhibitor_free(Inhibitor *i) {
assert(i);
- free(i->who);
- free(i->why);
-
hashmap_remove(i->manager->inhibitors, i->id);
+
inhibitor_remove_fifo(i);
+ free(i->who);
+ free(i->why);
+
if (i->state_file) {
unlink(i->state_file);
free(i->state_file);
@@ -79,9 +79,9 @@ void inhibitor_free(Inhibitor *i) {
}
int inhibitor_save(Inhibitor *i) {
- char *temp_path, *cc;
+ _cleanup_free_ char *temp_path = NULL;
+ _cleanup_fclose_ FILE *f = NULL;
int r;
- FILE *f;
assert(i);
@@ -107,23 +107,23 @@ int inhibitor_save(Inhibitor *i) {
(unsigned long) i->pid);
if (i->who) {
+ _cleanup_free_ char *cc = NULL;
+
cc = cescape(i->who);
if (!cc)
r = -ENOMEM;
- else {
+ else
fprintf(f, "WHO=%s\n", cc);
- free(cc);
- }
}
if (i->why) {
+ _cleanup_free_ char *cc = NULL;
+
cc = cescape(i->why);
if (!cc)
r = -ENOMEM;
- else {
+ else
fprintf(f, "WHY=%s\n", cc);
- free(cc);
- }
}
if (i->fifo_path)
@@ -137,9 +137,6 @@ int inhibitor_save(Inhibitor *i) {
unlink(temp_path);
}
- fclose(f);
- free(temp_path);
-
finish:
if (r < 0)
log_error("Failed to save inhibit data for %s: %s", i->id, strerror(-r));
@@ -164,7 +161,7 @@ int inhibitor_start(Inhibitor *i) {
i->started = true;
- manager_send_changed(i->manager, i->mode == INHIBIT_BLOCK ? "BlockInhibited\0" : "DelayInhibited\0");
+ manager_send_changed(i->manager, i->mode == INHIBIT_BLOCK ? "BlockInhibited" : "DelayInhibited", NULL);
return 0;
}
@@ -183,16 +180,14 @@ int inhibitor_stop(Inhibitor *i) {
i->started = false;
- manager_send_changed(i->manager, i->mode == INHIBIT_BLOCK ? "BlockInhibited\0" : "DelayInhibited\0");
+ manager_send_changed(i->manager, i->mode == INHIBIT_BLOCK ? "BlockInhibited" : "DelayInhibited", NULL);
return 0;
}
int inhibitor_load(Inhibitor *i) {
- InhibitWhat w;
- InhibitMode mm;
- int r;
- char *cc,
+
+ _cleanup_free_ char
*what = NULL,
*uid = NULL,
*pid = NULL,
@@ -200,6 +195,11 @@ int inhibitor_load(Inhibitor *i) {
*why = NULL,
*mode = NULL;
+ InhibitWhat w;
+ InhibitMode mm;
+ char *cc;
+ int r;
+
r = parse_env_file(i->state_file, NEWLINE,
"WHAT", &what,
"UID", &uid,
@@ -210,7 +210,7 @@ int inhibitor_load(Inhibitor *i) {
"FIFO", &i->fifo_path,
NULL);
if (r < 0)
- goto finish;
+ return r;
w = what ? inhibit_what_from_string(what) : 0;
if (w >= 0)
@@ -223,21 +223,19 @@ int inhibitor_load(Inhibitor *i) {
if (uid) {
r = parse_uid(uid, &i->uid);
if (r < 0)
- goto finish;
+ return r;
}
if (pid) {
r = parse_pid(pid, &i->pid);
if (r < 0)
- goto finish;
+ return r;
}
if (who) {
cc = cunescape(who);
- if (!cc) {
- r = -ENOMEM;
- goto finish;
- }
+ if (!cc)
+ return -ENOMEM;
free(i->who);
i->who = cc;
@@ -245,10 +243,8 @@ int inhibitor_load(Inhibitor *i) {
if (why) {
cc = cunescape(why);
- if (!cc) {
- r = -ENOMEM;
- goto finish;
- }
+ if (!cc)
+ return -ENOMEM;
free(i->why);
i->why = cc;
@@ -262,14 +258,20 @@ int inhibitor_load(Inhibitor *i) {
close_nointr_nofail(fd);
}
-finish:
- free(what);
- free(uid);
- free(pid);
- free(who);
- free(why);
+ return 0;
+}
- return r;
+static int inhibitor_dispatch_fifo(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
+ Inhibitor *i = userdata;
+
+ assert(s);
+ assert(fd == i->fifo_fd);
+ assert(i);
+
+ inhibitor_stop(i);
+ inhibitor_free(i);
+
+ return 0;
}
int inhibitor_create_fifo(Inhibitor *i) {
@@ -283,7 +285,8 @@ int inhibitor_create_fifo(Inhibitor *i) {
if (r < 0)
return r;
- if (asprintf(&i->fifo_path, "/run/systemd/inhibit/%s.ref", i->id) < 0)
+ i->fifo_path = strjoin("/run/systemd/inhibit/", i->id, ".ref", NULL);
+ if (!i->fifo_path)
return -ENOMEM;
if (mkfifo(i->fifo_path, 0600) < 0 && errno != EEXIST)
@@ -292,21 +295,19 @@ int inhibitor_create_fifo(Inhibitor *i) {
/* Open reading side */
if (i->fifo_fd < 0) {
- struct epoll_event ev = {};
-
i->fifo_fd = open(i->fifo_path, O_RDONLY|O_CLOEXEC|O_NDELAY);
if (i->fifo_fd < 0)
return -errno;
+ }
- r = hashmap_put(i->manager->inhibitor_fds, INT_TO_PTR(i->fifo_fd + 1), i);
+ if (!i->event_source) {
+ r = sd_event_add_io(i->manager->event, i->fifo_fd, 0, inhibitor_dispatch_fifo, i, &i->event_source);
if (r < 0)
return r;
- ev.events = 0;
- 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;
+ r = sd_event_source_set_priority(i->event_source, SD_PRIORITY_IDLE);
+ if (r < 0)
+ return r;
}
/* Open writing side */
@@ -320,9 +321,10 @@ int inhibitor_create_fifo(Inhibitor *i) {
void inhibitor_remove_fifo(Inhibitor *i) {
assert(i);
+ if (i->event_source)
+ i->event_source = sd_event_source_unref(i->event_source);
+
if (i->fifo_fd >= 0) {
- assert_se(hashmap_remove(i->manager->inhibitor_fds, INT_TO_PTR(i->fifo_fd + 1)) == i);
- assert_se(epoll_ctl(i->manager->epoll_fd, EPOLL_CTL_DEL, i->fifo_fd, NULL) == 0);
close_nointr_nofail(i->fifo_fd);
i->fifo_fd = -1;
}
@@ -341,7 +343,7 @@ InhibitWhat manager_inhibit_what(Manager *m, InhibitMode mm) {
assert(m);
- HASHMAP_FOREACH(i, m->inhibitor_fds, j)
+ HASHMAP_FOREACH(i, m->inhibitors, j)
if (i->mode == mm)
what |= i->what;
@@ -381,7 +383,7 @@ bool manager_is_inhibited(
assert(m);
assert(w > 0 && w < _INHIBIT_WHAT_MAX);
- HASHMAP_FOREACH(i, m->inhibitor_fds, j) {
+ HASHMAP_FOREACH(i, m->inhibitors, j) {
if (!(i->what & w))
continue;