1*701a94f5Santon /* $OpenBSD: kqueue-random.c,v 1.13 2021/12/14 06:26:15 anton Exp $ */
2e337cadcSmickey /* Written by Michael Shalayeff, 2002, Public Domain */
38c56f353Smickey
449a6e16fSderaadt #include <sys/types.h>
58c56f353Smickey #include <sys/event.h>
6*701a94f5Santon #include <sys/time.h>
78c56f353Smickey
8bd35765dSbluhm #include <err.h>
96316a812Sguenther #include <fcntl.h>
10bd35765dSbluhm #include <stdio.h>
11bd35765dSbluhm #include <stdlib.h>
12bd35765dSbluhm #include <string.h>
13bd35765dSbluhm #include <unistd.h>
14bd35765dSbluhm
15bd35765dSbluhm #include "main.h"
16db3296cfSderaadt
1749a6e16fSderaadt #define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
1849a6e16fSderaadt
198c56f353Smickey int
do_random(void)208c56f353Smickey do_random(void)
218c56f353Smickey {
22544ebf79Smickey int n, fd, kq;
238c56f353Smickey struct timespec ts;
248c56f353Smickey struct kevent ev;
25a4cc8db0Sderaadt u_int32_t buf[BUFSIZ];
268c56f353Smickey
27bd35765dSbluhm ASS((fd = open("/dev/random", O_RDONLY)) >= 0,
28bd35765dSbluhm warn("open: /dev/random"));
29bd35765dSbluhm ASS(fcntl(fd, F_SETFL, O_NONBLOCK) == 0,
30bd35765dSbluhm warn("fcntl"));
318c56f353Smickey
32bd35765dSbluhm ASS((kq = kqueue()) >= 0,
33bd35765dSbluhm warn("kqueue"));
348c56f353Smickey
35bfe79908Suebayasi memset(&ev, 0, sizeof(ev));
368c56f353Smickey ev.ident = fd;
378c56f353Smickey ev.filter = EVFILT_READ;
388c56f353Smickey ev.flags = EV_ADD | EV_ENABLE;
398c56f353Smickey n = kevent(kq, &ev, 1, NULL, 0, NULL);
40bd35765dSbluhm ASSX(n != -1);
418c56f353Smickey
428c56f353Smickey ts.tv_sec = 0;
438c56f353Smickey ts.tv_nsec = 0;
44bd35765dSbluhm n = kevent(kq, NULL, 0, &ev, 1, &ts);
45bd35765dSbluhm ASSX(n >= 0);
468c56f353Smickey
4749a6e16fSderaadt n = MINIMUM((ev.data + 7) / 8, sizeof(buf));
48bd35765dSbluhm ASSX(read(fd, buf, n) > 0);
498c56f353Smickey
508c56f353Smickey close(kq);
518c56f353Smickey close(fd);
528c56f353Smickey
538c56f353Smickey return (0);
548c56f353Smickey }
55