summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tremer <michael.tremer@ipfire.org>2013-05-19 15:45:48 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-05-21 09:23:51 -0400
commit67820a0cbdc9d72a1074debf8b2bc72203c775cc (patch)
tree64fead0aa2275d7ab81319d533ecd99cb7d2d303
parent9e9c3abcfa6b93500960531d0d7aa64b8b2b0349 (diff)
systemctl: make systemctl is-enabled work for templated units
Patch resolves the problem that 'systemctl is-enabled' does not work for templated units. Without this patch, systemctl is-enabled something@abc.service returned "No such file or directory", because it first checked if /usr/lib/systemd/system/something@abc.service, etc. exists. If systemctl is-enabled is called for templated units, this check should be omitted and it should search for symlinks in the .wants dirs right away. This patch fixes the broken behaviour and resolves https://bugs.freedesktop.org/show_bug.cgi?id=55318. [zj: fixed the patch to still check for broken symlinks and masked instances. Also removed untrue assumptions from the patch description.]
-rw-r--r--src/shared/install.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/src/shared/install.c b/src/shared/install.c
index edf4d2a9f..8f27c6d47 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -1609,24 +1609,29 @@ UnitFileState unit_file_get_state(
if (!path)
return -ENOMEM;
+ /*
+ * Search for a unit file in our default paths, to
+ * be sure, that there are no broken symlinks.
+ */
if (lstat(path, &st) < 0) {
r = -errno;
- if (errno == ENOENT)
- continue;
-
- return -errno;
- }
+ if (errno != ENOENT)
+ return r;
- if (!S_ISREG(st.st_mode) && !S_ISLNK(st.st_mode))
- return -ENOENT;
+ if (!unit_name_is_instance(name))
+ continue;
+ } else {
+ if (!S_ISREG(st.st_mode) && !S_ISLNK(st.st_mode))
+ return -ENOENT;
- r = null_or_empty_path(path);
- if (r < 0 && r != -ENOENT)
- return r;
- else if (r > 0) {
- state = path_startswith(*i, "/run") ?
- UNIT_FILE_MASKED_RUNTIME : UNIT_FILE_MASKED;
- return state;
+ r = null_or_empty_path(path);
+ if (r < 0 && r != -ENOENT)
+ return r;
+ else if (r > 0) {
+ state = path_startswith(*i, "/run") ?
+ UNIT_FILE_MASKED_RUNTIME : UNIT_FILE_MASKED;
+ return state;
+ }
}
r = find_symlinks_in_scope(scope, root_dir, name, &state);