--- 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 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel