From 65e559596ba9c4e0c012750b40b0f408712377c2 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 24 Aug 2026 19:16:37 +0300 Subject: [PATCH] LibC: Add sys/random.h with getrandom --- userspace/libraries/LibC/CMakeLists.txt | 1 + userspace/libraries/LibC/include/sys/random.h | 19 ++++++++++ userspace/libraries/LibC/sys/random.cpp | 37 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 userspace/libraries/LibC/include/sys/random.h create mode 100644 userspace/libraries/LibC/sys/random.cpp diff --git a/userspace/libraries/LibC/CMakeLists.txt b/userspace/libraries/LibC/CMakeLists.txt index 025f5007..9fbdd208 100644 --- a/userspace/libraries/LibC/CMakeLists.txt +++ b/userspace/libraries/LibC/CMakeLists.txt @@ -49,6 +49,7 @@ set(LIBC_SOURCES sys/futex.cpp sys/ioctl.cpp sys/mman.cpp + sys/random.cpp sys/resource.cpp sys/select.cpp sys/shm.cpp diff --git a/userspace/libraries/LibC/include/sys/random.h b/userspace/libraries/LibC/include/sys/random.h new file mode 100644 index 00000000..db5671ce --- /dev/null +++ b/userspace/libraries/LibC/include/sys/random.h @@ -0,0 +1,19 @@ +#ifndef _SYS_RANDOM_H +#define _SYS_RANDOM_H 1 + +#include + +__BEGIN_DECLS + +#define __need_size_t +#define __need_ssize_t +#include + +#define GRND_RANDOM 0x01 +#define GRND_NONBLOCK 0x02 + +ssize_t getrandom(void* buf, size_t size, unsigned int flags); + +__END_DECLS + +#endif diff --git a/userspace/libraries/LibC/sys/random.cpp b/userspace/libraries/LibC/sys/random.cpp new file mode 100644 index 00000000..f6857244 --- /dev/null +++ b/userspace/libraries/LibC/sys/random.cpp @@ -0,0 +1,37 @@ +#include +#include + +ssize_t getrandom(void* buf, size_t size, unsigned int flags) +{ + const unsigned int valid_flags = GRND_RANDOM | GRND_NONBLOCK; + if ((flags & valid_flags) != flags) + { + errno = EINVAL; + return -1; + } + + const char* path = (flags & GRND_RANDOM) ? "/dev/random" : "/dev/urandom"; + + int oflag = O_RDONLY; + if (flags & GRND_NONBLOCK) + oflag |= O_NONBLOCK; + + int fd = open(path, oflag); + if (fd == -1) + return -1; + + uint8_t* ubuf = static_cast(buf); + + size_t total_read = 0; + while (total_read < size) + { + const ssize_t nread = read(fd, ubuf + total_read, size - total_read); + if (nread <= 0) + break; + total_read += nread; + } + + close(fd); + + return total_read; +}