summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2018-11-06 14:13:16 +0100
committerAndreas Kling <awesomekling@gmail.com>2018-11-06 14:42:28 +0100
commit8d1f8b2518d17e90ec8e28fff64c22361b0b0c1b (patch)
treeb60b2307559a1b7b82aebcc16e4f57687ad7639b
parentb2d23f83ab04ee1e7ca5d16ec32416939077bc4c (diff)
downloadserenity-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.h39
-rw-r--r--LibC/errno.h5
-rw-r--r--LibC/string.cpp67
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];
+
}
}