diff options
author | Michal Schmidt <mschmidt@redhat.com> | 2010-12-01 15:39:52 +0100 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2010-12-01 16:39:58 +0100 |
commit | 67575eef76e99cc03b2860f8a93009a34ce37583 (patch) | |
tree | 4b4f3e1779c9a48b65ba3130e9f769e7db9f942e | |
parent | 550c4dcc4184d5c4d55d3786b66797e5fb99c30a (diff) |
path: fix watching the root directory
If you have a path unit with:
DirectoryNotEmpty=/foo
and "/foo" does not exist, creating it later escapes the attention of systemd.
When adding watches for parent directories, systemd never adds one for the root
directory. It attempts to add a watch for an empty string instead, which fails.
If the path is "/", we must not trim the slash.
-rw-r--r-- | src/path.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/path.c b/src/path.c index 0d59419777..77de32d1d6 100644 --- a/src/path.c +++ b/src/path.c @@ -189,7 +189,7 @@ static int path_watch_one(Path *p, PathSpec *s) { }; bool exists = false; - char *k; + char *k, *slash; int r; assert(p); @@ -213,15 +213,15 @@ static int path_watch_one(Path *p, PathSpec *s) { if ((s->primary_wd = inotify_add_watch(s->inotify_fd, k, flags_table[s->type])) >= 0) exists = true; - for (;;) { + do { int flags; - char *slash; /* This assumes the path was passed through path_kill_slashes()! */ if (!(slash = strrchr(k, '/'))) break; - *slash = 0; + /* 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; if (!exists) @@ -229,7 +229,7 @@ static int path_watch_one(Path *p, PathSpec *s) { if (inotify_add_watch(s->inotify_fd, k, flags) >= 0) exists = true; - } + } while (slash != k); return 0; |