Did some performance experiments and added code for Barrett reduction.
[libgcrypt.git] / cipher / rndlinux.c
index d87cd8b..76cf918 100644 (file)
 #include "g10lib.h"
 #include "rand-internal.h"
 
-static int open_device( const char *name, int minor );
-int _gcry_rndlinux_gather_random (void (*add)(const void*, size_t, int),
-                                  int requester,
-                                  size_t length, int level );
+static int open_device ( const char *name );
+
+
+static int
+set_cloexec_flag (int fd)
+{
+  int oldflags;
+
+  oldflags= fcntl (fd, F_GETFD, 0);
+  if (oldflags < 0)
+    return oldflags;
+  oldflags |= FD_CLOEXEC;
+  return fcntl (fd, F_SETFD, oldflags);
+}
+
+
 
 /*
  * Used to open the /dev/random devices (Linux, xBSD, Solaris (if it exists)).
  */
 static int
-open_device( const char *name, int minor )
+open_device ( const char *name )
 {
   int fd;
 
-  fd = open( name, O_RDONLY );
-  if( fd == -1 )
+  fd = open ( name, O_RDONLY );
+  if ( fd == -1 )
     log_fatal ("can't open %s: %s\n", name, strerror(errno) );
 
-  /* We used to do the follwing check, however it turned out that this
+  if (set_cloexec_flag (fd))
+    log_error ("error setting FD_CLOEXEC on fd %d: %s\n",
+               fd, strerror (errno));
+
+  /* We used to do the following check, however it turned out that this
      is not portable since more OSes provide a random device which is
-     sometimes implemented as anoteher device type. 
+     sometimes implemented as another device type. 
      
      struct stat sb;
 
@@ -69,8 +85,9 @@ open_device( const char *name, int minor )
 
 
 int
-_gcry_rndlinux_gather_random (void (*add)(const void*, size_t, int),
-                              int requester,
+_gcry_rndlinux_gather_random (void (*add)(const void*, size_t,
+                                          enum random_origins),
+                              enum random_origins origin,
                               size_t length, int level )
 {
   static int fd_urandom = -1;
@@ -83,13 +100,13 @@ _gcry_rndlinux_gather_random (void (*add)(const void*, size_t, int),
   if( level >= 2 )
     {
       if( fd_random == -1 )
-        fd_random = open_device( NAME_OF_DEV_RANDOM, 8 );
+        fd_random = open_device ( NAME_OF_DEV_RANDOM );
       fd = fd_random;
     }
   else
     {
       if( fd_urandom == -1 )
-        fd_urandom = open_device( NAME_OF_DEV_URANDOM, 9 );
+        fd_urandom = open_device ( NAME_OF_DEV_URANDOM );
       fd = fd_urandom;
     }
 
@@ -131,7 +148,7 @@ _gcry_rndlinux_gather_random (void (*add)(const void*, size_t, int),
         while( n == -1 && errno == EINTR );
        if( n == -1 )
           log_fatal("read error on random device: %s\n", strerror(errno));
-       (*add)( buffer, n, requester );
+       (*add)( buffer, n, origin );
        length -= n;
     }
   memset(buffer, 0, sizeof(buffer) );