mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
open: fix flags bug
This commit is contained in:
@@ -42,6 +42,7 @@ int fd_insert(file_t *file, int *fdp, int flags);
|
|||||||
#define O_RDONLY 0
|
#define O_RDONLY 0
|
||||||
#define O_WRONLY 1
|
#define O_WRONLY 1
|
||||||
#define O_RDWR 2
|
#define O_RDWR 2
|
||||||
|
#define O_ACCMODE 3
|
||||||
|
|
||||||
#define AT_FDCWD -100
|
#define AT_FDCWD -100
|
||||||
#define O_CREAT 0100
|
#define O_CREAT 0100
|
||||||
|
|||||||
@@ -6,14 +6,36 @@
|
|||||||
#include <logging.h>
|
#include <logging.h>
|
||||||
#include <kernel/auth.h>
|
#include <kernel/auth.h>
|
||||||
|
|
||||||
|
static int open_flags_to_file_flags(int *file_flags) {
|
||||||
|
int access = *file_flags & O_ACCMODE;
|
||||||
|
|
||||||
|
*file_flags &= ~O_ACCMODE;
|
||||||
|
switch (access) {
|
||||||
|
case O_RDONLY:
|
||||||
|
*file_flags |= FILE_READ;
|
||||||
|
break;
|
||||||
|
case O_WRONLY:
|
||||||
|
*file_flags |= FILE_WRITE;
|
||||||
|
break;
|
||||||
|
case O_RDWR:
|
||||||
|
*file_flags |= FILE_READ | FILE_WRITE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
syscallret_t syscall_openat(context_t *context, int dirfd, char *path, int flags, mode_t mode) {
|
syscallret_t syscall_openat(context_t *context, int dirfd, char *path, int flags, mode_t mode) {
|
||||||
syscallret_t ret = {
|
syscallret_t ret = {
|
||||||
.ret = -1,
|
.ret = -1,
|
||||||
.errno = -1
|
.errno = -1
|
||||||
};
|
};
|
||||||
|
|
||||||
// transform O_RDONLY, O_WRONLY, O_RDWR into FILE_READ and FILE_WRITE
|
ret.errno = open_flags_to_file_flags(&flags);
|
||||||
++flags;
|
if (ret.errno)
|
||||||
|
return ret;
|
||||||
|
|
||||||
vnode_t *dirnode = NULL;
|
vnode_t *dirnode = NULL;
|
||||||
file_t *dirfile = NULL;
|
file_t *dirfile = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user