diff options
author | Ian Moffett <ian@osmora.org> | 2025-06-09 23:45:45 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-06-09 23:46:26 -0400 |
commit | e1be7ce6b488f1dd52ddf811fc1bee54259c8fdf (patch) | |
tree | 38c58facf79e00bf88b132d9a5b40e2f62775b31 /sys | |
parent | 6c9ba6d8f3a22b0f20ee315435dba0eadd924210 (diff) |
kernel: vfs: Add SYS_access syscall
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/include/sys/syscall.h | 1 | ||||
-rw-r--r-- | sys/include/sys/vfs.h | 1 | ||||
-rw-r--r-- | sys/kern/kern_syscall.c | 1 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 33 |
4 files changed, 36 insertions, 0 deletions
diff --git a/sys/include/sys/syscall.h b/sys/include/sys/syscall.h index dad2e00..0376bd2 100644 --- a/sys/include/sys/syscall.h +++ b/sys/include/sys/syscall.h @@ -50,6 +50,7 @@ #define SYS_reboot 9 #define SYS_mmap 10 #define SYS_munmap 11 +#define SYS_access 12 #if defined(_KERNEL) /* Syscall return value and arg type */ diff --git a/sys/include/sys/vfs.h b/sys/include/sys/vfs.h index 1ff722a..fcb7391 100644 --- a/sys/include/sys/vfs.h +++ b/sys/include/sys/vfs.h @@ -40,6 +40,7 @@ scret_t sys_close(struct syscall_args *args); scret_t sys_read(struct syscall_args *scargs); scret_t sys_write(struct syscall_args *sargs); scret_t sys_stat(struct syscall_args *scargs); +scret_t sys_access(struct syscall_args *scargs); #endif /* _KERNEL */ #endif /* !_SYS_VFS_H_ */ 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); +} |