1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
10 #include "alloc-util.h"
14 #include "main-func.h"
16 #include "pretty-print.h"
17 #include "string-util.h"
19 static const char *arg_suffix
= NULL
;
20 static PagerFlags arg_pager_flags
= 0;
22 static const char* const path_table
[_SD_PATH_MAX
] = {
23 [SD_PATH_TEMPORARY
] = "temporary",
24 [SD_PATH_TEMPORARY_LARGE
] = "temporary-large",
26 [SD_PATH_SYSTEM_BINARIES
] = "system-binaries",
27 [SD_PATH_SYSTEM_INCLUDE
] = "system-include",
28 [SD_PATH_SYSTEM_LIBRARY_PRIVATE
] = "system-library-private",
29 [SD_PATH_SYSTEM_LIBRARY_ARCH
] = "system-library-arch",
30 [SD_PATH_SYSTEM_SHARED
] = "system-shared",
31 [SD_PATH_SYSTEM_CONFIGURATION_FACTORY
] = "system-configuration-factory",
32 [SD_PATH_SYSTEM_STATE_FACTORY
] = "system-state-factory",
34 [SD_PATH_SYSTEM_CONFIGURATION
] = "system-configuration",
35 [SD_PATH_SYSTEM_RUNTIME
] = "system-runtime",
36 [SD_PATH_SYSTEM_RUNTIME_LOGS
] = "system-runtime-logs",
37 [SD_PATH_SYSTEM_STATE_PRIVATE
] = "system-state-private",
38 [SD_PATH_SYSTEM_STATE_LOGS
] = "system-state-logs",
39 [SD_PATH_SYSTEM_STATE_CACHE
] = "system-state-cache",
40 [SD_PATH_SYSTEM_STATE_SPOOL
] = "system-state-spool",
42 [SD_PATH_USER_BINARIES
] = "user-binaries",
43 [SD_PATH_USER_LIBRARY_PRIVATE
] = "user-library-private",
44 [SD_PATH_USER_LIBRARY_ARCH
] = "user-library-arch",
45 [SD_PATH_USER_SHARED
] = "user-shared",
47 [SD_PATH_USER_CONFIGURATION
] = "user-configuration",
48 [SD_PATH_USER_RUNTIME
] = "user-runtime",
49 [SD_PATH_USER_STATE_CACHE
] = "user-state-cache",
50 [SD_PATH_USER_STATE_PRIVATE
] = "user-state-private",
52 [SD_PATH_USER
] = "user",
53 [SD_PATH_USER_DOCUMENTS
] = "user-documents",
54 [SD_PATH_USER_MUSIC
] = "user-music",
55 [SD_PATH_USER_PICTURES
] = "user-pictures",
56 [SD_PATH_USER_VIDEOS
] = "user-videos",
57 [SD_PATH_USER_DOWNLOAD
] = "user-download",
58 [SD_PATH_USER_PUBLIC
] = "user-public",
59 [SD_PATH_USER_TEMPLATES
] = "user-templates",
60 [SD_PATH_USER_DESKTOP
] = "user-desktop",
62 [SD_PATH_SEARCH_BINARIES
] = "search-binaries",
63 [SD_PATH_SEARCH_BINARIES_DEFAULT
] = "search-binaries-default",
64 [SD_PATH_SEARCH_LIBRARY_PRIVATE
] = "search-library-private",
65 [SD_PATH_SEARCH_LIBRARY_ARCH
] = "search-library-arch",
66 [SD_PATH_SEARCH_SHARED
] = "search-shared",
67 [SD_PATH_SEARCH_CONFIGURATION_FACTORY
] = "search-configuration-factory",
68 [SD_PATH_SEARCH_STATE_FACTORY
] = "search-state-factory",
69 [SD_PATH_SEARCH_CONFIGURATION
] = "search-configuration",
71 [SD_PATH_SYSTEMD_UTIL
] = "systemd-util",
73 [SD_PATH_SYSTEMD_SYSTEM_UNIT
] = "systemd-system-unit",
74 [SD_PATH_SYSTEMD_SYSTEM_PRESET
] = "systemd-system-preset",
75 [SD_PATH_SYSTEMD_SYSTEM_CONF
] = "systemd-system-conf",
76 [SD_PATH_SYSTEMD_USER_UNIT
] = "systemd-user-unit",
77 [SD_PATH_SYSTEMD_USER_PRESET
] = "systemd-user-preset",
78 [SD_PATH_SYSTEMD_USER_CONF
] = "systemd-user-conf",
80 [SD_PATH_SYSTEMD_SEARCH_SYSTEM_UNIT
] = "systemd-search-system-unit",
81 [SD_PATH_SYSTEMD_SEARCH_USER_UNIT
] = "systemd-search-user-unit",
83 [SD_PATH_SYSTEMD_SYSTEM_GENERATOR
] = "systemd-system-generator",
84 [SD_PATH_SYSTEMD_USER_GENERATOR
] = "systemd-user-generator",
85 [SD_PATH_SYSTEMD_SEARCH_SYSTEM_GENERATOR
] = "systemd-search-system-generator",
86 [SD_PATH_SYSTEMD_SEARCH_USER_GENERATOR
] = "systemd-search-user-generator",
88 [SD_PATH_SYSTEMD_SLEEP
] = "systemd-sleep",
89 [SD_PATH_SYSTEMD_SHUTDOWN
] = "systemd-shutdown",
91 [SD_PATH_TMPFILES
] = "tmpfiles",
92 [SD_PATH_SYSUSERS
] = "sysusers",
93 [SD_PATH_SYSCTL
] = "sysctl",
94 [SD_PATH_BINFMT
] = "binfmt",
95 [SD_PATH_MODULES_LOAD
] = "modules-load",
96 [SD_PATH_CATALOG
] = "catalog",
98 [SD_PATH_SYSTEMD_SEARCH_NETWORK
] = "systemd-search-network",
100 [SD_PATH_SYSTEMD_SYSTEM_ENVIRONMENT_GENERATOR
] = "systemd-system-environment-generator",
101 [SD_PATH_SYSTEMD_USER_ENVIRONMENT_GENERATOR
] = "systemd-user-environment-generator",
102 [SD_PATH_SYSTEMD_SEARCH_SYSTEM_ENVIRONMENT_GENERATOR
] = "systemd-search-system-environment-generator",
103 [SD_PATH_SYSTEMD_SEARCH_USER_ENVIRONMENT_GENERATOR
] = "systemd-search-user-environment-generator",
106 static int list_paths(void) {
109 pager_open(arg_pager_flags
);
111 for (size_t i
= 0; i
< ELEMENTSOF(path_table
); i
++) {
112 _cleanup_free_
char *p
= NULL
;
115 q
= sd_path_lookup(i
, arg_suffix
, &p
);
117 log_full_errno(q
== -ENXIO
? LOG_DEBUG
: LOG_ERR
,
118 q
, "Failed to query %s: %m", path_table
[i
]);
124 printf("%s%s:%s %s\n", ansi_highlight(), path_table
[i
], ansi_normal(), p
);
130 static int print_path(const char *n
) {
133 for (size_t i
= 0; i
< ELEMENTSOF(path_table
); i
++)
134 if (streq(path_table
[i
], n
)) {
135 _cleanup_free_
char *p
= NULL
;
137 r
= sd_path_lookup(i
, arg_suffix
, &p
);
139 return log_error_errno(r
, "Failed to query %s: %m", n
);
145 return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP
),
146 "Path %s not known.", n
);
149 static int help(void) {
150 _cleanup_free_
char *link
= NULL
;
153 r
= terminal_urlify_man("systemd-path", "1", &link
);
157 printf("%s [OPTIONS...] [NAME...]\n\n"
158 "Show system and user paths.\n\n"
159 " -h --help Show this help\n"
160 " --version Show package version\n"
161 " --suffix=SUFFIX Suffix to append to paths\n"
162 " --no-pager Do not pipe output into a pager\n"
163 "\nSee the %s for details.\n",
164 program_invocation_short_name
,
170 static int parse_argv(int argc
, char *argv
[]) {
177 static const struct option options
[] = {
178 { "help", no_argument
, NULL
, 'h' },
179 { "version", no_argument
, NULL
, ARG_VERSION
},
180 { "suffix", required_argument
, NULL
, ARG_SUFFIX
},
181 { "no-pager", no_argument
, NULL
, ARG_NO_PAGER
},
190 while ((c
= getopt_long(argc
, argv
, "h", options
, NULL
)) >= 0)
205 arg_pager_flags
|= PAGER_DISABLE
;
212 assert_not_reached();
218 static int run(int argc
, char* argv
[]) {
223 r
= parse_argv(argc
, argv
);
228 for (int i
= optind
; i
< argc
; i
++)
229 RET_GATHER(r
, print_path(argv
[i
]));
236 DEFINE_MAIN_FUNCTION(run
);