btrfs: Attempt to fix GCC2 build.
[haiku.git] / src / bin / finddir.c
blobc9ca6cef6c07c4cc113733378f879057a1760a8a
1 /*
2 * Copyright 2002, Sebastian Nozzi <sebnozzi@gmx.net>.
3 * Copyright 2004, Francois Revol.
5 * Distributed under the terms of the MIT License.
6 */
8 #include <stdio.h>
9 #include <string.h>
11 #include <FindDirectory.h>
12 #include <fs_info.h>
15 #define NO_ERRORS 0
16 #define ARGUMENT_MISSING 1
17 #define WRONG_DIR_TYPE 2
19 typedef struct {
20 const char *key;
21 directory_which value;
22 } directoryType;
24 #define KEYVALUE_PAIR(key) {#key, key}
26 directoryType directoryTypes[] = {
27 // Generic directories
28 KEYVALUE_PAIR(B_DESKTOP_DIRECTORY),
29 KEYVALUE_PAIR(B_TRASH_DIRECTORY),
30 KEYVALUE_PAIR(B_APPS_DIRECTORY),
31 KEYVALUE_PAIR(B_PACKAGE_LINKS_DIRECTORY),
32 KEYVALUE_PAIR(B_PREFERENCES_DIRECTORY),
33 KEYVALUE_PAIR(B_UTILITIES_DIRECTORY),
35 // System directories
36 KEYVALUE_PAIR(B_SYSTEM_DIRECTORY),
37 KEYVALUE_PAIR(B_SYSTEM_ADDONS_DIRECTORY),
38 KEYVALUE_PAIR(B_SYSTEM_BOOT_DIRECTORY),
39 KEYVALUE_PAIR(B_SYSTEM_FONTS_DIRECTORY),
40 KEYVALUE_PAIR(B_SYSTEM_LIB_DIRECTORY),
41 KEYVALUE_PAIR(B_SYSTEM_SERVERS_DIRECTORY),
42 KEYVALUE_PAIR(B_SYSTEM_APPS_DIRECTORY),
43 KEYVALUE_PAIR(B_SYSTEM_BIN_DIRECTORY),
44 KEYVALUE_PAIR(B_SYSTEM_DOCUMENTATION_DIRECTORY),
45 KEYVALUE_PAIR(B_SYSTEM_PREFERENCES_DIRECTORY),
46 KEYVALUE_PAIR(B_SYSTEM_TRANSLATORS_DIRECTORY),
47 KEYVALUE_PAIR(B_SYSTEM_MEDIA_NODES_DIRECTORY),
48 KEYVALUE_PAIR(B_SYSTEM_SOUNDS_DIRECTORY),
49 KEYVALUE_PAIR(B_SYSTEM_DATA_DIRECTORY),
50 KEYVALUE_PAIR(B_SYSTEM_DEVELOP_DIRECTORY),
51 KEYVALUE_PAIR(B_SYSTEM_PACKAGES_DIRECTORY),
52 KEYVALUE_PAIR(B_SYSTEM_HEADERS_DIRECTORY),
54 // Writable system directories
55 KEYVALUE_PAIR(B_SYSTEM_ETC_DIRECTORY),
56 KEYVALUE_PAIR(B_SYSTEM_SETTINGS_DIRECTORY),
57 KEYVALUE_PAIR(B_SYSTEM_LOG_DIRECTORY),
58 KEYVALUE_PAIR(B_SYSTEM_SPOOL_DIRECTORY),
59 KEYVALUE_PAIR(B_SYSTEM_TEMP_DIRECTORY),
60 KEYVALUE_PAIR(B_SYSTEM_VAR_DIRECTORY),
61 KEYVALUE_PAIR(B_SYSTEM_CACHE_DIRECTORY),
62 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_DIRECTORY),
63 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY),
64 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_TRANSLATORS_DIRECTORY),
65 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_MEDIA_NODES_DIRECTORY),
66 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_BIN_DIRECTORY),
67 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_DATA_DIRECTORY),
68 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_FONTS_DIRECTORY),
69 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_SOUNDS_DIRECTORY),
70 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_DOCUMENTATION_DIRECTORY),
71 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_LIB_DIRECTORY),
72 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_HEADERS_DIRECTORY),
73 KEYVALUE_PAIR(B_SYSTEM_NONPACKAGED_DEVELOP_DIRECTORY),
75 // User directories
76 KEYVALUE_PAIR(B_USER_DIRECTORY),
77 KEYVALUE_PAIR(B_USER_CONFIG_DIRECTORY),
78 KEYVALUE_PAIR(B_USER_ADDONS_DIRECTORY),
79 KEYVALUE_PAIR(B_USER_BOOT_DIRECTORY),
80 KEYVALUE_PAIR(B_USER_FONTS_DIRECTORY),
81 KEYVALUE_PAIR(B_USER_LIB_DIRECTORY),
82 KEYVALUE_PAIR(B_USER_SETTINGS_DIRECTORY),
83 KEYVALUE_PAIR(B_USER_DESKBAR_DIRECTORY),
84 KEYVALUE_PAIR(B_USER_PRINTERS_DIRECTORY),
85 KEYVALUE_PAIR(B_USER_TRANSLATORS_DIRECTORY),
86 KEYVALUE_PAIR(B_USER_MEDIA_NODES_DIRECTORY),
87 KEYVALUE_PAIR(B_USER_SOUNDS_DIRECTORY),
88 KEYVALUE_PAIR(B_USER_DATA_DIRECTORY),
89 KEYVALUE_PAIR(B_USER_CACHE_DIRECTORY),
90 KEYVALUE_PAIR(B_USER_PACKAGES_DIRECTORY),
91 KEYVALUE_PAIR(B_USER_DEVELOP_DIRECTORY),
92 KEYVALUE_PAIR(B_USER_DOCUMENTATION_DIRECTORY),
93 KEYVALUE_PAIR(B_USER_HEADERS_DIRECTORY),
94 KEYVALUE_PAIR(B_USER_SERVERS_DIRECTORY),
95 KEYVALUE_PAIR(B_USER_APPS_DIRECTORY),
96 KEYVALUE_PAIR(B_USER_BIN_DIRECTORY),
97 KEYVALUE_PAIR(B_USER_PREFERENCES_DIRECTORY),
98 KEYVALUE_PAIR(B_USER_ETC_DIRECTORY),
99 KEYVALUE_PAIR(B_USER_LOG_DIRECTORY),
100 KEYVALUE_PAIR(B_USER_SPOOL_DIRECTORY),
101 KEYVALUE_PAIR(B_USER_VAR_DIRECTORY),
102 KEYVALUE_PAIR(B_USER_NONPACKAGED_DIRECTORY),
103 KEYVALUE_PAIR(B_USER_NONPACKAGED_ADDONS_DIRECTORY),
104 KEYVALUE_PAIR(B_USER_NONPACKAGED_TRANSLATORS_DIRECTORY),
105 KEYVALUE_PAIR(B_USER_NONPACKAGED_MEDIA_NODES_DIRECTORY),
106 KEYVALUE_PAIR(B_USER_NONPACKAGED_BIN_DIRECTORY),
107 KEYVALUE_PAIR(B_USER_NONPACKAGED_DATA_DIRECTORY),
108 KEYVALUE_PAIR(B_USER_NONPACKAGED_FONTS_DIRECTORY),
109 KEYVALUE_PAIR(B_USER_NONPACKAGED_SOUNDS_DIRECTORY),
110 KEYVALUE_PAIR(B_USER_NONPACKAGED_DOCUMENTATION_DIRECTORY),
111 KEYVALUE_PAIR(B_USER_NONPACKAGED_LIB_DIRECTORY),
112 KEYVALUE_PAIR(B_USER_NONPACKAGED_HEADERS_DIRECTORY),
113 KEYVALUE_PAIR(B_USER_NONPACKAGED_DEVELOP_DIRECTORY),
115 // Legacy system directories
116 KEYVALUE_PAIR(B_BEOS_DIRECTORY),
117 KEYVALUE_PAIR(B_BEOS_SYSTEM_DIRECTORY),
118 KEYVALUE_PAIR(B_BEOS_ADDONS_DIRECTORY),
119 KEYVALUE_PAIR(B_BEOS_BOOT_DIRECTORY),
120 KEYVALUE_PAIR(B_BEOS_FONTS_DIRECTORY),
121 KEYVALUE_PAIR(B_BEOS_LIB_DIRECTORY),
122 KEYVALUE_PAIR(B_BEOS_SERVERS_DIRECTORY),
123 KEYVALUE_PAIR(B_BEOS_APPS_DIRECTORY),
124 KEYVALUE_PAIR(B_BEOS_BIN_DIRECTORY),
125 KEYVALUE_PAIR(B_BEOS_ETC_DIRECTORY),
126 KEYVALUE_PAIR(B_BEOS_DOCUMENTATION_DIRECTORY),
127 KEYVALUE_PAIR(B_BEOS_PREFERENCES_DIRECTORY),
128 KEYVALUE_PAIR(B_BEOS_TRANSLATORS_DIRECTORY),
129 KEYVALUE_PAIR(B_BEOS_MEDIA_NODES_DIRECTORY),
130 KEYVALUE_PAIR(B_BEOS_SOUNDS_DIRECTORY),
132 // Legacy "common" directories, for BeOS compatibility only.
133 {"B_COMMON_DIRECTORY", B_SYSTEM_NONPACKAGED_DIRECTORY},
134 {"B_COMMON_SYSTEM_DIRECTORY", B_SYSTEM_NONPACKAGED_DIRECTORY},
135 {"B_COMMON_ADDONS_DIRECTORY", B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY},
136 {"B_COMMON_BIN_DIRECTORY", B_SYSTEM_NONPACKAGED_BIN_DIRECTORY},
137 {"B_COMMON_DEVELOP_DIRECTORY", B_SYSTEM_NONPACKAGED_DEVELOP_DIRECTORY},
138 {"B_COMMON_DOCUMENTATION_DIRECTORY",
139 B_SYSTEM_NONPACKAGED_DOCUMENTATION_DIRECTORY},
140 {"B_COMMON_FONTS_DIRECTORY",B_SYSTEM_NONPACKAGED_FONTS_DIRECTORY},
141 {"B_COMMON_LIB_DIRECTORY", B_SYSTEM_NONPACKAGED_LIB_DIRECTORY},
143 {"B_COMMON_BOOT_DIRECTORY", B_SYSTEM_BOOT_DIRECTORY},
144 {"B_COMMON_ETC_DIRECTORY", B_SYSTEM_ETC_DIRECTORY},
145 {"B_COMMON_LOG_DIRECTORY", B_SYSTEM_LOG_DIRECTORY},
146 {"B_COMMON_SERVERS_DIRECTORY", B_SYSTEM_SERVERS_DIRECTORY},
147 {"B_COMMON_SETTINGS_DIRECTORY", B_SYSTEM_SETTINGS_DIRECTORY},
148 {"B_COMMON_SPOOL_DIRECTORY", B_SYSTEM_SPOOL_DIRECTORY},
149 {"B_COMMON_TEMP_DIRECTORY", B_SYSTEM_TEMP_DIRECTORY},
150 {"B_COMMON_VAR_DIRECTORY", B_SYSTEM_VAR_DIRECTORY},
152 {NULL, B_USER_DESKBAR_DIRECTORY}
156 static void
157 listDirectoryWhich(void)
159 int i;
161 for (i = 0; directoryTypes[i].key; i++) {
162 printf("%s\n", directoryTypes[i].key);
167 static bool
168 retrieveDirValue(directoryType *list, const char *key,
169 directory_which *valueOut)
171 unsigned i = 0;
173 while (list[i].key != NULL) {
174 if (strcmp(list[i].key, key) == 0) {
175 *valueOut = list[i].value;
176 return true;
179 i++;
182 return false;
186 static void
187 usageMsg()
189 printf("usage: /bin/finddir -l | [ -v volume ] directory_which\n");
190 printf("\t-l\t list valid which constants to use\n");
191 printf("\t-v <file> use the specified volume for directory\n");
192 printf("\t\t constants that are volume-specific.\n");
193 printf("\t\t <file> can be any file on that volume.\n");
194 printf("\t\t defaults to the boot volume.\n");
195 printf(" For a description of recognized directory_which constants,\n");
196 printf(" see the find_directory(...) documentation in the Be Book.\n");
201 main(int argc, char *argv[])
203 int directoryArgNr;
204 int status;
205 dev_t volume;
206 directory_which dirType;
207 int returnCode;
209 status = NO_ERRORS;
210 directoryArgNr = 1;
211 returnCode = 0;
213 dirType = B_BEOS_DIRECTORY; /* so that it compiles */
215 /* By default use boot volume*/
216 volume = dev_for_path("/boot");
218 if (argc <= 1) {
219 status = ARGUMENT_MISSING;
220 } else {
221 if (strcmp(argv[1], "-l") == 0 ) {
222 listDirectoryWhich();
223 return 0;
225 if (strcmp(argv[1], "-v") == 0 ) {
226 if (argc >= 3) {
227 dev_t temp_volume;
228 /* get volume from second arg */
229 temp_volume = dev_for_path(argv[2]);
231 /* Keep default value in case of error */
232 if (temp_volume >= 0)
233 volume = temp_volume;
235 /* two arguments were used for volume */
236 directoryArgNr+=2;
237 } else {
238 /* set status to argument missing */
239 status = ARGUMENT_MISSING;
244 if (status == NO_ERRORS && argc > directoryArgNr) {
245 /* get directory constant from next argument */
247 if (!retrieveDirValue(directoryTypes, argv[directoryArgNr], &dirType))
248 status = WRONG_DIR_TYPE;
249 } else {
250 status = ARGUMENT_MISSING;
253 /* Do the actual directoy finding */
255 if (status == NO_ERRORS) {
256 /* Question: would B_PATH_NAME_LENGTH alone have been enough? */
257 char buffer[B_PATH_NAME_LENGTH+B_FILE_NAME_LENGTH];
258 status_t result = find_directory (dirType, volume, false, buffer,
259 sizeof(buffer));
260 if (result == B_OK) {
261 printf("%s\n", buffer);
262 } else {
263 fprintf(stderr, "Failed to get directory: %s\n", strerror(result));
264 return 1;
268 /* Error messages and return code setting */
270 if (status == WRONG_DIR_TYPE) {
271 fprintf(stderr, "%s: unrecognized directory_which constant \'%s\'\n", argv[0],
272 argv[directoryArgNr]);
273 returnCode = 252;
276 if (status == ARGUMENT_MISSING) {
277 usageMsg();
278 returnCode = 255;
281 return returnCode;