syscalls: linkat

This commit is contained in:
Matheus
2023-07-06 14:01:12 -03:00
parent 4a9306191b
commit 9b945d2bc0
5 changed files with 127 additions and 9 deletions
+31
View File
@@ -3,10 +3,41 @@
#include <stdint.h>
#include <arch/context.h>
#include <kernel/vfs.h>
#include <kernel/file.h>
#include <kernel/scheduler.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