diff options
-rw-r--r-- | src/path.c | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/src/path.c b/src/path.c index 1a3e28f89f..c722a45377 100644 --- a/src/path.c +++ b/src/path.c @@ -295,7 +295,7 @@ static void path_set_state(Path *p, PathState state) { unit_notify(UNIT(p), state_translation_table[old_state], state_translation_table[state], true); } -static void path_enter_waiting(Path *p, bool initial, bool recheck, bool skip_watch); +static void path_enter_waiting(Path *p, bool initial, bool recheck); static int path_coldplug(Unit *u) { Path *p = PATH(u); @@ -307,7 +307,7 @@ static int path_coldplug(Unit *u) { if (p->deserialized_state == PATH_WAITING || p->deserialized_state == PATH_RUNNING) - path_enter_waiting(p, true, true, false); + path_enter_waiting(p, true, true); else path_set_state(p, p->deserialized_state); } @@ -353,14 +353,11 @@ fail: dbus_error_free(&error); } - -static void path_enter_waiting(Path *p, bool initial, bool recheck, bool skip_watch) { +static bool path_check_good(Path *p, bool initial) { PathSpec *s; - int r; bool good = false; - if (!recheck) - goto waiting; + assert(p); LIST_FOREACH(spec, s, p->specs) { @@ -395,23 +392,32 @@ static void path_enter_waiting(Path *p, bool initial, bool recheck, bool skip_wa break; } - if (good) { - log_debug("%s got triggered.", p->meta.id); - path_enter_running(p); - return; - } + return good; +} -waiting: - if (!skip_watch) { - if ((r = path_watch(p)) < 0) - goto fail; +static void path_enter_waiting(Path *p, bool initial, bool recheck) { + int r; - /* Hmm, so now we have created inotify watches, but the file - * might have appeared/been removed by now, so we must - * recheck */ - path_enter_waiting(p, false, true, true); - return; - } + if (recheck) + if (path_check_good(p, initial)) { + log_debug("%s got triggered.", p->meta.id); + path_enter_running(p); + return; + } + + if ((r = path_watch(p)) < 0) + goto fail; + + /* Hmm, so now we have created inotify watches, but the file + * might have appeared/been removed by now, so we must + * recheck */ + + if (recheck) + if (path_check_good(p, false)) { + log_debug("%s got triggered.", p->meta.id); + path_enter_running(p); + return; + } path_set_state(p, PATH_WAITING); return; @@ -452,7 +458,7 @@ static int path_start(Unit *u) { path_mkdir(p); p->failure = false; - path_enter_waiting(p, true, true, false); + path_enter_waiting(p, true, true); return 0; } @@ -549,6 +555,8 @@ static void path_fd_event(Unit *u, int fd, uint32_t events, Watch *w) { goto fail; } + assert(l > 0); + if (!(buf = malloc(l))) { log_error("Failed to allocate buffer: %s", strerror(-ENOMEM)); goto fail; @@ -583,7 +591,7 @@ static void path_fd_event(Unit *u, int fd, uint32_t events, Watch *w) { if (changed) path_enter_running(p); else - path_enter_waiting(p, false, true, false); + path_enter_waiting(p, false, true); free(buf); @@ -632,7 +640,7 @@ void path_unit_notify(Unit *u, UnitActiveState new_state) { /* Hmm, so inotify was triggered since the * last activation, so I guess we need to * recheck what is going on. */ - path_enter_waiting(p, false, p->inotify_triggered, false); + path_enter_waiting(p, false, p->inotify_triggered); } } |