summaryrefslogtreecommitdiffstats
path: root/sound/sh
diff options
context:
space:
mode:
authorJeff Dike <jdike@addtoit.com>2008-04-29 01:03:08 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-29 08:06:25 -0700
commit9a6f70bbed4e8b72dd340812d7c606bfd5e00b47 (patch)
tree55158b087275b1848b5f0ad4e58eb2a2d47016c8 /sound/sh
parentadc782dae6c4c0f6fb679a48a544cfbcd79ae3dc (diff)
downloadlinux-9a6f70bbed4e8b72dd340812d7c606bfd5e00b47.tar.bz2
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>
Diffstat (limited to 'sound/sh')
0 files changed, 0 insertions, 0 deletions