chiark / gitweb /
sysv-generator: Replace Provides: symlinks with real units
[elogind.git] / src / sysv-generator / sysv-generator.c
index a47b0722e0aa50a5afe894dfff2c7e669696dadc..3279c7f44482ef6f0e2ead2a17b25e4de985df8f 100644 (file)
@@ -147,6 +147,7 @@ static int generate_unit_file(SysvStub *s) {
         _cleanup_free_ char *wants = NULL;
         _cleanup_free_ char *conflicts = NULL;
         int r;
         _cleanup_free_ char *wants = NULL;
         _cleanup_free_ char *conflicts = NULL;
         int r;
+        struct stat st;
 
         before = strv_join(s->before, " ");
         if (!before)
 
         before = strv_join(s->before, " ");
         if (!before)
@@ -168,6 +169,14 @@ static int generate_unit_file(SysvStub *s) {
         if (!unit)
                 return log_oom();
 
         if (!unit)
                 return log_oom();
 
+        /* We might already have a symlink with the same name from a Provides:,
+         * or from backup files like /etc/init.d/foo.bak. Real scripts always win,
+         * so remove an existing link */
+        if (lstat(unit, &st) == 0 && S_ISLNK(st.st_mode)) {
+                log_warning("Overwriting existing symlink %s with real service", unit);
+                unlink(unit);
+        }
+
         f = fopen(unit, "wxe");
         if (!f)
                 return log_error_errno(errno, "Failed to create unit file %s: %m", unit);
         f = fopen(unit, "wxe");
         if (!f)
                 return log_error_errno(errno, "Failed to create unit file %s: %m", unit);
@@ -343,6 +352,8 @@ static int load_sysv(SysvStub *s) {
         if (!f)
                 return errno == ENOENT ? 0 : -errno;
 
         if (!f)
                 return errno == ENOENT ? 0 : -errno;
 
+        log_debug("Loading SysV script %s", s->path);
+
         while (!feof(f)) {
                 char l[LINE_MAX], *t;
 
         while (!feof(f)) {
                 char l[LINE_MAX], *t;
 
@@ -492,6 +503,7 @@ static int load_sysv(SysvStub *s) {
                                                 continue;
 
                                         if (unit_name_to_type(m) == UNIT_SERVICE) {
                                                 continue;
 
                                         if (unit_name_to_type(m) == UNIT_SERVICE) {
+                                                log_debug("Adding Provides: alias '%s' for '%s'", m, s->name);
                                                 r = add_alias(s->name, m);
                                         } else {
                                                 /* NB: SysV targets
                                                 r = add_alias(s->name, m);
                                         } else {
                                                 /* NB: SysV targets