mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 15:48:12 +00:00
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().
This commit is contained in:
parent
b2d23f83ab
commit
8d1f8b2518
3 changed files with 24 additions and 87 deletions
|
@ -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];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue