X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fpath.c;h=6be9ac84bed841393fd364d8ee14381da8ce3ce8;hb=340a1d2330ddc1dd18ad75bcdddf32f63c84b4a1;hp=656ed6941d9037f7aa3acae08fc7740e6ad7da1d;hpb=f7c1ad4fd4190bee32db0aa26c8e9fe7e19d8816;p=elogind.git diff --git a/src/core/path.c b/src/core/path.c index 656ed6941..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" @@ -157,7 +155,7 @@ void path_spec_unwatch(PathSpec *s) { } int path_spec_fd_event(PathSpec *s, uint32_t revents) { - uint8_t buffer[INOTIFY_EVENT_MAX] _alignas_(struct inotify_event); + union inotify_event_buffer buffer; struct inotify_event *e; ssize_t l; int r = 0; @@ -167,7 +165,7 @@ int path_spec_fd_event(PathSpec *s, uint32_t revents) { return -EINVAL; } - l = read(s->inotify_fd, buffer, sizeof(buffer)); + l = read(s->inotify_fd, &buffer, sizeof(buffer)); if (l < 0) { if (errno == EAGAIN || errno == EINTR) return 0; @@ -440,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); @@ -449,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); } @@ -572,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) { @@ -582,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) {