libc: Make fopen() parse the mode string

This commit is contained in:
apio 2023-03-12 17:36:04 +01:00
parent d66506256d
commit 9e9f268562
Signed by: apio
GPG Key ID: B8A7D06E42258954

View File

@ -10,6 +10,23 @@
FILE* stderr = nullptr;
static int fopen_parse_mode(const char* mode)
{
int result = 0;
switch (*mode)
{
case 'r': result |= O_RDONLY; break;
case 'w': result |= (O_WRONLY | O_CREAT | O_TRUNC); break;
case 'a': result |= (O_WRONLY | O_CREAT | O_APPEND); break;
default: errno = EINVAL; return -1;
}
if (strchr(mode, '+')) result |= O_RDWR;
return result;
}
extern "C"
{
int console_write(const char* str, size_t size)
@ -18,10 +35,13 @@ extern "C"
__errno_return(rc, int);
}
FILE* fopen(const char* path, const char*)
FILE* fopen(const char* path, const char* mode)
{
// FIXME: Parse the mode string.
int fd = open(path, O_RDWR);
int flags;
if ((flags = fopen_parse_mode(mode)) < 0) return nullptr;
int fd = open(path, flags, 0666);
if (fd < 0) return nullptr;
FILE* f = (FILE*)malloc(sizeof(FILE));