]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sysv-generator: use generator_add_symlink()
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 10 Jul 2017 03:59:30 +0000 (23:59 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 13 Jul 2017 22:56:36 +0000 (18:56 -0400)
generator_add_symlink() is extended to ignore EEXIST. This should be fine
for all existing callers.

There's a small difference in behaviour when adding symlinks in sysv-generator:
the message is more generic and does not include ", ignored". But creation of
symlinks shouldn't ever fail except if things are very wrong, so in practice
this shouldn't matter.

Test needed updating: os.path.exists(os.readlink(link)) only works if the link
is absolute (or if we are in the right directory). Let's just use
os.path.exists(link), which properly tests that the symlink target exists.

src/shared/generator.c
src/sysv-generator/sysv-generator.c
test/sysv-generator-test.py

index 0a829dc9af30f9931c74fa9e6dba632f80d466b4..2f459bf778646d4e8c7f6dcb7efef25949e775da 100644 (file)
@@ -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;
 }
index 98280784439610596454119a2cd4c4d58967b258..3f3237d9b3822c26f8b129fce8c3aa7ca7580c46 100644 (file)
@@ -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;
 }
index d116fffe38fdb2ec16c6e4df08460475ecac2ad6..99e323db3b2c36a13c8ca9de83553a3b4e788ece 100755 (executable)
@@ -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),