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 | |
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().
-rw-r--r-- | Kernel/errno.h | 39 | ||||
-rw-r--r-- | LibC/errno.h | 5 | ||||
-rw-r--r-- | LibC/string.cpp | 67 |
3 files changed, 24 insertions, 87 deletions
diff --git a/Kernel/errno.h b/Kernel/errno.h index 71a874b5a4..0a336ee3df 100644 --- a/Kernel/errno.h +++ b/Kernel/errno.h @@ -1,40 +1,3 @@ #pragma once -#define EPERM 1 // Operation not permitted -#define ENOENT 2 // No such file or directory -#define ESRCH 3 // No such process -#define EINTR 4 // Interrupted system call -#define EIO 5 // I/O error -#define ENXIO 6 // No such device or address -#define E2BIG 7 // Argument list too long -#define ENOEXEC 8 // Exec format error -#define EBADF 9 // Bad file number -#define ECHILD 10 // No child processes -#define EAGAIN 11 // Try again -#define ENOMEM 12 // Out of memory -#define EACCES 13 // Permission denied -#define EFAULT 14 // Bad address -#define ENOTBLK 15 // Block device required -#define EBUSY 16 // Device or resource busy -#define EEXIST 17 // File exists -#define EXDEV 18 // Cross-device link -#define ENODEV 19 // No such device -#define ENOTDIR 20 // Not a directory -#define EISDIR 21 // Is a directory -#define EINVAL 22 // Invalid argument -#define ENFILE 23 // File table overflow -#define EMFILE 24 // Too many open files -#define ENOTTY 25 // Not a typewriter -#define ETXTBSY 26 // Text file busy -#define EFBIG 27 // File too large -#define ENOSPC 28 // No space left on device -#define ESPIPE 29 // Illegal seek -#define EROFS 30 // Read-only file system -#define EMLINK 31 // Too many links -#define EPIPE 32 // Broken pipe -#define EDOM 33 // Math argument out of domain of func -#define ERANGE 34 // Math result not representable -#define ENAMETOOLONG 36 // Name too long -#define ELOOP 40 // Too many symbolic links -#define EOVERFLOW 75 // Value too large for defined data type -#define ENOTIMPL 999 // Not implemented +#include <LibC/errno_numbers.h> diff --git a/LibC/errno.h b/LibC/errno.h index 235a9b383f..967cc18b37 100644 --- a/LibC/errno.h +++ b/LibC/errno.h @@ -1,7 +1,7 @@ #pragma once #include <sys/cdefs.h> -#include <Kernel/errno.h> +#include <errno_numbers.h> #define __RETURN_WITH_ERRNO(rc, good_ret, bad_ret) \ do { \ @@ -16,7 +16,8 @@ __BEGIN_DECLS +extern const char* sys_errlist[]; +extern int sys_nerr; extern int errno; __END_DECLS - 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]; + } } |