tOpenBSD lets you open /dev/random but not read it! - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3a6c348fba8ca00ff22315a0e270eca5bc55e84d
 (DIR) parent 8e06ea1b42726a61e3fcff3ccb6cefe29cbfc387
 (HTM) Author: rsc <devnull@localhost>
       Date:   Mon, 19 Sep 2005 16:40:56 +0000
       
       OpenBSD lets you open /dev/random but not read it!
       
       Diffstat:
         M src/lib9/truerand.c                 |      10 ++++++----
       
       1 file changed, 6 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git a/src/lib9/truerand.c b/src/lib9/truerand.c
       t@@ -7,17 +7,19 @@ truerand(void)
                int i, n;
                uchar buf[sizeof(ulong)];
                static int randfd = -1;
       +        static char *randfile;
        
                if(randfd < 0){
       -                randfd = open("/dev/random", OREAD);
       -                if(randfd < 0)
       -                        randfd = open("/dev/srandom", OREAD);        /* OpenBSD */
       +                randfd = open(randfile="/dev/random", OREAD);
       +                /* OpenBSD lets you open /dev/random but not read it! */
       +                if(randfd < 0 || read(randfd, buf, 1) != 1)
       +                        randfd = open(randfile="/dev/srandom", OREAD);        /* OpenBSD */
                        if(randfd < 0)
                                sysfatal("can't open /dev/random: %r");
                        fcntl(randfd, F_SETFD, FD_CLOEXEC);
                }
                for(i=0; i<sizeof(buf); i += n)
                        if((n = readn(randfd, buf+i, sizeof(buf)-i)) < 0)
       -                        sysfatal("can't read /dev/random: %r");
       +                        sysfatal("can't read %s: %r", randfile);
                return *((ulong*)buf);
        }