|
27 | 27 |
|
28 | 28 | #include <sys/types.h>
|
29 | 29 | #include <sys/stat.h>
|
| 30 | +#include <fcntl.h> |
30 | 31 | #include <unistd.h>
|
31 | 32 | #include <errno.h>
|
32 | 33 | #include <stdio.h>
|
|
49 | 50 | #define USE_STATFS 1
|
50 | 51 | #endif
|
51 | 52 |
|
| 53 | +#if defined(__GLIBC__) && defined(__GLIBC_PREREQ) |
| 54 | +#if __GLIBC_PREREQ(2, 25) |
| 55 | +#include <sys/random.h> |
| 56 | +#define _HAVE_GETRANDOM |
| 57 | +#endif |
| 58 | +#endif |
| 59 | + |
| 60 | +STATIC mp_obj_t mod_os_urandom(mp_obj_t num) { |
| 61 | + mp_int_t n = mp_obj_get_int(num); |
| 62 | + vstr_t vstr; |
| 63 | + vstr_init_len(&vstr, n); |
| 64 | + #ifdef _HAVE_GETRANDOM |
| 65 | + RAISE_ERRNO(getrandom(vstr.buf, n, 0), errno); |
| 66 | + #else |
| 67 | + int fd = open("/dev/urandom", O_RDONLY); |
| 68 | + RAISE_ERRNO(fd, errno); |
| 69 | + RAISE_ERRNO(read(fd, vstr.buf, n), errno); |
| 70 | + close(fd); |
| 71 | + #endif |
| 72 | + return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); |
| 73 | +} |
| 74 | +STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_os_urandom_obj, mod_os_urandom); |
| 75 | + |
52 | 76 | STATIC mp_obj_t mod_os_stat(mp_obj_t path_in) {
|
53 | 77 | struct stat sb;
|
54 | 78 | const char *path = mp_obj_str_get_str(path_in);
|
@@ -309,6 +333,7 @@ STATIC const mp_rom_map_elem_t mp_module_os_globals_table[] = {
|
309 | 333 | { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_uos) },
|
310 | 334 | { MP_ROM_QSTR(MP_QSTR_errno), MP_ROM_PTR(&mod_os_errno_obj) },
|
311 | 335 | { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&mod_os_stat_obj) },
|
| 336 | + { MP_ROM_QSTR(MP_QSTR_urandom), MP_ROM_PTR(&mod_os_urandom_obj) }, |
312 | 337 | #if MICROPY_PY_OS_STATVFS
|
313 | 338 | { MP_ROM_QSTR(MP_QSTR_statvfs), MP_ROM_PTR(&mod_os_statvfs_obj) },
|
314 | 339 | #endif
|
|
0 commit comments