xref: /openbsd-src/regress/sys/kern/kqueue/kqueue-random.c (revision 701a94f5bf9bda140e51a2c05016863f16742076)
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