summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-06-15 17:02:27 -0400
committerLennart Poettering <lennart@poettering.net>2016-06-15 23:02:27 +0200
commita1feacf77f324f8af43de7f994372fbc72d58ae9 (patch)
treedb35ca3d1b19ef0fb225a64b903a5867bf3faf52 /src/core
parent77d4acf332abd24025f31455f492fa83d97cb2e1 (diff)
load-fragment: ignore ENOTDIR/EACCES errors (#3510)
If for whatever reason the file system is "corrupted", we want to be resilient and ignore the error, as long as we can load the units from a different place. Arch bug https://bugs.archlinux.org/task/49547. A user had an ntfs symlink (essentially a file) instead of a directory after restoring from backup. We should just ignore that like we would treat a missing directory, for general resiliency. We should treat permission errors similarly. For example an unreadable /usr/local/lib directory would prevent (user) instances of systemd from loading any units. It seems better to continue.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/load-fragment.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index 17c72aed88..d42f517354 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -3830,7 +3830,15 @@ static int load_from_path(Unit *u, const char *path) {
if (r >= 0)
break;
filename = mfree(filename);
- if (r != -ENOENT)
+
+ /* ENOENT means that the file is missing or is a dangling symlink.
+ * ENOTDIR means that one of paths we expect to be is a directory
+ * is not a directory, we should just ignore that.
+ * EACCES means that the directory or file permissions are wrong.
+ */
+ if (r == -EACCES)
+ log_debug_errno(r, "Cannot access \"%s\": %m", filename);
+ else if (!IN_SET(r, -ENOENT, -ENOTDIR))
return r;
/* Empty the symlink names for the next run */