From e1be7ce6b488f1dd52ddf811fc1bee54259c8fdf Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Mon, 9 Jun 2025 23:45:45 -0400 Subject: kernel: vfs: Add SYS_access syscall Signed-off-by: Ian Moffett --- sys/kern/kern_syscall.c | 1 + sys/kern/vfs_syscalls.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) (limited to 'sys/kern') diff --git a/sys/kern/kern_syscall.c b/sys/kern/kern_syscall.c index 8a66f0e..fdcc73f 100644 --- a/sys/kern/kern_syscall.c +++ b/sys/kern/kern_syscall.c @@ -48,6 +48,7 @@ scret_t(*g_sctab[])(struct syscall_args *) = { sys_reboot, /* SYS_reboot */ sys_mmap, /* SYS_mmap */ sys_munmap, /* SYS_munap */ + sys_access, /* SYS_access */ }; const size_t MAX_SYSCALLS = NELEM(g_sctab); diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 8ce1639..0d51331 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -84,6 +84,28 @@ vfs_dostat(const char *path, struct stat *sbuf) return 0; } +static int +vfs_doaccess(const char *path) +{ + struct nameidata nd; + char pathbuf[PATH_MAX]; + int error; + + if ((copyinstr(path, pathbuf, sizeof(pathbuf))) < 0) { + return -EFAULT; + } + + nd.path = pathbuf; + nd.flags = 0; + + if ((error = namei(&nd)) != 0) { + return error; + } + + vfs_release_vnode(nd.vp); + return 0; +} + static int vfs_doopen(const char *pathname, int flags) { @@ -150,3 +172,14 @@ sys_stat(struct syscall_args *scargs) { return vfs_dostat((const char *)scargs->arg0, (void *)scargs->arg1); } + +/* + * Check if a file can be accessed. + * + * @arg0: path + */ +scret_t +sys_access(struct syscall_args *scargs) +{ + return vfs_doaccess((const char *)scargs->arg0); +} -- cgit v1.2.3