]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
path-lookup: unify *_generator_binary_paths()
authorMike Yuan <me@yhndnzj.com>
Sat, 7 Sep 2024 13:27:04 +0000 (15:27 +0200)
committerMike Yuan <me@yhndnzj.com>
Sun, 6 Oct 2024 17:32:55 +0000 (19:32 +0200)
src/libsystemd/sd-path/path-lookup.c
src/libsystemd/sd-path/path-lookup.h
src/libsystemd/sd-path/sd-path.c

index 64bb46096a5497ff5c881c267b1a81c17d4d40cf..2e59dca235beb4ed2c39c5c2aff9da576c37cedd 100644 (file)
@@ -673,95 +673,75 @@ void lookup_paths_log(LookupPaths *lp) {
         }
 }
 
-char **generator_binary_paths(RuntimeScope scope) {
-        _cleanup_strv_free_ char **paths = NULL;
-        int r;
-
-        /* First priority is whatever has been passed to us via env vars */
-        r = get_paths_from_environ("SYSTEMD_GENERATOR_PATH", &paths);
-        if (r < 0)
-                return NULL;
+static const char* const system_generator_paths[] = {
+        "/run/systemd/system-generators",
+        "/etc/systemd/system-generators",
+        "/usr/local/lib/systemd/system-generators",
+        SYSTEM_GENERATOR_DIR,
+        NULL,
+};
 
-        if (!paths || r > 0) {
-                _cleanup_strv_free_ char **add = NULL;
+static const char* const user_generator_paths[] = {
+        "/run/systemd/user-generators",
+        "/etc/systemd/user-generators",
+        "/usr/local/lib/systemd/user-generators",
+        USER_GENERATOR_DIR,
+        NULL,
+};
 
-                switch (scope) {
+static const char* const system_env_generator_paths[] = {
+        "/run/systemd/system-environment-generators",
+        "/etc/systemd/system-environment-generators",
+        "/usr/local/lib/systemd/system-environment-generators",
+        SYSTEM_ENV_GENERATOR_DIR,
+        NULL,
+};
 
-                case RUNTIME_SCOPE_SYSTEM:
-                        add = strv_new("/run/systemd/system-generators",
-                                       "/etc/systemd/system-generators",
-                                       "/usr/local/lib/systemd/system-generators",
-                                       SYSTEM_GENERATOR_DIR);
-                        break;
+static const char* const user_env_generator_paths[] = {
+        "/run/systemd/user-environment-generators",
+        "/etc/systemd/user-environment-generators",
+        "/usr/local/lib/systemd/user-environment-generators",
+        USER_ENV_GENERATOR_DIR,
+        NULL,
+};
 
-                case RUNTIME_SCOPE_GLOBAL:
-                case RUNTIME_SCOPE_USER:
-                        add = strv_new("/run/systemd/user-generators",
-                                       "/etc/systemd/user-generators",
-                                       "/usr/local/lib/systemd/user-generators",
-                                       USER_GENERATOR_DIR);
-                        break;
+char** generator_binary_paths_internal(RuntimeScope scope, bool env_generator) {
 
-                default:
-                        assert_not_reached();
+        static const struct {
+                const char *env_name;
+                const char * const *paths[_RUNTIME_SCOPE_MAX];
+        } unit_generator = {
+                "SYSTEMD_GENERATOR_PATH",
+                {
+                        [RUNTIME_SCOPE_SYSTEM] = system_generator_paths,
+                        [RUNTIME_SCOPE_USER]   = user_generator_paths,
                 }
-                if (!add)
-                        return NULL;
+        }, environment_generator = {
+                "SYSTEMD_ENVIRONMENT_GENERATOR_PATH",
+                {
+                        [RUNTIME_SCOPE_SYSTEM] = system_env_generator_paths,
+                        [RUNTIME_SCOPE_USER]   = user_env_generator_paths,
+                }
+        };
 
-                if (paths) {
-                        r = strv_extend_strv(&paths, add, true);
-                        if (r < 0)
-                                return NULL;
-                } else
-                        /* Small optimization: if paths is NULL (and it usually is), we can simply assign 'add' to it,
-                         * and don't have to copy anything */
-                        paths = TAKE_PTR(add);
-        }
+        _cleanup_strv_free_ char **paths = NULL;
+        int r;
 
-        return TAKE_PTR(paths);
-}
+        assert(IN_SET(scope, RUNTIME_SCOPE_SYSTEM, RUNTIME_SCOPE_USER));
 
-char **env_generator_binary_paths(RuntimeScope runtime_scope) {
-        _cleanup_strv_free_ char **paths = NULL, **add = NULL;
-        int r;
+        const char *env_name = ASSERT_PTR((env_generator ? environment_generator : unit_generator).env_name);
+        const char * const *generator_paths = ASSERT_PTR((env_generator ? environment_generator : unit_generator).paths[scope]);
 
         /* First priority is whatever has been passed to us via env vars */
-        r = get_paths_from_environ("SYSTEMD_ENVIRONMENT_GENERATOR_PATH", &paths);
+        r = get_paths_from_environ(env_name, &paths);
         if (r < 0)
                 return NULL;
 
         if (!paths || r > 0) {
-                switch (runtime_scope) {
-
-                case RUNTIME_SCOPE_SYSTEM:
-                        add = strv_new("/run/systemd/system-environment-generators",
-                                        "/etc/systemd/system-environment-generators",
-                                        "/usr/local/lib/systemd/system-environment-generators",
-                                        SYSTEM_ENV_GENERATOR_DIR);
-                        break;
-
-                case RUNTIME_SCOPE_USER:
-                        add = strv_new("/run/systemd/user-environment-generators",
-                                       "/etc/systemd/user-environment-generators",
-                                       "/usr/local/lib/systemd/user-environment-generators",
-                                       USER_ENV_GENERATOR_DIR);
-                        break;
-
-                default:
-                        assert_not_reached();
-                }
-                if (!add)
-                        return NULL;
-        }
-
-        if (paths) {
-                r = strv_extend_strv(&paths, add, true);
+                r = strv_extend_strv(&paths, (char* const*) generator_paths, /* filter_duplicates = */ true);
                 if (r < 0)
                         return NULL;
-        } else
-                /* Small optimization: if paths is NULL (and it usually is), we can simply assign 'add' to it,
-                 * and don't have to copy anything */
-                paths = TAKE_PTR(add);
+        }
 
         return TAKE_PTR(paths);
 }
index 6c7c9f42da01d9800f3835819c2ef895e05b9f25..ca901841256e600f68f7374fac35c44009a4d7b2 100644 (file)
@@ -78,5 +78,10 @@ static inline int xdg_user_data_dir(const char *suffix, char **ret) {
 bool path_is_user_data_dir(const char *path);
 bool path_is_user_config_dir(const char *path);
 
-char **generator_binary_paths(RuntimeScope scope);
-char **env_generator_binary_paths(RuntimeScope scope);
+char** generator_binary_paths_internal(RuntimeScope scope, bool env_generator);
+static inline char** generator_binary_paths(RuntimeScope runtime_scope) {
+        return generator_binary_paths_internal(runtime_scope, false);
+}
+static inline char** env_generator_binary_paths(RuntimeScope runtime_scope) {
+        return generator_binary_paths_internal(runtime_scope, true);
+}
index 096f3a11563718778ec3c3cdd14700748c8aec66..9f495f3051221067a507b44561ddc77ba1e20465 100644 (file)
@@ -581,25 +581,16 @@ static int get_search(uint64_t type, char ***ret) {
         }
 
         case SD_PATH_SYSTEMD_SEARCH_SYSTEM_GENERATOR:
-        case SD_PATH_SYSTEMD_SEARCH_USER_GENERATOR: {
-                RuntimeScope scope = type == SD_PATH_SYSTEMD_SEARCH_SYSTEM_GENERATOR ?
-                        RUNTIME_SCOPE_SYSTEM : RUNTIME_SCOPE_USER;
-                char **t;
-
-                t = generator_binary_paths(scope);
-                if (!t)
-                        return -ENOMEM;
-
-                *ret = t;
-                return 0;
-        }
-
+        case SD_PATH_SYSTEMD_SEARCH_USER_GENERATOR:
         case SD_PATH_SYSTEMD_SEARCH_SYSTEM_ENVIRONMENT_GENERATOR:
         case SD_PATH_SYSTEMD_SEARCH_USER_ENVIRONMENT_GENERATOR: {
-                char **t;
+                RuntimeScope scope = IN_SET(type, SD_PATH_SYSTEMD_SEARCH_SYSTEM_GENERATOR,
+                                                  SD_PATH_SYSTEMD_SEARCH_SYSTEM_ENVIRONMENT_GENERATOR) ?
+                                     RUNTIME_SCOPE_SYSTEM : RUNTIME_SCOPE_USER;
+                bool env_generator = IN_SET(type, SD_PATH_SYSTEMD_SEARCH_SYSTEM_ENVIRONMENT_GENERATOR,
+                                                  SD_PATH_SYSTEMD_SEARCH_USER_ENVIRONMENT_GENERATOR);
 
-                t = env_generator_binary_paths(type == SD_PATH_SYSTEMD_SEARCH_SYSTEM_ENVIRONMENT_GENERATOR ?
-                                               RUNTIME_SCOPE_SYSTEM : RUNTIME_SCOPE_USER);
+                char **t = generator_binary_paths_internal(scope, env_generator);
                 if (!t)
                         return -ENOMEM;