From cd1e0a790124c216c5df3d3eb448e98f37f22097 Mon Sep 17 00:00:00 2001 From: xqyjlj Date: Wed, 29 Mar 2023 11:54:25 +0800 Subject: ✨ feat(components): add statfs, statfs64, fstatfs, fstatfs64 support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp_syscall.c | 142 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) (limited to 'components/lwp/lwp_syscall.c') diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index db5434264c..e7851c29cd 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -4611,6 +4611,144 @@ sysret_t sys_uname(struct utsname *uts) return 0; } +sysret_t sys_statfs(const char *path, struct statfs *buf) +{ + int ret = 0; + int err; + size_t len; + size_t copy_len; + char *copy_path; + struct statfs statfsbuff = {0}; + + if (!lwp_user_accessable((void *)buf, sizeof(struct statfs))) + { + return -EFAULT; + } + + len = lwp_user_strlen(path, &err); + if (err) + { + return -EFAULT; + } + + copy_path = (char*)rt_malloc(len + 1); + if (!copy_path) + { + return -ENOMEM; + } + + copy_len = lwp_get_from_user(copy_path, (void*)path, len); + if (copy_len == 0) + { + rt_free(copy_path); + return -EFAULT; + } + copy_path[copy_len] = '\0'; + + ret = _SYS_WRAP(statfs(copy_path, &statfsbuff)); + rt_free(copy_path); + + if (ret == 0) + { + lwp_put_to_user(buf, &statfsbuff, sizeof statfsbuff); + } + + return ret; +} + +sysret_t sys_statfs64(const char *path, size_t sz, struct statfs *buf) +{ + int ret = 0; + int err; + size_t len; + size_t copy_len; + char *copy_path; + struct statfs statfsbuff = {0}; + + if (!lwp_user_accessable((void *)buf, sizeof(struct statfs))) + { + return -EFAULT; + } + + if (sz != sizeof(struct statfs)) { + return -EINVAL; + } + + len = lwp_user_strlen(path, &err); + if (err) + { + return -EFAULT; + } + + copy_path = (char*)rt_malloc(len + 1); + if (!copy_path) + { + return -ENOMEM; + } + + copy_len = lwp_get_from_user(copy_path, (void*)path, len); + if (copy_len == 0) + { + rt_free(copy_path); + return -EFAULT; + } + copy_path[copy_len] = '\0'; + + ret = _SYS_WRAP(statfs(copy_path, &statfsbuff)); + rt_free(copy_path); + + if (ret == 0) + { + lwp_put_to_user(buf, &statfsbuff, sizeof statfsbuff); + } + + return ret; +} + +sysret_t sys_fstatfs(int fd, struct statfs *buf) +{ + int ret = 0; + struct statfs statfsbuff = {0}; + + if (!lwp_user_accessable((void *)buf, sizeof(struct statfs))) + { + return -EFAULT; + } + + ret = _SYS_WRAP(fstatfs(fd, &statfsbuff)); + + if (ret == 0) + { + lwp_put_to_user(buf, &statfsbuff, sizeof statfsbuff); + } + + return ret; +} + +sysret_t sys_fstatfs64(int fd, size_t sz, struct statfs *buf) +{ + int ret = 0; + struct statfs statfsbuff = {0}; + + if (!lwp_user_accessable((void *)buf, sizeof(struct statfs))) + { + return -EFAULT; + } + + if (sz != sizeof(struct statfs)) { + return -EINVAL; + } + + ret = _SYS_WRAP(fstatfs(fd, &statfsbuff)); + + if (ret == 0) + { + lwp_put_to_user(buf, &statfsbuff, sizeof statfsbuff); + } + + return ret; +} + const static struct rt_syscall_def func_table[] = { SYSCALL_SIGN(sys_exit), /* 01 */ @@ -4822,6 +4960,10 @@ const static struct rt_syscall_def func_table[] = SYSCALL_SIGN(sys_mq_close), SYSCALL_SIGN(sys_stat), //TODO should be replaced by sys_lstat if symbolic link are implemented SYSCALL_SIGN(sys_uname), /* 170 */ + SYSCALL_SIGN(sys_statfs), + SYSCALL_SIGN(sys_statfs64), + SYSCALL_SIGN(sys_fstatfs), + SYSCALL_SIGN(sys_fstatfs64), }; const void *lwp_get_sys_api(rt_uint32_t number) -- cgit v1.3.1