]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared/install: split UNIT_FILE_SYMLINK into two states
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 17 Mar 2022 14:50:16 +0000 (15:50 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 29 Mar 2022 14:17:57 +0000 (16:17 +0200)
The two states are distinguished, but are treated everywhere identically,
so there is no difference in behaviour except for slighlty different log
output.

src/basic/unit-file.c
src/shared/install.c
src/shared/install.h

index 2474648cebc872f3313883151bb8b5f6abf3f1f3..7c1ae515e101264458c3a2004fd0c010ee693a61 100644 (file)
@@ -282,7 +282,9 @@ int unit_file_resolve_symlink(
          *
          * If resolve_destination_target is true, an absolute path will be returned.
          * If not, an absolute path is returned for linked unit files, and a relative
-         * path otherwise. */
+         * path otherwise.
+         *
+         * Returns an error, false if this is an alias, true if it's a linked unit file. */
 
         assert(filename);
         assert(ret_destination);
@@ -364,7 +366,7 @@ int unit_file_resolve_symlink(
         }
 
         *ret_destination = TAKE_PTR(dst);
-        return 0;
+        return !tail;  /* true if linked unit file */
 }
 
 int unit_file_build_name_map(
index d5e197928025fae0cb2779db9cd13fb3f502ac34..6aacdcf967c58cdf964ac1dc6633f59da2e41a45 100644 (file)
@@ -93,8 +93,9 @@ void unit_file_presets_freep(UnitFilePresets *p) {
 
 static const char *const unit_file_type_table[_UNIT_FILE_TYPE_MAX] = {
         [UNIT_FILE_TYPE_REGULAR] = "regular",
-        [UNIT_FILE_TYPE_SYMLINK] = "symlink",
-        [UNIT_FILE_TYPE_MASKED] = "masked",
+        [UNIT_FILE_TYPE_LINKED]  = "linked",
+        [UNIT_FILE_TYPE_ALIAS]   = "alias",
+        [UNIT_FILE_TYPE_MASKED]  = "masked",
 };
 
 DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(unit_file_type, UnitFileType);
@@ -1402,14 +1403,17 @@ static int unit_file_load_or_readlink(
                                       true, &info->symlink_target);
         if (r < 0)
                 return r;
+        bool outside_search_path = r > 0;
 
         r = null_or_empty_path_with_root(info->symlink_target, lp->root_dir);
         if (r < 0 && r != -ENOENT)
                 return log_debug_errno(r, "Failed to stat %s: %m", info->symlink_target);
         if (r > 0)
                 info->type = UNIT_FILE_TYPE_MASKED;
+        else if (outside_search_path)
+                info->type = UNIT_FILE_TYPE_LINKED;
         else
-                info->type = UNIT_FILE_TYPE_SYMLINK;
+                info->type = UNIT_FILE_TYPE_ALIAS;
 
         return 0;
 }
@@ -1548,7 +1552,7 @@ static int install_info_follow(
         assert(ctx);
         assert(info);
 
-        if (info->type != UNIT_FILE_TYPE_SYMLINK)
+        if (!IN_SET(info->type, UNIT_FILE_TYPE_ALIAS, UNIT_FILE_TYPE_LINKED))
                 return -EINVAL;
         if (!info->symlink_target)
                 return -EINVAL;
@@ -1588,7 +1592,7 @@ static int install_info_traverse(
                 return r;
 
         i = start;
-        while (i->type == UNIT_FILE_TYPE_SYMLINK) {
+        while (IN_SET(i->type, UNIT_FILE_TYPE_ALIAS, UNIT_FILE_TYPE_LINKED)) {
                 /* Follow the symlink */
 
                 if (++k > UNIT_FILE_FOLLOW_SYMLINK_MAX)
index dba6987406ccad651c10aceed12e0ecb7a54cb22..95427537f2e75d16db6410e29a4cdccf6daa8839 100644 (file)
@@ -70,7 +70,8 @@ struct UnitFileList {
 
 enum UnitFileType {
         UNIT_FILE_TYPE_REGULAR,
-        UNIT_FILE_TYPE_SYMLINK,
+        UNIT_FILE_TYPE_LINKED,
+        UNIT_FILE_TYPE_ALIAS,
         UNIT_FILE_TYPE_MASKED,
         _UNIT_FILE_TYPE_MAX,
         _UNIT_FILE_TYPE_INVALID = -EINVAL,