* random.c (_gcry_register_random_progress): New.
authorWerner Koch <wk@gnupg.org>
Fri, 24 Jan 2003 10:58:04 +0000 (10:58 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 24 Jan 2003 10:58:04 +0000 (10:58 +0000)
(_gcry_random_progress): New.

* rndlinux.c (gather_random): Call the random progress function.

cipher/ChangeLog
cipher/rand-internal.h
cipher/random.c
cipher/random.h
cipher/rndlinux.c

index c6f1fff..6f7dfa7 100644 (file)
@@ -1,3 +1,10 @@
+2003-01-24  Werner Koch  <wk@gnupg.org>
+
+       * random.c (_gcry_register_random_progress): New.
+       (_gcry_random_progress): New.
+
+       * rndlinux.c (gather_random): Call the random progress function. 
+
 2003-01-23  Werner Koch  <wk@gnupg.org>
 
        * rsa.c (generate): New arg USE_E to request a specific public
index 0590590..43c6087 100644 (file)
@@ -27,4 +27,8 @@ void rndos2_constructor(void);
 void rndatari_constructor(void);
 void rndmvs_constructor(void);
 
+void _gcry_random_progress (const char *what, int printchar,
+                            int current, int total);
+
+
 #endif /*G10_RAND_INTERNAL_H*/
index 923b338..f7b2378 100644 (file)
@@ -130,6 +130,9 @@ static struct {
     ulong naddbytes;
 } rndstats;
 
+static void (*progress_cb) (void *,const char*,int,int, int );
+static void *progress_cb_data;
+
 
 /* Note, we assume that this function is used before any concurrent
    access happens */
@@ -153,6 +156,27 @@ initialize(void)
   _gcry_cipher_modules_constructor ();
 }
 
+
+/* Used to register a progress callback. */
+void
+_gcry_register_random_progress (void (*cb)(void *,const char*,int,int,int),
+                                void *cb_data )
+{
+  progress_cb = cb;
+  progress_cb_data = cb_data;
+}
+
+
+/* This progress function is currently used by the random modules to give hint
+   on how much more entropy is required. */
+void
+_gcry_random_progress (const char *what, int printchar, int current, int total)
+{
+  if (progress_cb)
+    progress_cb (progress_cb_data, what, printchar, current, total);
+}
+
+
 /* Initialize this random subsystem.  This function memrely calls the
    initialzies and does not do anything more.  Doing this is not
    really required but when running in a threaded environment we might
index 41b5f21..0c7d9e0 100644 (file)
@@ -26,6 +26,8 @@
 #define fast_random_poll() _gcry_fast_random_poll ()
 
 void _gcry_random_initialize (void);
+void _gcry_register_random_progress (void (*cb)(void *,const char*,int,int,int),
+                                     void *cb_data );
 void _gcry_random_dump_stats(void);
 void _gcry_secure_random_alloc(void);
 int  _gcry_quick_random_gen( int onoff );
index 143c58a..aa984a8 100644 (file)
@@ -1,5 +1,5 @@
 /* rndlinux.c  -  raw random number for OSes with /dev/random
- *     Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 2001, 2002, 2003  Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
@@ -43,6 +43,7 @@
 #include "types.h"
 #include "g10lib.h"
 #include "dynload.h"
+#include "rand-internal.h"
 
 static int open_device( const char *name, int minor );
 static int gather_random( void (*add)(const void*, size_t, int), int requester,
@@ -122,9 +123,14 @@ gather_random( void (*add)(const void*, size_t, int), int requester,
        if( !(rc=select(fd+1, &rfds, NULL, NULL, &tv)) ) {
           if( !warn )
             {
+#ifndef IS_MODULE
+              _gcry_random_progress ("need_entropy", 'X', 0, (int)length);
+#else
               log_info (_("not enough random bytes available (need %d bytes)\n"),
                         (int)length);
+
               log_info (_("please do some other work to give the OS a chance to collect more entropy\n"));
+#endif
             }
               warn = 1;
            continue;