| 1 | // LAF Base Library |
| 2 | // Copyright (c) 2001-2016 David Capello |
| 3 | // |
| 4 | // This file is released under the terms of the MIT license. |
| 5 | // Read LICENSE.txt for more information. |
| 6 | |
| 7 | #ifdef HAVE_CONFIG_H |
| 8 | #include "config.h" |
| 9 | #endif |
| 10 | |
| 11 | #include <string> |
| 12 | |
| 13 | namespace base { |
| 14 | |
| 15 | // Like 'strerror' but thread-safe. |
| 16 | std::string get_errno_string(int errnum) |
| 17 | { |
| 18 | static const char *errors[] = { |
| 19 | "No error" , /* errno = 0 */ |
| 20 | "Operation not permitted" , /* errno = 1 (EPERM) */ |
| 21 | "No such file or directory" , /* errno = 2 (ENOFILE) */ |
| 22 | "No such process" , /* errno = 3 (ESRCH) */ |
| 23 | "Interrupted function call" , /* errno = 4 (EINTR) */ |
| 24 | "Input/output error" , /* errno = 5 (EIO) */ |
| 25 | "No such device or address" , /* errno = 6 (ENXIO) */ |
| 26 | "Arg list too long" , /* errno = 7 (E2BIG) */ |
| 27 | "Exec format error" , /* errno = 8 (ENOEXEC) */ |
| 28 | "Bad file descriptor" , /* errno = 9 (EBADF) */ |
| 29 | "No child processes" , /* errno = 10 (ECHILD) */ |
| 30 | "Resource temporarily unavailable" , /* errno = 11 (EAGAIN) */ |
| 31 | "Not enough space" , /* errno = 12 (ENOMEM) */ |
| 32 | "Permission denied" , /* errno = 13 (EACCES) */ |
| 33 | "Bad address" , /* errno = 14 (EFAULT) */ |
| 34 | NULL, |
| 35 | "Resource device" , /* errno = 16 (EBUSY) */ |
| 36 | "File exists" , /* errno = 17 (EEXIST) */ |
| 37 | "Improper link" , /* errno = 18 (EXDEV) */ |
| 38 | "No such device" , /* errno = 19 (ENODEV) */ |
| 39 | "Not a directory" , /* errno = 20 (ENOTDIR) */ |
| 40 | "Is a directory" , /* errno = 21 (EISDIR) */ |
| 41 | "Invalid argument" , /* errno = 22 (EINVAL) */ |
| 42 | "Too many open files in system" , /* errno = 23 (ENFILE) */ |
| 43 | "Too many open files" , /* errno = 24 (EMFILE) */ |
| 44 | "Inappropriate I/O control operation" , /* errno = 25 (ENOTTY) */ |
| 45 | NULL, |
| 46 | "File too large" , /* errno = 27 (EFBIG) */ |
| 47 | "No space left on device" , /* errno = 28 (ENOSPC) */ |
| 48 | "Invalid seek" , /* errno = 29 (ESPIPE) */ |
| 49 | "Read-only file system" , /* errno = 30 (EROFS) */ |
| 50 | "Too many links" , /* errno = 31 (EMLINK) */ |
| 51 | "Broken pipe" , /* errno = 32 (EPIPE) */ |
| 52 | "Domain error" , /* errno = 33 (EDOM) */ |
| 53 | "Result too large" , /* errno = 34 (ERANGE) */ |
| 54 | NULL, |
| 55 | "Resource deadlock avoided" , /* errno = 36 (EDEADLOCK) */ |
| 56 | NULL, |
| 57 | "Filename too long" , /* errno = 38 (ENAMETOOLONG) */ |
| 58 | "No locks available" , /* errno = 39 (ENOLCK) */ |
| 59 | "Function not implemented" , /* errno = 40 (ENOSYS) */ |
| 60 | "Directory not empty" , /* errno = 41 (ENOTEMPTY) */ |
| 61 | "Illegal byte sequence" , /* errno = 42 (EILSEQ) */ |
| 62 | }; |
| 63 | |
| 64 | if (errnum >= 0 |
| 65 | && errnum < (int)(sizeof(errors)/sizeof(char *)) |
| 66 | && errors[errnum] != NULL) { |
| 67 | return errors[errnum]; |
| 68 | } |
| 69 | else { |
| 70 | return "Unknown error" ; |
| 71 | } |
| 72 | } |
| 73 | |
| 74 | } // namespace base |
| 75 | |