xref: /haiku/src/bin/error.c (revision 610f99c838cb661ff85377789ffd3ad4ff672a08)
1 /*
2  * Copyright 2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <SupportDefs.h>
8 
9 #include <stdio.h>
10 #include <string.h>
11 #include <stdlib.h>
12 
13 
14 extern const char *__progname;
15 
16 struct error_pair {
17 	status_t value;
18 	const char *name;
19 } kErrorNames[] = {
20 #define E(e) { e, #e }
21 // generated by:
22 // tr ' ,=\t()+' '\n\n\n\n\n\n\n' <headers/os/support/Errors.h | grep '\(^B_\|^E[A-Z0-9]\)' | sort | uniq | awk '{ print "\tE(" $1 ")," }'
23 	E(B_ALREADY_RUNNING),
24 	E(B_AMBIGUOUS_APP_LAUNCH),
25 	E(B_APP_ERROR_BASE),
26 	E(B_BAD_ADDRESS),
27 	E(B_BAD_DATA),
28 	E(B_BAD_HANDLER),
29 	E(B_BAD_IMAGE_ID),
30 	E(B_BAD_INDEX),
31 	E(B_BAD_MIME_SNIFFER_RULE),
32 	E(B_BAD_PORT_ID),
33 	E(B_BAD_REPLY),
34 	E(B_BAD_SCRIPT_SYNTAX),
35 	E(B_BAD_SEM_ID),
36 	E(B_BAD_SUBSCRIBER),
37 	E(B_BAD_TEAM_ID),
38 	E(B_BAD_THREAD_ID),
39 	E(B_BAD_THREAD_STATE),
40 	E(B_BAD_TYPE),
41 	E(B_BAD_VALUE),
42 	E(B_BUFFER_NOT_AVAILABLE),
43 #ifdef B_BUFFER_OVERFLOW
44 	E(B_BUFFER_OVERFLOW),
45 #endif
46 	E(B_BUSTED_PIPE),
47 	E(B_BUSY),
48 	E(B_CANCELED),
49 	E(B_CROSS_DEVICE_LINK),
50 	E(B_DEBUGGER_ALREADY_INSTALLED),
51 	E(B_DEVICE_ERROR_BASE),
52 	E(B_DEVICE_FULL),
53 #ifdef B_DEVICE_NOT_FOUND
54 	E(B_DEVICE_NOT_FOUND),
55 #endif
56 	E(B_DEV_BAD_DRIVE_NUM),
57 	E(B_DEV_BAD_PID),
58 	E(B_DEV_CONFIGURATION_ERROR),
59 	E(B_DEV_CRC_ERROR),
60 	E(B_DEV_DATA_OVERRUN),
61 	E(B_DEV_DATA_UNDERRUN),
62 	E(B_DEV_DISABLED_BY_USER),
63 	E(B_DEV_DOOR_OPEN),
64 	E(B_DEV_FIFO_OVERRUN),
65 	E(B_DEV_FIFO_UNDERRUN),
66 	E(B_DEV_FORMAT_ERROR),
67 	E(B_DEV_ID_ERROR),
68 	E(B_DEV_INVALID_IOCTL),
69 	E(B_DEV_INVALID_PIPE),
70 	E(B_DEV_MEDIA_CHANGED),
71 	E(B_DEV_MEDIA_CHANGE_REQUESTED),
72 	E(B_DEV_MULTIPLE_ERRORS),
73 	E(B_DEV_NOT_READY),
74 	E(B_DEV_NO_MEDIA),
75 	E(B_DEV_NO_MEMORY),
76 	E(B_DEV_PENDING),
77 	E(B_DEV_READ_ERROR),
78 	E(B_DEV_RECALIBRATE_ERROR),
79 	E(B_DEV_RESOURCE_CONFLICT),
80 	E(B_DEV_SEEK_ERROR),
81 	E(B_DEV_STALLED),
82 	E(B_DEV_TIMEOUT),
83 	E(B_DEV_TOO_LATE),
84 	E(B_DEV_UNEXPECTED_PID),
85 	E(B_DEV_UNREADABLE),
86 	E(B_DEV_WRITE_ERROR),
87 	E(B_DIRECTORY_NOT_EMPTY),
88 	E(B_DONT_DO_THAT),
89 	E(B_DUPLICATE_REPLY),
90 	E(B_ENTRY_NOT_FOUND),
91 	E(B_ERROR),
92 	E(B_ERRORS_END),
93 	E(B_FILE_ERROR),
94 	E(B_FILE_EXISTS),
95 	E(B_FILE_NOT_FOUND),
96 #ifdef B_FILE_TOO_LARGE
97 	E(B_FILE_TOO_LARGE),
98 #endif
99 	E(B_GENERAL_ERROR_BASE),
100 	E(B_INTERFACE_ERROR_BASE),
101 	E(B_INTERRUPTED),
102 	E(B_IO_ERROR),
103 	E(B_IS_A_DIRECTORY),
104 	E(B_LAST_BUFFER_ERROR),
105 	E(B_LAUNCH_FAILED),
106 	E(B_LAUNCH_FAILED_APP_IN_TRASH),
107 	E(B_LAUNCH_FAILED_APP_NOT_FOUND),
108 	E(B_LAUNCH_FAILED_EXECUTABLE),
109 	E(B_LAUNCH_FAILED_FILES_APP_NOT_FOUND),
110 	E(B_LAUNCH_FAILED_NO_PREFERRED_APP),
111 	E(B_LAUNCH_FAILED_NO_RESOLVE_LINK),
112 	E(B_LINK_LIMIT),
113 	E(B_MAIL_ACCESS_ERROR),
114 	E(B_MAIL_ERROR_BASE),
115 	E(B_MAIL_INVALID_MAIL),
116 	E(B_MAIL_NO_DAEMON),
117 	E(B_MAIL_NO_RECIPIENT),
118 	E(B_MAIL_UNKNOWN_FIELD),
119 	E(B_MAIL_UNKNOWN_HOST),
120 	E(B_MAIL_UNKNOWN_USER),
121 	E(B_MAIL_WRONG_PASSWORD),
122 	E(B_MEDIA_ERROR_BASE),
123 	E(B_MESSAGE_TO_SELF),
124 	E(B_MIDI_ERROR_BASE),
125 	E(B_MISMATCHED_VALUES),
126 	E(B_MISSING_LIBRARY),
127 	E(B_MISSING_SYMBOL),
128 	E(B_NAME_IN_USE),
129 	E(B_NAME_NOT_FOUND),
130 	E(B_NAME_TOO_LONG),
131 	E(B_NOT_ALLOWED),
132 	E(B_NOT_AN_EXECUTABLE),
133 	E(B_NOT_A_DIRECTORY),
134 	E(B_NOT_A_MESSAGE),
135 #ifdef B_NOT_SUPPORTED
136 	E(B_NOT_SUPPORTED),
137 #endif
138 	E(B_NO_ERROR),
139 	E(B_NO_INIT),
140 	E(B_NO_MEMORY),
141 	E(B_NO_MORE_FDS),
142 	E(B_NO_MORE_PORTS),
143 	E(B_NO_MORE_SEMS),
144 	E(B_NO_MORE_TEAMS),
145 	E(B_NO_MORE_THREADS),
146 	E(B_NO_PRINT_SERVER),
147 	E(B_OK),
148 	E(B_OS_ERROR_BASE),
149 	E(B_PARTIAL_READ),
150 	E(B_PARTIAL_WRITE),
151 	E(B_PARTITION_TOO_SMALL),
152 	E(B_PERMISSION_DENIED),
153 	E(B_POSIX_ERROR_BASE),
154 	E(B_PRINT_ERROR_BASE),
155 	E(B_READ_ONLY_DEVICE),
156 	E(B_RESOURCE_NOT_FOUND),
157 	E(B_RESOURCE_UNAVAILABLE),
158 #ifdef B_RESULT_NOT_REPRESENTABLE
159 	E(B_RESULT_NOT_REPRESENTABLE),
160 #endif
161 	E(B_SERVER_NOT_FOUND),
162 #ifdef B_SHUTDOWN_CANCELLED
163 	E(B_SHUTDOWN_CANCELLED),
164 #endif
165 #ifdef B_SHUTTING_DOWN
166 	E(B_SHUTTING_DOWN),
167 #endif
168 	E(B_STORAGE_ERROR_BASE),
169 	E(B_STREAM_NOT_FOUND),
170 	E(B_SUBSCRIBER_NOT_ENTERED),
171 	E(B_TIMED_OUT),
172 #ifdef B_TOO_MANY_ARGS
173 	E(B_TOO_MANY_ARGS),
174 #endif
175 	E(B_TRANSLATION_ERROR_BASE),
176 	E(B_UNKNOWN_MIME_TYPE),
177 	E(B_UNSUPPORTED),
178 	E(B_WOULD_BLOCK),
179 	E(E2BIG),
180 	E(EACCES),
181 	E(EADDRINUSE),
182 	E(EADDRNOTAVAIL),
183 	E(EAFNOSUPPORT),
184 	E(EAGAIN),
185 	E(EALREADY),
186 	E(EBADF),
187 #ifdef EBADMSG
188 	E(EBADMSG),
189 #endif
190 	E(EBUSY),
191 #ifdef ECANCELED
192 	E(ECANCELED),
193 #endif
194 	E(ECHILD),
195 	E(ECONNABORTED),
196 	E(ECONNREFUSED),
197 	E(ECONNRESET),
198 	E(EDEADLK),
199 #ifdef EDESTADDRREQ
200 	E(EDESTADDRREQ),
201 #endif
202 	E(EDOM),
203 #ifdef EDQUOT
204 	E(EDQUOT),
205 #endif
206 	E(EEXIST),
207 	E(EFAULT),
208 	E(EFBIG),
209 	E(EFPOS),
210 #ifdef EHOSTDOWN
211 	E(EHOSTDOWN),
212 #endif
213 	E(EHOSTUNREACH),
214 #ifdef EIDRM
215 	E(EIDRM),
216 #endif
217 	E(EILSEQ),
218 	E(EINPROGRESS),
219 	E(EINTR),
220 	E(EINVAL),
221 	E(EIO),
222 	E(EISCONN),
223 	E(EISDIR),
224 	E(ELOOP),
225 	E(EMFILE),
226 	E(EMLINK),
227 	E(EMSGSIZE),
228 #ifdef EMULTIHOP
229 	E(EMULTIHOP),
230 #endif
231 	E(ENAMETOOLONG),
232 	E(ENETDOWN),
233 	E(ENETRESET),
234 	E(ENETUNREACH),
235 	E(ENFILE),
236 	E(ENOBUFS),
237 #ifdef ENODATA
238 	E(ENODATA),
239 #endif
240 	E(ENODEV),
241 	E(ENOENT),
242 	E(ENOEXEC),
243 	E(ENOLCK),
244 #ifdef ENOLINK
245 	E(ENOLINK),
246 #endif
247 	E(ENOMEM),
248 	E(ENOMSG),
249 	E(ENOPROTOOPT),
250 	E(ENOSPC),
251 #ifdef ENOSR
252 	E(ENOSR),
253 #endif
254 #ifdef ENOSTR
255 	E(ENOSTR),
256 #endif
257 	E(ENOSYS),
258 	E(ENOTCONN),
259 	E(ENOTDIR),
260 	E(ENOTEMPTY),
261 	E(ENOTSOCK),
262 #ifdef ENOTSUP
263 	E(ENOTSUP),
264 #endif
265 	E(ENOTTY),
266 	E(ENXIO),
267 	E(EOPNOTSUPP),
268 	E(EOVERFLOW),
269 	E(EPERM),
270 	E(EPFNOSUPPORT),
271 	E(EPIPE),
272 #ifdef EPROTO
273 	E(EPROTO),
274 #endif
275 	E(EPROTONOSUPPORT),
276 	E(EPROTOTYPE),
277 	E(ERANGE),
278 	E(EROFS),
279 	E(ESHUTDOWN),
280 	E(ESIGPARM),
281 	E(ESPIPE),
282 	E(ESRCH),
283 	E(ESTALE),
284 #ifdef ETIME
285 	E(ETIME),
286 #endif
287 	E(ETIMEDOUT),
288 #ifdef ETXTBSY
289 	E(ETXTBSY),
290 #endif
291 	E(ENOATTR),
292 #ifdef ENOTRECOVERABLE
293 	E(ENOTRECOVERABLE),
294 #endif
295 #ifdef EOWNERDEAD
296 	E(EOWNERDEAD),
297 #endif
298 	E(EWOULDBLOCK),
299 	E(EXDEV),
300 	{ 0, NULL }
301 };
302 
303 
304 static void
305 usage(void)
306 {
307 	fprintf(stderr, "usage: %s <error number>\n"
308 		"Prints clear text error messages for given error numbers.\n", __progname);
309 	exit(-1);
310 }
311 
312 
313 static void
314 print_error(char *number)
315 {
316 	char *end;
317 	int32 error = (int32)strtoll(number, &end, 0);
318 		// strtol() cuts off hex numbers that have the highest bit set
319 
320 	if (end[0]) {
321 		// not a number, check names
322 		struct error_pair *p = kErrorNames;
323 		while (p->name && strcmp(p->name, number))
324 			p++;
325 		if (!p->name) {
326 			fprintf(stderr, "%s: invalid number (%s)\n", __progname, number);
327 			exit(1);
328 		}
329 		error = p->value;
330 	}
331 
332 	printf("0x%" B_PRIx32 ": %s\n", error, strerror(error));
333 }
334 
335 
336 int
337 main(int argc, char *argv[])
338 {
339 	int32 i;
340 
341 	if (argc < 2)
342 		usage();
343 
344 	for (i = 1; i < argc; i++) {
345 		print_error(argv[i]);
346 	}
347 
348 	return 0;
349 }
350