From 874310b7b68c4c0d36ff07397db30a959bb7dae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 6 Feb 2013 22:49:19 -0500 Subject: [PATCH] systemd: do not remove empty paths from unit lookup path The ability to start a new unit with 'systemctl start ...' should not depend on whether there are other units in the directory. Previously, an additional 'systemctl daemon-reload' would be necessary to tell systemd to update the list of unit lookup paths. --- src/core/manager.c | 14 +++++++------- src/shared/path-lookup.c | 3 --- src/shared/path-util.c | 12 ++++++++---- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/core/manager.c b/src/core/manager.c index b538a9a3ae9..25aa1be12fa 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -621,14 +621,15 @@ int manager_coldplug(Manager *m) { static void manager_build_unit_path_cache(Manager *m) { char **i; - DIR *d = NULL; + DIR _cleanup_free_ *d = NULL; int r; assert(m); set_free_free(m->unit_path_cache); - if (!(m->unit_path_cache = set_new(string_hash_func, string_compare_func))) { + m->unit_path_cache = set_new(string_hash_func, string_compare_func); + if (!m->unit_path_cache) { log_error("Failed to allocate unit path cache."); return; } @@ -641,7 +642,8 @@ static void manager_build_unit_path_cache(Manager *m) { d = opendir(*i); if (!d) { - log_error("Failed to open directory: %m"); + if (errno != ENOENT) + log_error("Failed to open directory %s: %m", *i); continue; } @@ -657,7 +659,8 @@ static void manager_build_unit_path_cache(Manager *m) { goto fail; } - if ((r = set_put(m->unit_path_cache, p)) < 0) { + r = set_put(m->unit_path_cache, p); + if (r < 0) { free(p); goto fail; } @@ -674,9 +677,6 @@ fail: set_free_free(m->unit_path_cache); m->unit_path_cache = NULL; - - if (d) - closedir(d); } int manager_startup(Manager *m, FILE *serialization, FDSet *fds) { diff --git a/src/shared/path-lookup.c b/src/shared/path-lookup.c index 6e5529e0c72..8ee9ddc9c6e 100644 --- a/src/shared/path-lookup.c +++ b/src/shared/path-lookup.c @@ -316,7 +316,6 @@ int lookup_paths_init( return -ENOMEM; strv_uniq(p->unit_path); - path_strv_remove_empty(p->unit_path); if (!strv_isempty(p->unit_path)) { @@ -379,8 +378,6 @@ int lookup_paths_init( strv_uniq(p->sysvinit_path); strv_uniq(p->sysvrcnd_path); - path_strv_remove_empty(p->sysvinit_path); - path_strv_remove_empty(p->sysvrcnd_path); if (!strv_isempty(p->sysvinit_path)) { diff --git a/src/shared/path-util.c b/src/shared/path-util.c index dd12d3d6340..4857971b330 100644 --- a/src/shared/path-util.c +++ b/src/shared/path-util.c @@ -190,13 +190,17 @@ char **path_strv_canonicalize(char **l) { errno = 0; u = canonicalize_file_name(t); - free(t); if (!u) { - if (errno == ENOMEM || !errno) - enomem = true; + if (errno == ENOENT) + u = t; + else { + free(t); + if (errno == ENOMEM || !errno) + enomem = true; - continue; + continue; + } } l[k++] = u;