/* Trim the path at the last slash. Keep the slash if it's the root dir. */
slash[slash == k] = 0;
- flags = IN_DELETE_SELF|IN_MOVE_SELF|IN_ATTRIB;
+ flags = IN_MOVE_SELF;
if (!exists)
- flags |= IN_CREATE | IN_MOVED_TO;
+ flags |= IN_DELETE_SELF | IN_ATTRIB | IN_CREATE | IN_MOVED_TO;
if (inotify_add_watch(s->inotify_fd, k, flags) >= 0)
exists = true;
path_state_to_string(old_state),
path_state_to_string(state));
- unit_notify(UNIT(p), state_translation_table[old_state], state_translation_table[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);
+static void path_enter_waiting(Path *p, bool initial, bool recheck, bool skip_watch);
static int path_coldplug(Unit *u) {
Path *p = PATH(u);
if (p->deserialized_state == PATH_WAITING ||
p->deserialized_state == PATH_RUNNING)
- path_enter_waiting(p, true, true);
+ path_enter_waiting(p, true, true, false);
else
path_set_state(p, p->deserialized_state);
}
}
-static void path_enter_waiting(Path *p, bool initial, bool recheck) {
+static void path_enter_waiting(Path *p, bool initial, bool recheck, bool skip_watch) {
PathSpec *s;
int r;
bool good = false;
}
waiting:
- if ((r = path_watch(p)) < 0)
- goto fail;
+ if (!skip_watch) {
+ 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 */
+ path_enter_waiting(p, false, true, true);
+ return;
+ }
path_set_state(p, PATH_WAITING);
return;
return -ENOENT;
p->failure = false;
- path_enter_waiting(p, true, true);
+ path_enter_waiting(p, true, true, false);
return 0;
}
if (changed)
path_enter_running(p);
else
- path_enter_waiting(p, false, true);
+ path_enter_waiting(p, false, true, false);
free(buf);
/* 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);
+ path_enter_waiting(p, false, p->inotify_triggered, false);
}
}