vfs: check userland buffers before reading them.
[haiku.git] / src / system / libroot / posix / string / strerror.c
blob53cb6735c858f4afed9b4d673d8603b968049fe5
1 /*
2 * Copyright 2005-2009, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT license.
5 * Copyright 2001, Dan Sinclair. All rights reserved.
6 * Distributed under the terms of the NewOS License.
7 */
10 #include <string.h>
11 #include <stdio.h>
13 #include <SupportDefs.h>
16 static const struct error_base {
17 int base;
18 const char *name;
19 } kErrorBases[] = {
20 {B_GENERAL_ERROR_BASE, "General "},
21 {B_OS_ERROR_BASE, "OS "},
22 {B_APP_ERROR_BASE, "Application Kit "},
23 {B_INTERFACE_ERROR_BASE, "Interface Kit "},
24 {B_MEDIA_ERROR_BASE, "Media Kit "},
25 {B_TRANSLATION_ERROR_BASE, "Translation Kit "},
26 {B_MIDI_ERROR_BASE, "Midi Kit "},
27 {B_STORAGE_ERROR_BASE, "Storage Kit "},
28 {B_POSIX_ERROR_BASE, "POSIX "},
29 {B_MAIL_ERROR_BASE, "Mail Kit "},
30 {B_PRINT_ERROR_BASE, "Print "},
31 {B_DEVICE_ERROR_BASE, "Device "},
32 {B_ERRORS_END, "Application "},
34 static const uint32 kNumErrorBases = sizeof(kErrorBases)
35 / sizeof(struct error_base);
38 static char *
39 error_description(int error)
41 switch (error) {
42 // General Errors
44 case B_NO_ERROR:
45 return "No error";
46 case B_ERROR:
47 return "General system error";
49 case B_NO_MEMORY:
50 case B_POSIX_ENOMEM:
51 // ENOMEM
52 return "Out of memory";
53 case B_IO_ERROR:
54 // EIO
55 return "I/O error";
56 case B_PERMISSION_DENIED:
57 // EACCES
58 return "Permission denied";
59 case B_BAD_INDEX:
60 return "Index not in range for the data set";
61 case B_BAD_TYPE:
62 return "Bad argument type passed to function";
63 case B_BAD_VALUE:
64 // EINVAL
65 return "Invalid Argument";
66 case B_MISMATCHED_VALUES:
67 return "Mismatched values passed to function";
68 case B_NAME_NOT_FOUND:
69 return "Name not found";
70 case B_NAME_IN_USE:
71 return "Name in use";
72 case B_TIMED_OUT:
73 // ETIMEDOUT
74 return "Operation timed out";
75 case B_INTERRUPTED:
76 // EINTR
77 return "Interrupted system call";
78 case B_WOULD_BLOCK:
79 // EAGAIN
80 // EWOULDBLOCK
81 return "Operation would block";
82 case B_CANCELED:
83 return "Operation canceled";
84 case B_NO_INIT:
85 return "Initialization failed";
86 case B_BUSY:
87 // EBUSY
88 return "Device/File/Resource busy";
89 case B_NOT_ALLOWED:
90 // EPERM
91 return "Operation not allowed";
92 case B_BAD_DATA:
93 return "Bad data";
94 case B_DONT_DO_THAT:
95 return "No, really, don't do that";
97 // Kernel Kit Errors
99 case B_BAD_SEM_ID:
100 return "Bad semaphore ID";
101 case B_NO_MORE_SEMS:
102 return "No more semaphores";
104 case B_BAD_THREAD_ID:
105 return "Bad thread ID";
106 case B_NO_MORE_THREADS:
107 return "No more threads";
108 case B_BAD_THREAD_STATE:
109 return "Thread is inappropriate state";
110 case B_BAD_TEAM_ID:
111 return "Operation on invalid team";
112 case B_NO_MORE_TEAMS:
113 return "No more teams";
115 case B_BAD_PORT_ID:
116 return "Bad port ID";
117 case B_NO_MORE_PORTS:
118 return "No more ports available"; // "No more ports"
120 case B_BAD_IMAGE_ID:
121 return "Bad image ID";
122 case B_BAD_ADDRESS:
123 // EFAULT
124 return "Bad address";
125 case B_NOT_AN_EXECUTABLE:
126 // ENOEXEC
127 return "Not an executable";
128 case B_MISSING_LIBRARY:
129 return "Missing library";
130 case B_MISSING_SYMBOL:
131 return "Symbol not found";
132 case B_UNKNOWN_EXECUTABLE:
133 return "Unknown executable format";
134 case B_LEGACY_EXECUTABLE:
135 return "Unsupported legacy executable";
137 case B_DEBUGGER_ALREADY_INSTALLED:
138 return "Debugger already installed for this team";
140 // Application Kit Errors
142 case B_BAD_REPLY:
143 return "Invalid or unwanted reply";
144 case B_DUPLICATE_REPLY:
145 return "Duplicate reply";
146 case B_MESSAGE_TO_SELF:
147 return "Can't send message to self";
148 case B_BAD_HANDLER:
149 return "Bad handler";
150 case B_ALREADY_RUNNING:
151 return "Already running";
152 case B_LAUNCH_FAILED:
153 return "Launch failed";
154 case B_AMBIGUOUS_APP_LAUNCH:
155 return "Ambiguous app launch";
156 case B_UNKNOWN_MIME_TYPE:
157 return "Unknown MIME type";
158 case B_BAD_SCRIPT_SYNTAX:
159 return "Bad script syntax";
160 case B_LAUNCH_FAILED_NO_RESOLVE_LINK:
161 return "Could not resolve a link";
162 case B_LAUNCH_FAILED_EXECUTABLE:
163 return "File is mistakenly marked as executable";
164 case B_LAUNCH_FAILED_APP_NOT_FOUND:
165 return "Application could not be found";
166 case B_LAUNCH_FAILED_APP_IN_TRASH:
167 return "Application is in the trash";
168 case B_LAUNCH_FAILED_NO_PREFERRED_APP:
169 return "There is no preferred application for this type of file";
170 case B_LAUNCH_FAILED_FILES_APP_NOT_FOUND:
171 return "This file has a preferred app, but it could not be found";
172 case B_BAD_MIME_SNIFFER_RULE:
173 return "Bad sniffer rule";
174 case B_NOT_A_MESSAGE:
175 return "Data is not a message";
176 case B_SHUTDOWN_CANCELLED:
177 return "System shutdown cancelled";
178 case B_SHUTTING_DOWN:
179 return "System shutting down";
181 // Storage Kit Errors
183 case B_FILE_ERROR:
184 // EBADF
185 return "Bad file descriptor";
186 case B_FILE_NOT_FOUND:
187 case B_ENTRY_NOT_FOUND:
188 // ENOENT
189 return "No such file or directory";
190 case B_FILE_EXISTS:
191 // EEXIST
192 return "File or Directory already exists";
193 case B_NAME_TOO_LONG:
194 // ENAMETOOLONG
195 return "File name too long";
196 case B_NOT_A_DIRECTORY:
197 // ENOTDIR
198 return "Not a directory";
199 case B_DIRECTORY_NOT_EMPTY:
200 // ENOTEMPTY
201 return "Directory not empty";
202 case B_DEVICE_FULL:
203 // ENOSPC
204 return "No space left on device";
205 case B_READ_ONLY_DEVICE:
206 // EROFS:
207 return "Read-only file system";
208 case B_IS_A_DIRECTORY:
209 // EISDIR
210 return "Is a directory";
211 case B_NO_MORE_FDS:
212 // EMFILE
213 return "Too many open files";
214 case B_CROSS_DEVICE_LINK:
215 // EXDEV
216 return "Cross-device link";
217 case B_LINK_LIMIT:
218 // ELOOP
219 return "Too many symbolic links";
220 case B_BUSTED_PIPE:
221 // EPIPE
222 return "Broken pipe";
223 case B_UNSUPPORTED:
224 return "Operation not supported";
225 case B_PARTITION_TOO_SMALL:
226 return "Partition too small to contain filesystem";
227 case B_PARTIAL_READ:
228 return "Data read partially";
229 case B_PARTIAL_WRITE:
230 return "Data written partially";
232 // Media Kit Errors
234 case B_STREAM_NOT_FOUND:
235 return "Stream not found";
236 case B_SERVER_NOT_FOUND:
237 return "Server not found";
238 case B_RESOURCE_NOT_FOUND:
239 return "Resource not found";
240 case B_RESOURCE_UNAVAILABLE:
241 return "Resource unavailable";
242 case B_BAD_SUBSCRIBER:
243 return "Bad subscriber";
244 case B_SUBSCRIBER_NOT_ENTERED:
245 return "Subscriber not entered";
246 case B_BUFFER_NOT_AVAILABLE:
247 return "Buffer not available";
248 case B_LAST_BUFFER_ERROR:
249 return "Last buffer";
250 case B_MEDIA_SYSTEM_FAILURE:
251 return "System failure";
252 case B_MEDIA_BAD_NODE:
253 return "Bad media node";
254 case B_MEDIA_NODE_BUSY:
255 return "Media node busy";
256 case B_MEDIA_BAD_FORMAT:
257 return "Bad media format";
258 case B_MEDIA_BAD_BUFFER:
259 return "Bad buffer";
260 case B_MEDIA_TOO_MANY_NODES:
261 return "Too many nodes";
262 case B_MEDIA_TOO_MANY_BUFFERS:
263 return "Too many buffers";
264 case B_MEDIA_NODE_ALREADY_EXISTS:
265 return "Media node already exists";
266 case B_MEDIA_BUFFER_ALREADY_EXISTS:
267 return "Buffer already exists";
268 case B_MEDIA_CANNOT_SEEK:
269 return "Cannot seek";
270 case B_MEDIA_CANNOT_CHANGE_RUN_MODE:
271 return "Cannot change run mode";
272 case B_MEDIA_APP_ALREADY_REGISTERED:
273 return "Application already registered";
274 case B_MEDIA_APP_NOT_REGISTERED:
275 return "Application not registered";
276 case B_MEDIA_CANNOT_RECLAIM_BUFFERS:
277 return "Cannot reclaim buffers";
278 case B_MEDIA_BUFFERS_NOT_RECLAIMED:
279 return "Buffers not reclaimed";
280 case B_MEDIA_TIME_SOURCE_STOPPED:
281 return "Time source stopped";
282 case B_MEDIA_TIME_SOURCE_BUSY:
283 return "Time source busy";
284 case B_MEDIA_BAD_SOURCE:
285 return "Bad source";
286 case B_MEDIA_BAD_DESTINATION:
287 return "Bad destination";
288 case B_MEDIA_ALREADY_CONNECTED:
289 return "Already connected";
290 case B_MEDIA_NOT_CONNECTED:
291 return "Not connected";
292 case B_MEDIA_BAD_CLIP_FORMAT:
293 return "Bad clipping format";
294 case B_MEDIA_ADDON_FAILED:
295 return "Media addon failed";
296 case B_MEDIA_ADDON_DISABLED:
297 return "Media addon disabled";
298 case B_MEDIA_CHANGE_IN_PROGRESS:
299 return "Change in progress";
300 case B_MEDIA_STALE_CHANGE_COUNT:
301 return "Stale change count";
302 case B_MEDIA_ADDON_RESTRICTED:
303 return "Media addon restricted";
304 case B_MEDIA_NO_HANDLER:
305 return "No handler";
306 case B_MEDIA_DUPLICATE_FORMAT:
307 return "Duplicate format";
308 case B_MEDIA_REALTIME_DISABLED:
309 return "Realtime disabled";
310 case B_MEDIA_REALTIME_UNAVAILABLE:
311 return "Realtime unavailable";
313 // Mail Kit Errors
315 case B_MAIL_NO_DAEMON:
316 return "No mail daemon";
317 case B_MAIL_UNKNOWN_USER:
318 return "Unknown mail user";
319 case B_MAIL_WRONG_PASSWORD:
320 return "Wrong password (mail)";
321 case B_MAIL_UNKNOWN_HOST:
322 return "Mail unknown host";
323 case B_MAIL_ACCESS_ERROR:
324 return "Mail access error";
325 case B_MAIL_UNKNOWN_FIELD:
326 return "Unknown mail field";
327 case B_MAIL_NO_RECIPIENT:
328 return "No mail recipient";
329 case B_MAIL_INVALID_MAIL:
330 return "Invalid mail";
332 // Printing Errors
334 case B_NO_PRINT_SERVER:
335 return "No print server";
337 // Device Kit Errors
339 case B_DEV_INVALID_IOCTL:
340 return "Invalid device ioctl";
341 case B_DEV_NO_MEMORY:
342 return "No device memory";
343 case B_DEV_BAD_DRIVE_NUM:
344 return "Bad drive number";
345 case B_DEV_NO_MEDIA:
346 return "No media present";
347 case B_DEV_UNREADABLE:
348 return "Device unreadable";
349 case B_DEV_FORMAT_ERROR:
350 return "Device format error";
351 case B_DEV_TIMEOUT:
352 return "Device timeout";
353 case B_DEV_RECALIBRATE_ERROR:
354 return "Device recalibrate error";
355 case B_DEV_SEEK_ERROR:
356 return "Device seek error";
357 case B_DEV_ID_ERROR:
358 return "Device ID error";
359 case B_DEV_READ_ERROR:
360 return "Device read error";
361 case B_DEV_WRITE_ERROR:
362 return "Device write error";
363 case B_DEV_NOT_READY:
364 return "Device not ready";
365 case B_DEV_MEDIA_CHANGED:
366 return "Device media changed";
367 case B_DEV_MEDIA_CHANGE_REQUESTED:
368 return "Device media change requested";
369 case B_DEV_RESOURCE_CONFLICT:
370 return "Resource conflict";
371 case B_DEV_CONFIGURATION_ERROR:
372 return "Configuration error";
373 case B_DEV_DISABLED_BY_USER:
374 return "Disabled by user";
375 case B_DEV_DOOR_OPEN:
376 return "Drive door open";
378 // the commented out ones are really strange error codes...
379 //case B_DEV_INVALID_PIPE:
381 case B_DEV_CRC_ERROR:
382 return "Device check-sum error";
383 case B_DEV_STALLED:
384 return "Device stalled";
386 //case B_DEV_BAD_PID:
387 //case B_DEV_UNEXPECTED_PID:
389 case B_DEV_DATA_OVERRUN:
390 return "Device data overrun";
391 case B_DEV_DATA_UNDERRUN:
392 return "Device data underrun";
393 case B_DEV_FIFO_OVERRUN:
394 return "Device FIFO overrun";
395 case B_DEV_FIFO_UNDERRUN:
396 return "Device FIFO underrun";
397 case B_DEV_PENDING:
398 return "Device pending";
399 case B_DEV_MULTIPLE_ERRORS:
400 return "Multiple device errors";
401 case B_DEV_TOO_LATE:
402 return "Device too late";
404 // Translation Kit Errors
406 case B_NO_TRANSLATOR:
407 return "No translator found";
408 case B_ILLEGAL_DATA:
409 return "Illegal data";
411 // Other POSIX Errors
413 case ENFILE:
414 return "File table overflow";
415 case ENXIO:
416 return "Device not accessible";
417 case ESPIPE:
418 return "Seek not allowed on file descriptor";
419 case ENOSYS:
420 return "Function not implemented";
421 case EDOM:
422 return "Numerical argument out of range"; // "Domain Error"
423 case ENOBUFS:
424 return "No buffer space available";
425 case E2BIG:
426 return "Argument too big";
427 case ECHILD:
428 return "No child process";
429 case EDEADLK:
430 return "Resource deadlock";
431 case EFBIG:
432 return "File too large";
433 case EMLINK:
434 return "Too many links";
435 case ENODEV:
436 return "No such device";
437 case ENOLCK:
438 return "No record locks available";
439 case ENOTTY:
440 return "Not a tty";
441 case ESRCH:
442 return "No such process";
443 case EFPOS:
444 return "File Position Error";
445 case ESIGPARM:
446 return "Signal Error";
447 case ERANGE:
448 return "Range Error";
450 case EPROTOTYPE:
451 return "Protocol wrong type for socket";
452 case EPROTONOSUPPORT:
453 return "Protocol not supported";
454 case EPFNOSUPPORT:
455 return "Protocol family not supported";
456 case EAFNOSUPPORT:
457 return "Address family not supported by protocol family";
458 case EADDRINUSE:
459 return "Address already in use";
460 case EADDRNOTAVAIL:
461 return "Can't assign requested address";
462 case ENETDOWN:
463 return "Network is down";
464 case ENETUNREACH:
465 return "Network is unreachable";
466 case ENETRESET:
467 return "Network dropped connection on reset";
468 case ECONNABORTED:
469 return "Software caused connection abort";
470 case ECONNRESET:
471 return "Connection reset by peer";
472 case EISCONN:
473 return "Socket is already connected";
474 case ENOTCONN:
475 return "Socket is not connected";
476 case ESHUTDOWN:
477 return "Can't send after socket shutdown";
478 case ECONNREFUSED:
479 return "Connection refused";
480 case EHOSTUNREACH:
481 return "No route to host";
482 case ENOPROTOOPT:
483 return "Protocol option not available";
484 case EINPROGRESS:
485 return "Operation now in progress";
486 case EALREADY:
487 return "Operation already in progress";
488 case EILSEQ:
489 return "Illegal byte sequence";
490 case ENOMSG:
491 return "No message of desired type";
492 case ESTALE:
493 return "Stale file handle";
495 case EOVERFLOW:
496 return "Value too large for defined type";
497 case EMSGSIZE:
498 return "Message too long";
499 case EOPNOTSUPP:
500 return "Operation not supported";
501 case ENOTSOCK:
502 return "Socket operation on non-socket";
503 case EHOSTDOWN:
504 return "Host is down";
505 case EBADMSG:
506 return "Bad message";
507 case ECANCELED:
508 return "Operation canceled";
509 case EDESTADDRREQ:
510 return "Destination address required";
511 case EDQUOT:
512 return "Reserved";
513 case EIDRM:
514 return "Identifier removed";
515 case EMULTIHOP:
516 return "Reserved";
517 case ENODATA:
518 return "No message available";
519 case ENOLINK:
520 return "Reserved";
521 case ENOSR:
522 return "No STREAM resources";
523 case ENOSTR:
524 return "Not a STREAM";
525 case ENOTSUP:
526 return "Not supported";
527 case EPROTO:
528 return "Protocol error";
529 case ETIME:
530 return "STREAM ioctl() timeout";
531 case ETXTBSY:
532 return "Text file busy";
533 case ENOATTR:
534 return "No such attribute";
536 default:
537 return NULL;
542 char *
543 strerror(int error)
545 static char unknown[48];
546 uint32 i;
548 char *description = error_description(error);
549 if (description != NULL)
550 return description;
552 if (error < B_OK) {
553 const char *system = "";
554 for (i = 0; i < kNumErrorBases; i++) {
555 if (kErrorBases[i].base <= error
556 && ((i + 1 < kNumErrorBases && kErrorBases[i + 1].base > error)
557 || i + 1 == kNumErrorBases)) {
558 system = kErrorBases[i].name;
559 break;
562 sprintf(unknown, "Unknown %sError (%d)", system, error);
563 } else
564 sprintf(unknown, "No Error (%d)", error);
566 return unknown;
571 strerror_r(int error, char *buffer, size_t bufferSize)
573 char *description = error_description(error);
574 if (description == NULL)
575 return EINVAL;
577 strlcpy(buffer, description, bufferSize);
578 return 0;
579 // TODO: could return ERANGE if buffer is too small