chiark / gitweb /
sysv-generator: no need to check for identical symlinks source and target twice
[elogind.git] / src / sysv-generator / sysv-generator.c
index 1e4d54888cfd74c516875f1036d79ef207c1dd61..673f04dc27a6a317332f5ba70c8a22608738b7b0 100644 (file)
@@ -119,11 +119,6 @@ static int add_alias(const char *service, const char *alias) {
         assert(service);
         assert(alias);
 
-        if (streq(service, alias)) {
-                log_error("Ignoring creation of an alias %s for itself", service);
-                return 0;
-        }
-
         link = strjoin(arg_dest, "/", alias, NULL);
         if (!link)
                 return log_oom();
@@ -147,7 +142,6 @@ static int generate_unit_file(SysvStub *s) {
         _cleanup_free_ char *wants = NULL;
         _cleanup_free_ char *conflicts = NULL;
         int r;
-        struct stat st;
 
         before = strv_join(s->before, " ");
         if (!before)
@@ -172,9 +166,9 @@ static int generate_unit_file(SysvStub *s) {
         /* 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)) {
+        if (is_symlink(unit)) {
                 log_warning("Overwriting existing symlink %s with real service", unit);
-                unlink(unit);
+                (void) unlink(unit);
         }
 
         f = fopen(unit, "wxe");
@@ -300,7 +294,7 @@ static int sysv_translate_facility(const char *name, const char *filename, char
 
         /* strip ".sh" suffix from file name for comparison */
         filename_no_sh = strdupa(filename);
-        e = endswith(filename, ".sh");
+        e = endswith(filename_no_sh, ".sh");
         if (e) {
                 *e = '\0';
                 filename = filename_no_sh;
@@ -315,13 +309,12 @@ static int sysv_translate_facility(const char *name, const char *filename, char
 
                 /* Facilities starting with $ are most likely targets */
                 r = unit_name_build(n, NULL, ".target");
-        } else if (filename && streq(name, filename))
+        } else if (streq_ptr(n, filename))
                 /* Names equaling the file name of the services are redundant */
                 return 0;
         else
                 /* Everything else we assume to be normal service names */
                 r = sysv_translate_name(n);
-
         if (!r)
                 return -ENOMEM;
 
@@ -750,12 +743,10 @@ static int enumerate_sysv(LookupPaths lp, Hashmap *all_services) {
                         struct stat st;
                         int r;
 
-                        dirent_ensure_type(d, de);
-
-                        if (!dirent_is_file(de))
-                            continue;
+                        if (hidden_file(de->d_name))
+                                continue;
 
-                        if (fstatat(dirfd(d), de->d_name, &st, 0) < 0) {
+                        if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
                                 log_warning_errno(errno, "stat() failed on %s/%s: %m", *path, de->d_name);
                                 continue;
                         }
@@ -770,13 +761,13 @@ static int enumerate_sysv(LookupPaths lp, Hashmap *all_services) {
                         if (!name)
                                 return log_oom();
 
+                        if (hashmap_contains(all_services, name))
+                                continue;
+
                         fpath = strjoin(*path, "/", de->d_name, NULL);
                         if (!fpath)
                                 return log_oom();
 
-                        if (hashmap_contains(all_services, name))
-                                continue;
-
                         service = new0(SysvStub, 1);
                         if (!service)
                                 return log_oom();