linux/drivers
Jeff Dike 9a6f70bbed random: add async notification support to /dev/random
Add async notification support to /dev/random.

A little test case is below.  Without this patch, you get:

$ ./async-random
Drained the pool
Found more randomness

With it, you get:

$ ./async-random
Drained the pool
SIGIO
Found more randomness

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <fcntl.h>

static void handler(int sig)
{
        printf("SIGIO\n");
}

int main(int argc, char **argv)
{
        int fd, n, err, flags;

        if(signal(SIGIO, handler) < 0){
                perror("setting SIGIO handler");
                exit(1);
        }

        fd = open("/dev/random", O_RDONLY);
        if(fd < 0){
                perror("open");
                exit(1);
        }

        flags = fcntl(fd, F_GETFL);
        if (flags < 0){
                perror("getting flags");
                exit(1);
        }

        flags |= O_NONBLOCK;
        if (fcntl(fd, F_SETFL, flags) < 0){
                perror("setting flags");
                exit(1);
        }

        while((err = read(fd, &n, sizeof(n))) > 0) ;

        if(err == 0){
                printf("random returned 0\n");
                exit(1);
        }
        else if(errno != EAGAIN){
                perror("read");
                exit(1);
        }

        flags |= O_ASYNC;
        if (fcntl(fd, F_SETFL, flags) < 0){
                perror("setting flags");
                exit(1);
        }

        if (fcntl(fd, F_SETOWN, getpid()) < 0) {
                perror("Setting SIGIO");
                exit(1);
        }

        printf("Drained the pool\n");
        read(fd, &n, sizeof(n));
        printf("Found more randomness\n");

        return(0);
}

Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Signed-off-by: Matt Mackall <mpm@selenic.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-04-29 08:06:25 -07:00
..
acorn/char
acpi acpi: use non-racy method for proc entries creation 2008-04-29 08:06:22 -07:00
amba
ata typo in sata_fsl 2008-04-28 10:03:31 -07:00
atm drivers: atm, char fix integer as NULL pointer warnings 2008-04-28 17:29:18 -07:00
auxdisplay
base firmware loader: printk when requesting firmware 2008-04-29 08:06:05 -07:00
block remove aoedev_isbusy() 2008-04-29 08:06:24 -07:00
bluetooth
cdrom drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
char random: add async notification support to /dev/random 2008-04-29 08:06:25 -07:00
clocksource
connector
cpufreq [CPUFREQ] fix show_trans_table 2008-04-28 15:05:44 -04:00
cpuidle
crypto
dca
dio
dma DMA engine: typo fixes 2008-04-21 22:38:45 +00:00
edac
eisa
firewire
firmware edd: add default mode CONFIG_EDD_OFF=n, override with edd={on,off} 2008-04-29 08:06:23 -07:00
gpio gpiochip_reserve() 2008-04-28 08:58:34 -07:00
hid usbhid endianness annotations and fixes 2008-04-28 10:03:31 -07:00
hwmon
i2c i2c: Fix platform driver hotplug/coldplug 2008-04-22 22:16:49 +02:00
ide drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
ieee1394 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 2008-04-25 12:24:06 -07:00
infiniband IB: expand ib_umem_get() prototype 2008-04-29 08:06:12 -07:00
input drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
isdn isdn: use non-racy method for proc entries creation 2008-04-29 08:06:22 -07:00
leds leds: Add default-on trigger 2008-04-25 00:06:52 +01:00
lguest
macintosh mac-hid: fix build after lockdep annotation 2008-04-25 18:57:09 -07:00
mca proc: remove proc_root from drivers 2008-04-29 08:06:18 -07:00
md drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
media drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
memstick memstick: convert struct class_device to struct device 2008-04-19 19:10:29 -07:00
message drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
mfd mfd: use shorter set_current_state() 2008-04-28 08:58:32 -07:00
misc drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
mmc
mtd drivers: fix integer as NULL pointer warnings 2008-04-28 17:31:13 -07:00
net netdev: use non-racy method for proc entries creation 2008-04-29 08:06:22 -07:00
nubus proc: convert /proc/bus/nubus to seq_file interface 2008-04-29 08:06:19 -07:00
of [POWERPC] drivers/of/of_i2c.c: Add MODULE_LICENSE 2008-04-24 20:58:01 +10:00
oprofile oprofile: change cpu_buffer from array to per_cpu variable 2008-04-28 08:58:31 -07:00
parisc parisc: use non-racy method for proc entries creation 2008-04-29 08:06:22 -07:00
parport
pci drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
pcmcia ARM: always select HAVE_IDE 2008-04-28 23:44:43 +02:00
pnp drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
power x86: olpc: add One Laptop Per Child architecture support 2008-04-29 08:06:07 -07:00
ps3
rapidio
rtc drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
s390 s390: use non-racy method for proc entries creation 2008-04-29 08:06:21 -07:00
sbus
scsi scsi: use non-racy method for proc entries creation 2008-04-29 08:06:21 -07:00
serial Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus 2008-04-28 10:51:43 -07:00
sh
sn
spi spi: spi_imx updates 2008-04-28 08:58:31 -07:00
ssb ssb: Fix all-ones boardflags 2008-04-23 21:25:35 -04:00
tc
telephony
thermal
uio
usb usb: use non-racy method for proc entries creation 2008-04-29 08:06:21 -07:00
video proc: remove proc_root from drivers 2008-04-29 08:06:18 -07:00
virtio
w1
watchdog
xen xen: add balloon driver 2008-04-24 23:57:33 +02:00
zorro zorro: use non-racy method for proc entries creation 2008-04-29 08:06:21 -07:00
Kconfig xen: add balloon driver 2008-04-24 23:57:33 +02:00
Makefile