libc: Make fopen() parse the mode string
This commit is contained in:
parent
d66506256d
commit
9e9f268562
@ -10,6 +10,23 @@
|
|||||||
|
|
||||||
FILE* stderr = nullptr;
|
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"
|
extern "C"
|
||||||
{
|
{
|
||||||
int console_write(const char* str, size_t size)
|
int console_write(const char* str, size_t size)
|
||||||
@ -18,10 +35,13 @@ extern "C"
|
|||||||
__errno_return(rc, int);
|
__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 flags;
|
||||||
int fd = open(path, O_RDWR);
|
|
||||||
|
if ((flags = fopen_parse_mode(mode)) < 0) return nullptr;
|
||||||
|
|
||||||
|
int fd = open(path, flags, 0666);
|
||||||
if (fd < 0) return nullptr;
|
if (fd < 0) return nullptr;
|
||||||
|
|
||||||
FILE* f = (FILE*)malloc(sizeof(FILE));
|
FILE* f = (FILE*)malloc(sizeof(FILE));
|
||||||
|
Loading…
Reference in New Issue
Block a user