]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/path/path.c
Merge pull request #1821 from darkcircle/ko-catalog-translation
[thirdparty/systemd.git] / src / path / path.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2014 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <errno.h>
23 #include <getopt.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26
27 #include "sd-path.h"
28
29 #include "alloc-util.h"
30 #include "log.h"
31 #include "macro.h"
32 #include "string-util.h"
33 #include "util.h"
34
35 static const char *arg_suffix = NULL;
36
37 static const char* const path_table[_SD_PATH_MAX] = {
38 [SD_PATH_TEMPORARY] = "temporary",
39 [SD_PATH_TEMPORARY_LARGE] = "temporary-large",
40 [SD_PATH_SYSTEM_BINARIES] = "system-binaries",
41 [SD_PATH_SYSTEM_INCLUDE] = "system-include",
42 [SD_PATH_SYSTEM_LIBRARY_PRIVATE] = "system-library-private",
43 [SD_PATH_SYSTEM_LIBRARY_ARCH] = "system-library-arch",
44 [SD_PATH_SYSTEM_SHARED] = "system-shared",
45 [SD_PATH_SYSTEM_CONFIGURATION_FACTORY] = "system-configuration-factory",
46 [SD_PATH_SYSTEM_STATE_FACTORY] = "system-state-factory",
47 [SD_PATH_SYSTEM_CONFIGURATION] = "system-configuration",
48 [SD_PATH_SYSTEM_RUNTIME] = "system-runtime",
49 [SD_PATH_SYSTEM_RUNTIME_LOGS] = "system-runtime-logs",
50 [SD_PATH_SYSTEM_STATE_PRIVATE] = "system-state-private",
51 [SD_PATH_SYSTEM_STATE_LOGS] = "system-state-logs",
52 [SD_PATH_SYSTEM_STATE_CACHE] = "system-state-cache",
53 [SD_PATH_SYSTEM_STATE_SPOOL] = "system-state-spool",
54 [SD_PATH_USER_BINARIES] = "user-binaries",
55 [SD_PATH_USER_LIBRARY_PRIVATE] = "user-library-private",
56 [SD_PATH_USER_LIBRARY_ARCH] = "user-library-arch",
57 [SD_PATH_USER_SHARED] = "user-shared",
58 [SD_PATH_USER_CONFIGURATION] = "user-configuration",
59 [SD_PATH_USER_RUNTIME] = "user-runtime",
60 [SD_PATH_USER_STATE_CACHE] = "user-state-cache",
61 [SD_PATH_USER] = "user",
62 [SD_PATH_USER_DOCUMENTS] = "user-documents",
63 [SD_PATH_USER_MUSIC] = "user-music",
64 [SD_PATH_USER_PICTURES] = "user-pictures",
65 [SD_PATH_USER_VIDEOS] = "user-videos",
66 [SD_PATH_USER_DOWNLOAD] = "user-download",
67 [SD_PATH_USER_PUBLIC] = "user-public",
68 [SD_PATH_USER_TEMPLATES] = "user-templates",
69 [SD_PATH_USER_DESKTOP] = "user-desktop",
70 [SD_PATH_SEARCH_BINARIES] = "search-binaries",
71 [SD_PATH_SEARCH_LIBRARY_PRIVATE] = "search-library-private",
72 [SD_PATH_SEARCH_LIBRARY_ARCH] = "search-library-arch",
73 [SD_PATH_SEARCH_SHARED] = "search-shared",
74 [SD_PATH_SEARCH_CONFIGURATION_FACTORY] = "search-configuration-factory",
75 [SD_PATH_SEARCH_STATE_FACTORY] = "search-state-factory",
76 [SD_PATH_SEARCH_CONFIGURATION] = "search-configuration",
77 };
78
79 static int list_homes(void) {
80 uint64_t i = 0;
81 int r = 0;
82
83 for (i = 0; i < ELEMENTSOF(path_table); i++) {
84 _cleanup_free_ char *p = NULL;
85 int q;
86
87 q = sd_path_home(i, arg_suffix, &p);
88 if (q == -ENXIO)
89 continue;
90 if (q < 0) {
91 log_error_errno(r, "Failed to query %s: %m", path_table[i]);
92 r = q;
93 continue;
94 }
95
96 printf("%s: %s\n", path_table[i], p);
97 }
98
99 return r;
100 }
101
102 static int print_home(const char *n) {
103 uint64_t i = 0;
104 int r;
105
106 for (i = 0; i < ELEMENTSOF(path_table); i++) {
107 if (streq(path_table[i], n)) {
108 _cleanup_free_ char *p = NULL;
109
110 r = sd_path_home(i, arg_suffix, &p);
111 if (r < 0)
112 return log_error_errno(r, "Failed to query %s: %m", n);
113
114 printf("%s\n", p);
115 return 0;
116 }
117 }
118
119 log_error("Path %s not known.", n);
120 return -EOPNOTSUPP;
121 }
122
123 static void help(void) {
124 printf("%s [OPTIONS...] [NAME...]\n\n"
125 "Show system and user paths.\n\n"
126 " -h --help Show this help\n"
127 " --version Show package version\n"
128 " --suffix=SUFFIX Suffix to append to paths\n",
129 program_invocation_short_name);
130 }
131
132 static int parse_argv(int argc, char *argv[]) {
133
134 enum {
135 ARG_VERSION = 0x100,
136 ARG_SUFFIX,
137 };
138
139 static const struct option options[] = {
140 { "help", no_argument, NULL, 'h' },
141 { "version", no_argument, NULL, ARG_VERSION },
142 { "suffix", required_argument, NULL, ARG_SUFFIX },
143 {}
144 };
145
146 int c;
147
148 assert(argc >= 0);
149 assert(argv);
150
151 while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
152
153 switch (c) {
154
155 case 'h':
156 help();
157 return 0;
158
159 case ARG_VERSION:
160 return version();
161
162 case ARG_SUFFIX:
163 arg_suffix = optarg;
164 break;
165
166 case '?':
167 return -EINVAL;
168
169 default:
170 assert_not_reached("Unhandled option");
171 }
172
173 return 1;
174 }
175
176 int main(int argc, char* argv[]) {
177 int r;
178
179 log_parse_environment();
180 log_open();
181
182 r = parse_argv(argc, argv);
183 if (r <= 0)
184 goto finish;
185
186 if (argc > optind) {
187 int i, q;
188
189 for (i = optind; i < argc; i++) {
190 q = print_home(argv[i]);
191 if (q < 0)
192 r = q;
193 }
194 } else
195 r = list_homes();
196
197
198 finish:
199 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
200 }