diff options
-rw-r--r-- | src/shared/generator.c | 3 | ||||
-rw-r--r-- | src/sysv-generator/sysv-generator.c | 31 | ||||
-rwxr-xr-x | test/sysv-generator-test.py | 3 |
3 files changed, 7 insertions, 30 deletions
diff --git a/src/shared/generator.c b/src/shared/generator.c index 0a829dc9af..2f459bf778 100644 --- a/src/shared/generator.c +++ b/src/shared/generator.c @@ -47,7 +47,8 @@ int generator_add_symlink(const char *root, const char *dst, const char *dep_typ mkdir_parents_label(to, 0755); if (symlink(from, to) < 0) - return log_error_errno(errno, "Failed to create symlink \"%s\": %m", to); + if (errno != EEXIST) + return log_error_errno(errno, "Failed to create symlink \"%s\": %m", to); return 0; } diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c index 9828078443..3f3237d9b3 100644 --- a/src/sysv-generator/sysv-generator.c +++ b/src/sysv-generator/sysv-generator.c @@ -28,6 +28,7 @@ #include "exit-status.h" #include "fd-util.h" #include "fileio.h" +#include "generator.h" #include "hashmap.h" #include "hexdecoct.h" #include "install.h" @@ -101,29 +102,6 @@ static void free_sysvstub_hashmapp(Hashmap **h) { hashmap_free(*h); } -static int add_symlink(const char *service, const char *where) { - const char *from, *to; - int r; - - assert(service); - assert(where); - - from = strjoina(arg_dest, "/", service); - to = strjoina(arg_dest, "/", where, ".wants/", service); - - mkdir_parents_label(to, 0755); - - r = symlink(from, to); - if (r < 0) { - if (errno == EEXIST) - return 0; - - return -errno; - } - - return 1; -} - static int add_alias(const char *service, const char *alias) { const char *link; int r; @@ -219,11 +197,8 @@ static int generate_unit_file(SysvStub *s) { if (r < 0) return log_error_errno(r, "Failed to write unit %s: %m", unit); - STRV_FOREACH(p, s->wanted_by) { - r = add_symlink(s->name, *p); - if (r < 0) - log_warning_errno(r, "Failed to create 'Wants' symlink to %s, ignoring: %m", *p); - } + STRV_FOREACH(p, s->wanted_by) + (void) generator_add_symlink(arg_dest, *p, "wants", s->name); return 1; } diff --git a/test/sysv-generator-test.py b/test/sysv-generator-test.py index d116fffe38..99e323db3b 100755 --- a/test/sysv-generator-test.py +++ b/test/sysv-generator-test.py @@ -153,7 +153,8 @@ class SysvGeneratorTest(unittest.TestCase): link = os.path.join(self.out_dir, '%s.target.wants' % target, unit) if target in targets: unit_file = os.readlink(link) - self.assertTrue(os.path.exists(unit_file)) + # os.path.exists() will fail on a dangling symlink + self.assertTrue(os.path.exists(link)) self.assertEqual(os.path.basename(unit_file), unit) else: self.assertFalse(os.path.exists(link), |