summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-06-09 23:45:45 -0400
committerIan Moffett <ian@osmora.org>2025-06-09 23:46:26 -0400
commite1be7ce6b488f1dd52ddf811fc1bee54259c8fdf (patch)
tree38c58facf79e00bf88b132d9a5b40e2f62775b31 /sys/kern
parent6c9ba6d8f3a22b0f20ee315435dba0eadd924210 (diff)
kernel: vfs: Add SYS_access syscall
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_syscall.c1
-rw-r--r--sys/kern/vfs_syscalls.c33
2 files changed, 34 insertions, 0 deletions
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
@@ -85,6 +85,28 @@ vfs_dostat(const char *path, struct stat *sbuf)
}
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)
{
char pathbuf[PATH_MAX];
@@ -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);
+}