From 81b750f2fd3e885c1c7ff005cb3c495d59581b48 Mon Sep 17 00:00:00 2001 From: ElectronSpark <820461770@qq.com> Date: Thu, 20 Jan 2022 09:01:26 +0000 Subject: [PATCH] =?UTF-8?q?update=20kernel/components/lwp/lwp=5Fsyscall.c.?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=20getrandom=20=E7=B3=BB=E7=BB=9F=E8=B0=83?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/components/lwp/lwp_syscall.c | 57 +++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/kernel/components/lwp/lwp_syscall.c b/kernel/components/lwp/lwp_syscall.c index a8705c6..b7cca79 100644 --- a/kernel/components/lwp/lwp_syscall.c +++ b/kernel/components/lwp/lwp_syscall.c @@ -57,6 +57,8 @@ #include #include "lwp_ipc_internal.h" +#include + #define SET_ERRNO(no) rt_set_errno(-(no)) #define GET_ERRNO() ((rt_get_errno() > 0) ? (-rt_get_errno()) : rt_get_errno()) struct musl_sockaddr @@ -3897,6 +3899,60 @@ int sys_setrlimit(unsigned int resource, struct rlimit *rlim) return -ENOSYS; } +int sys_getrandom(void *buf, size_t buflen, unsigned int flags) +{ + int ret = -1; + int count = 0; + void *kmem = RT_NULL; + rt_device_t rd_dev = RT_NULL; + + if (flags & GRND_RANDOM) + rd_dev = rt_device_find("random"); + else + rd_dev = rt_device_find("urandom"); + + if (rd_dev == RT_NULL) + { + return -EFAULT; + } + + if (rt_device_open(rd_dev, RT_DEVICE_OFLAG_RDONLY) != RT_EOK) + { + return -EFAULT; + } + + if (!lwp_user_accessable(buf, buflen)) + { + rt_device_close(rd_dev); + return -EFAULT; + } + + kmem = kmem_get(buflen); + if (!kmem) + { + rt_device_close(rd_dev); + return -ENOMEM; + } + + while (count < buflen) + { + ret = rt_device_read(rd_dev, count, kmem + count, buflen - count); + if (ret <= 0) + break; + count += ret; + } + rt_device_close(rd_dev); + + ret = count; + if (count > 0) + { + ret = lwp_put_to_user(buf, kmem, count); + } + kmem_put(kmem); + + return ret; +} + const static void* func_table[] = { (void *)sys_exit, /* 01 */ @@ -4080,6 +4136,7 @@ const static void* func_table[] = (void *)sys_prlimit64, /* 140 */ (void *)sys_getrlimit, (void *)sys_setrlimit, + (void *)sys_getrandom, }; const void *lwp_get_sys_api(rt_uint32_t number) -- Gitee