]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/path/path.c
Merge pull request #11827 from keszybz/pkgconfig-variables
[thirdparty/systemd.git] / src / path / path.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
9a00f57a 2
9a00f57a 3#include <errno.h>
3f6fd1ba
LP
4#include <getopt.h>
5#include <stdio.h>
9a00f57a 6#include <stdlib.h>
9a00f57a
LP
7
8#include "sd-path.h"
3f6fd1ba 9
b5efdb8a 10#include "alloc-util.h"
3f6fd1ba 11#include "log.h"
9a00f57a 12#include "macro.h"
5e332028 13#include "main-func.h"
294bf0c3 14#include "pretty-print.h"
07630cea 15#include "string-util.h"
9a00f57a 16#include "util.h"
9a00f57a
LP
17
18static const char *arg_suffix = NULL;
19
20static const char* const path_table[_SD_PATH_MAX] = {
21 [SD_PATH_TEMPORARY] = "temporary",
22 [SD_PATH_TEMPORARY_LARGE] = "temporary-large",
23 [SD_PATH_SYSTEM_BINARIES] = "system-binaries",
24 [SD_PATH_SYSTEM_INCLUDE] = "system-include",
25 [SD_PATH_SYSTEM_LIBRARY_PRIVATE] = "system-library-private",
26 [SD_PATH_SYSTEM_LIBRARY_ARCH] = "system-library-arch",
27 [SD_PATH_SYSTEM_SHARED] = "system-shared",
28 [SD_PATH_SYSTEM_CONFIGURATION_FACTORY] = "system-configuration-factory",
29 [SD_PATH_SYSTEM_STATE_FACTORY] = "system-state-factory",
30 [SD_PATH_SYSTEM_CONFIGURATION] = "system-configuration",
31 [SD_PATH_SYSTEM_RUNTIME] = "system-runtime",
32 [SD_PATH_SYSTEM_RUNTIME_LOGS] = "system-runtime-logs",
33 [SD_PATH_SYSTEM_STATE_PRIVATE] = "system-state-private",
34 [SD_PATH_SYSTEM_STATE_LOGS] = "system-state-logs",
35 [SD_PATH_SYSTEM_STATE_CACHE] = "system-state-cache",
36 [SD_PATH_SYSTEM_STATE_SPOOL] = "system-state-spool",
37 [SD_PATH_USER_BINARIES] = "user-binaries",
38 [SD_PATH_USER_LIBRARY_PRIVATE] = "user-library-private",
39 [SD_PATH_USER_LIBRARY_ARCH] = "user-library-arch",
40 [SD_PATH_USER_SHARED] = "user-shared",
41 [SD_PATH_USER_CONFIGURATION] = "user-configuration",
42 [SD_PATH_USER_RUNTIME] = "user-runtime",
43 [SD_PATH_USER_STATE_CACHE] = "user-state-cache",
44 [SD_PATH_USER] = "user",
45 [SD_PATH_USER_DOCUMENTS] = "user-documents",
46 [SD_PATH_USER_MUSIC] = "user-music",
47 [SD_PATH_USER_PICTURES] = "user-pictures",
48 [SD_PATH_USER_VIDEOS] = "user-videos",
49 [SD_PATH_USER_DOWNLOAD] = "user-download",
50 [SD_PATH_USER_PUBLIC] = "user-public",
51 [SD_PATH_USER_TEMPLATES] = "user-templates",
52 [SD_PATH_USER_DESKTOP] = "user-desktop",
53 [SD_PATH_SEARCH_BINARIES] = "search-binaries",
e12d446b 54 [SD_PATH_SEARCH_BINARIES_DEFAULT] = "search-binaries-default",
9a00f57a
LP
55 [SD_PATH_SEARCH_LIBRARY_PRIVATE] = "search-library-private",
56 [SD_PATH_SEARCH_LIBRARY_ARCH] = "search-library-arch",
57 [SD_PATH_SEARCH_SHARED] = "search-shared",
58 [SD_PATH_SEARCH_CONFIGURATION_FACTORY] = "search-configuration-factory",
59 [SD_PATH_SEARCH_STATE_FACTORY] = "search-state-factory",
60 [SD_PATH_SEARCH_CONFIGURATION] = "search-configuration",
61};
62
9a00f57a
LP
63static int list_homes(void) {
64 uint64_t i = 0;
65 int r = 0;
66
67 for (i = 0; i < ELEMENTSOF(path_table); i++) {
68 _cleanup_free_ char *p = NULL;
69 int q;
70
71 q = sd_path_home(i, arg_suffix, &p);
72 if (q == -ENXIO)
73 continue;
74 if (q < 0) {
da927ba9 75 log_error_errno(r, "Failed to query %s: %m", path_table[i]);
9a00f57a
LP
76 r = q;
77 continue;
78 }
79
80 printf("%s: %s\n", path_table[i], p);
81 }
82
83 return r;
84}
85
86static int print_home(const char *n) {
87 uint64_t i = 0;
88 int r;
89
90 for (i = 0; i < ELEMENTSOF(path_table); i++) {
91 if (streq(path_table[i], n)) {
92 _cleanup_free_ char *p = NULL;
93
94 r = sd_path_home(i, arg_suffix, &p);
f647962d
MS
95 if (r < 0)
96 return log_error_errno(r, "Failed to query %s: %m", n);
9a00f57a
LP
97
98 printf("%s\n", p);
99 return 0;
100 }
101 }
102
baaa35ad
ZJS
103 return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
104 "Path %s not known.", n);
9a00f57a
LP
105}
106
37ec0fdd
LP
107static int help(void) {
108 _cleanup_free_ char *link = NULL;
109 int r;
110
111 r = terminal_urlify_man("systemd-path", "1", &link);
112 if (r < 0)
113 return log_oom();
114
601185b4
ZJS
115 printf("%s [OPTIONS...] [NAME...]\n\n"
116 "Show system and user paths.\n\n"
117 " -h --help Show this help\n"
118 " --version Show package version\n"
37ec0fdd
LP
119 " --suffix=SUFFIX Suffix to append to paths\n"
120 "\nSee the %s for details.\n"
121 , program_invocation_short_name
122 , link
123 );
124
125 return 0;
601185b4
ZJS
126}
127
9a00f57a
LP
128static int parse_argv(int argc, char *argv[]) {
129
130 enum {
131 ARG_VERSION = 0x100,
132 ARG_SUFFIX,
133 };
134
135 static const struct option options[] = {
136 { "help", no_argument, NULL, 'h' },
137 { "version", no_argument, NULL, ARG_VERSION },
138 { "suffix", required_argument, NULL, ARG_SUFFIX },
139 {}
140 };
141
142 int c;
143
144 assert(argc >= 0);
145 assert(argv);
146
601185b4 147 while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
9a00f57a
LP
148
149 switch (c) {
150
151 case 'h':
37ec0fdd 152 return help();
9a00f57a
LP
153
154 case ARG_VERSION:
3f6fd1ba 155 return version();
9a00f57a
LP
156
157 case ARG_SUFFIX:
158 arg_suffix = optarg;
159 break;
160
161 case '?':
162 return -EINVAL;
163
164 default:
165 assert_not_reached("Unhandled option");
166 }
9a00f57a
LP
167
168 return 1;
169}
170
24d5223f 171static int run(int argc, char* argv[]) {
9a00f57a
LP
172 int r;
173
174 log_parse_environment();
175 log_open();
176
177 r = parse_argv(argc, argv);
178 if (r <= 0)
24d5223f 179 return r;
9a00f57a
LP
180
181 if (argc > optind) {
182 int i, q;
183
184 for (i = optind; i < argc; i++) {
185 q = print_home(argv[i]);
186 if (q < 0)
187 r = q;
188 }
9a00f57a 189
24d5223f
ZJS
190 return r;
191 } else
192 return list_homes();
9a00f57a 193}
24d5223f
ZJS
194
195DEFINE_MAIN_FUNCTION(run);