1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 #pragma once
3 
4 #include <stdbool.h>
5 
6 #include "def.h"
7 #include "macro.h"
8 
9 typedef enum LookupPathsFlags {
10         LOOKUP_PATHS_EXCLUDE_GENERATED   = 1 << 0,
11         LOOKUP_PATHS_TEMPORARY_GENERATED = 1 << 1,
12         LOOKUP_PATHS_SPLIT_USR           = 1 << 2,
13 } LookupPathsFlags;
14 
15 typedef enum LookupScope {
16         LOOKUP_SCOPE_SYSTEM,
17         LOOKUP_SCOPE_GLOBAL,
18         LOOKUP_SCOPE_USER,
19         _LOOKUP_SCOPE_MAX,
20         _LOOKUP_SCOPE_INVALID = -EINVAL,
21 } LookupScope;
22 
23 typedef struct LookupPaths {
24         /* Where we look for unit files. This includes the individual special paths below, but also any vendor
25          * supplied, static unit file paths. */
26         char **search_path;
27 
28         /* Where we shall create or remove our installation symlinks, aka "configuration", and where the user/admin
29          * shall place their own unit files. */
30         char *persistent_config;
31         char *runtime_config;
32 
33         /* Where units from a portable service image shall be placed. */
34         char *persistent_attached;
35         char *runtime_attached;
36 
37         /* Where to place generated unit files (i.e. those a "generator" tool generated). Note the special semantics of
38          * this directory: the generators are flushed each time a "systemctl daemon-reload" is issued. The user should
39          * not alter these directories directly. */
40         char *generator;
41         char *generator_early;
42         char *generator_late;
43 
44         /* Where to place transient unit files (i.e. those created dynamically via the bus API). Note the special
45          * semantics of this directory: all units created transiently have their unit files removed as the transient
46          * unit is unloaded. The user should not alter this directory directly. */
47         char *transient;
48 
49         /* Where the snippets created by "systemctl set-property" are placed. Note that for transient units, the
50          * snippets are placed in the transient directory though (see above). The user should not alter this directory
51          * directly. */
52         char *persistent_control;
53         char *runtime_control;
54 
55         /* The root directory prepended to all items above, or NULL */
56         char *root_dir;
57 
58         /* A temporary directory when running in test mode, to be nuked */
59         char *temporary_dir;
60 } LookupPaths;
61 
62 int lookup_paths_init(LookupPaths *lp, LookupScope scope, LookupPathsFlags flags, const char *root_dir);
63 int lookup_paths_init_or_warn(LookupPaths *lp, LookupScope scope, LookupPathsFlags flags, const char *root_dir);
64 
65 int xdg_user_dirs(char ***ret_config_dirs, char ***ret_data_dirs);
66 int xdg_user_runtime_dir(char **ret, const char *suffix);
67 int xdg_user_config_dir(char **ret, const char *suffix);
68 int xdg_user_data_dir(char **ret, const char *suffix);
69 
70 bool path_is_user_data_dir(const char *path);
71 bool path_is_user_config_dir(const char *path);
72 
73 void lookup_paths_log(LookupPaths *p);
74 void lookup_paths_free(LookupPaths *p);
75 
76 char **generator_binary_paths(LookupScope scope);
77 char **env_generator_binary_paths(bool is_system);
78 
79 #define NETWORK_DIRS ((const char* const*) CONF_PATHS_STRV("systemd/network"))
80 #define NETWORK_DIRS_NULSTR CONF_PATHS_NULSTR("systemd/network")
81 
82 #define PORTABLE_PROFILE_DIRS CONF_PATHS_NULSTR("systemd/portable/profile")
83 int find_portable_profile(const char *name, const char *unit, char **ret_path);
84