summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/shared/generator.c3
-rw-r--r--src/sysv-generator/sysv-generator.c31
-rwxr-xr-xtest/sysv-generator-test.py3
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),