feat(components): add statfs, statfs64, fstatfs, fstatfs64 support

This commit is contained in:
xqyjlj
2023-03-29 11:54:25 +08:00
committed by guo
parent e4bd8e00f0
commit cd1e0a7901
3 changed files with 184 additions and 0 deletions

View File

@@ -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)