[systemd-devel] [PATCH] sysv-generator: do not generate 'Wants' symlinks to generated service files that will be shadowed by a native unit.

Jon Severinsson jon at severinsson.net
Wed Jul 16 02:57:49 PDT 2014


---
 src/sysv-generator/sysv-generator.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c
index 5206279..aff5fd6 100644
--- a/src/sysv-generator/sysv-generator.c
+++ b/src/sysv-generator/sysv-generator.c
@@ -113,7 +113,26 @@ static int add_symlink(const char *service, const char *where) {
         return 1;
 }
 
-static int generate_unit_file(SysvStub *s) {
+static int native_unit_exists(LookupPaths lp, char *name) {
+        char **p;
+
+        STRV_FOREACH(p, lp.unit_path) {
+                struct stat st;
+                _cleanup_free_ char *path = NULL;
+
+                path = strjoin(*p, "/", name, NULL);
+                if (!path)
+                        return -ENOMEM;
+
+                if (lstat(path, &st) < 0)
+                        continue;
+
+                return 1;
+        }
+        return 0;
+}
+
+static int generate_unit_file(LookupPaths lp, SysvStub *s) {
         char *unit;
         char **p;
         _cleanup_fclose_ FILE *f = NULL;
@@ -190,6 +209,12 @@ static int generate_unit_file(SysvStub *s) {
         if (s->reload)
                 fprintf(f, "ExecReload=%s reload\n", s->path);
 
+        /* Do not generate 'Wants' symlinks to the generated service file if it
+         * will be shadowed by an existing native unit, as the symlinks would
+         * not be shadowed but would pull the native unit instead. */
+        if (native_unit_exists(lp, s->name))
+                return 0;
+
         STRV_FOREACH(p, s->wanted_by) {
                 r = add_symlink(s->name, *p);
                 if (r < 0)
@@ -918,7 +943,7 @@ int main(int argc, char *argv[]) {
                 if (q < 0)
                         continue;
 
-                q = generate_unit_file(service);
+                q = generate_unit_file(lp, service);
                 if (q < 0)
                         continue;
         }
-- 
2.0.1



More information about the systemd-devel mailing list