X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fpath.c;h=6be9ac84bed841393fd364d8ee14381da8ce3ce8;hb=a3b23257872fe2f8cf99aa2da008f55ada583bb3;hp=f54c77f6c3980804ececcf23a1286221adf37a7c;hpb=18abe7bd3e13525b257da69ac49ff7841c289567;p=elogind.git diff --git a/src/core/path.c b/src/core/path.c index f54c77f6c..6be9ac84b 100644 --- a/src/core/path.c +++ b/src/core/path.c @@ -21,7 +21,6 @@ #include #include -#include #include #include @@ -31,7 +30,6 @@ #include "mkdir.h" #include "dbus-path.h" #include "special.h" -#include "path-util.h" #include "macro.h" #include "bus-util.h" #include "bus-error.h" @@ -136,7 +134,7 @@ int path_spec_watch(PathSpec *s, sd_event_io_handler_t handler) { } if (!exists) { - log_error("Failed to add watch on any of the components of %s: %m", + log_error_errno(errno, "Failed to add watch on any of the components of %s: %m", s->path); r = -errno; /* either EACCESS or ENOENT */ goto fail; @@ -157,10 +155,9 @@ void path_spec_unwatch(PathSpec *s) { } int path_spec_fd_event(PathSpec *s, uint32_t revents) { - _cleanup_free_ uint8_t *buf = NULL; + union inotify_event_buffer buffer; struct inotify_event *e; - ssize_t k; - int l; + ssize_t l; int r = 0; if (revents != EPOLLIN) { @@ -168,37 +165,18 @@ int path_spec_fd_event(PathSpec *s, uint32_t revents) { return -EINVAL; } - if (ioctl(s->inotify_fd, FIONREAD, &l) < 0) { - log_error("FIONREAD failed: %m"); - return -errno; - } - - assert(l > 0); + l = read(s->inotify_fd, &buffer, sizeof(buffer)); + if (l < 0) { + if (errno == EAGAIN || errno == EINTR) + return 0; - buf = malloc(l); - if (!buf) - return log_oom(); - - k = read(s->inotify_fd, buf, l); - if (k < 0) { - log_error("Failed to read inotify event: %m"); - return -errno; + return log_error_errno(errno, "Failed to read inotify event: %m"); } - e = (struct inotify_event*) buf; - - while (k > 0) { - size_t step; - + FOREACH_INOTIFY_EVENT(e, buffer, l) { if ((s->type == PATH_CHANGED || s->type == PATH_MODIFIED) && s->primary_wd == e->wd) r = 1; - - step = sizeof(struct inotify_event) + e->len; - assert(step <= (size_t) k); - - e = (struct inotify_event*) ((uint8_t*) e + step); - k -= step; } return r; @@ -250,7 +228,7 @@ static void path_spec_mkdir(PathSpec *s, mode_t mode) { r = mkdir_p_label(s->path, mode); if (r < 0) - log_warning("mkdir(%s) failed: %s", s->path, strerror(-r)); + log_warning_errno(r, "mkdir(%s) failed: %m", s->path); } static void path_spec_dump(PathSpec *s, FILE *f, const char *prefix) { @@ -320,7 +298,7 @@ static int path_verify(Path *p) { return 0; if (!p->specs) { - log_error_unit(UNIT(p)->id, + log_unit_error(UNIT(p)->id, "%s lacks path setting. Refusing.", UNIT(p)->id); return -EINVAL; } @@ -460,7 +438,12 @@ static void path_set_state(Path *p, PathState state) { static void path_enter_waiting(Path *p, bool initial, bool recheck); -static int path_coldplug(Unit *u) { +static int path_enter_waiting_coldplug(Unit *u) { + path_enter_waiting(PATH(u), true, true); + return 0; +} + +static int path_coldplug(Unit *u, Hashmap *deferred_work) { Path *p = PATH(u); assert(p); @@ -469,9 +452,10 @@ static int path_coldplug(Unit *u) { if (p->deserialized_state != p->state) { if (p->deserialized_state == PATH_WAITING || - p->deserialized_state == PATH_RUNNING) - path_enter_waiting(p, true, true); - else + p->deserialized_state == PATH_RUNNING) { + hashmap_put(deferred_work, u, &path_enter_waiting_coldplug); + path_set_state(p, PATH_WAITING); + } else path_set_state(p, p->deserialized_state); } @@ -562,8 +546,7 @@ static void path_enter_waiting(Path *p, bool initial, bool recheck) { return; fail: - log_warning("%s failed to enter waiting state: %s", - UNIT(p)->id, strerror(-r)); + log_warning_errno(r, "%s failed to enter waiting state: %m", UNIT(p)->id); path_enter_dead(p, PATH_FAILURE_RESOURCES); } @@ -593,7 +576,7 @@ static int path_start(Unit *u) { p->result = PATH_SUCCESS; path_enter_waiting(p, true, true); - return 0; + return 1; } static int path_stop(Unit *u) { @@ -603,7 +586,7 @@ static int path_stop(Unit *u) { assert(p->state == PATH_WAITING || p->state == PATH_RUNNING); path_enter_dead(p, PATH_SUCCESS); - return 0; + return 1; } static int path_serialize(Unit *u, FILE *f, FDSet *fds) { @@ -724,7 +707,7 @@ static void path_trigger_notify(Unit *u, Unit *other) { if (p->state == PATH_RUNNING && UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other))) { - log_debug_unit(UNIT(p)->id, + log_unit_debug(UNIT(p)->id, "%s got notified about unit deactivation.", UNIT(p)->id);