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:
Andreas Kling 2018-11-06 14:13:16 +01:00
parent b2d23f83ab
commit 8d1f8b2518
Notes: sideshowbarker 2024-07-19 18:33:02 +09:00
3 changed files with 24 additions and 87 deletions

View file

@ -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>

View file

@ -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

View file

@ -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];
}
}