Files
Astral/kernel-src/include/kernel/syscalls.h
T
2024-06-09 19:31:26 -03:00

45 lines
811 B
C

#ifndef _SYSCALLS_H
#define _SYSCALLS_H
#include <stdint.h>
#include <arch/context.h>
#include <kernel/vfs.h>
#include <kernel/file.h>
#include <kernel/scheduler.h>
#include <kernel/usercopy.h>
typedef struct {
uint64_t ret;
uint64_t errno;
} syscallret_t;
static inline int dirfd_enter(char *path, int dirfd, file_t **file, vnode_t **dirnode) {
if (*path == '/') {
*dirnode = sched_getroot();
} else if (dirfd == AT_FDCWD) {
*dirnode = sched_getcwd();
} else {
*file = fd_get(dirfd);
if (file == NULL) {
return EBADF;
}
*dirnode = (*file)->vnode;
if ((*dirnode)->type != V_TYPE_DIR) {
fd_release(*file);
return ENOTDIR;
}
}
return 0;
}
static inline void dirfd_leave(vnode_t *dirnode, file_t *file) {
if (file)
fd_release(file);
else
VOP_RELEASE(dirnode);
}
#endif