diff options
author | Andreas Kling <awesomekling@gmail.com> | 2018-11-06 14:13:16 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2018-11-06 14:42:28 +0100 |
commit | 8d1f8b2518d17e90ec8e28fff64c22361b0b0c1b (patch) | |
tree | b60b2307559a1b7b82aebcc16e4f57687ad7639b /LibC/string.cpp | |
parent | b2d23f83ab04ee1e7ca5d16ec32416939077bc4c (diff) | |
download | serenity-8d1f8b2518d17e90ec8e28fff64c22361b0b0c1b.zip |
Add sys_nerr and sys_errlist.
Also keep the canonical errno list in LibC for now. The kernel gets it
from there. This makes building 3rd party code easier.
..also fix broken strchr().
Diffstat (limited to 'LibC/string.cpp')
-rw-r--r-- | LibC/string.cpp | 67 |
1 files changed, 20 insertions, 47 deletions
diff --git a/LibC/string.cpp b/LibC/string.cpp index f66b0613c2..3f5fafb1bc 100644 --- a/LibC/string.cpp +++ b/LibC/string.cpp @@ -115,12 +115,13 @@ char* strncpy(char* dest, const char* src, size_t n) char* strchr(const char* str, int c) { - if (!str) - return nullptr; - char* ptr = (char*)str; - while (*ptr && *ptr != c) - ++ptr; - return ptr; + char ch = c; + for (;; ++str) { + if (*str == ch) + return (char*)str; + if (!*str) + return nullptr; + } } char* strrchr(const char* str, int ch) @@ -154,50 +155,22 @@ char* strncat(char *dest, const char *src, size_t n) return dest; } +const char* sys_errlist[] = { +#undef __ERROR +#define __ERROR(a, b) #b, + __ENUMERATE_ALL_ERRORS +#undef __ERROR +}; +int sys_nerr = __errno_count; + char* strerror(int errnum) { - switch (errnum) { - case 0: return "No error"; - case EPERM: return "Operation not permitted"; - case ENOENT: return "No such file or directory"; - case ESRCH: return "No such process"; - case EINTR: return "Interrupted syscall"; - case EIO: return "I/O error"; - case ENXIO: return "No such device/address"; - case E2BIG: return "Argument list too long"; - case ENOEXEC: return "Exec format error"; - case EBADF: return "Bad fd number"; - case ECHILD: return "No child processes"; - case EAGAIN: return "Try again"; - case ENOMEM: return "Out of memory"; - case EACCES: return "Access denied"; - case EFAULT: return "Bad address"; - case ENOTBLK: return "Not a block device"; - case EBUSY: return "Resource busy"; - case EEXIST: return "File already exists"; - case EXDEV: return "Cross-device link"; - case ENODEV: return "No such device"; - case ENOTDIR: return "Not a directory"; - case EISDIR: return "Is a directory"; - case EINVAL: return "Invalid argument"; - case ENFILE: return "File table overflow"; - case EMFILE: return "Too many open files"; - case ENOTTY: return "Not a TTY"; - case ETXTBSY: return "Text file busy"; - case EFBIG: return "File too big"; - case ENOSPC: return "No space left"; - case ESPIPE: return "Illegal seek"; - case EROFS: return "File system is read-only"; - case EMLINK: return "Too many links"; - case EPIPE: return "Broken pipe"; - case EDOM: return "Math argument out of domain"; - case ERANGE: return "Math result not representable"; - case ENAMETOOLONG: return "Name too long"; - case EOVERFLOW: return "Value too large for data type"; - case ENOTIMPL: return "Not implemented"; + if (errnum >= __errno_count) { + printf("strerror() missing string for errnum=%d\n", errnum); + return "Unknown error"; } - printf("strerror() missing string for errnum=%d\n", errnum); - return "Unknown error"; + return (char*)sys_errlist[errnum]; + } } |