* global.c (gcry_control): Add commands
authorWerner Koch <wk@gnupg.org>
Tue, 7 May 2002 15:41:32 +0000 (15:41 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 7 May 2002 15:41:32 +0000 (15:41 +0000)
GCRYCTL_ANY_INITIALIZATION_P and GCRYCTL_INITIALIZATION_FINISHED_P
so that other libraries are able to check for required
initializations.

NEWS
src/ChangeLog
src/gcrypt.h
src/global.c

diff --git a/NEWS b/NEWS
index 7837689..41814e5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,8 @@ Noteworthy changes in version (current cvs)
 GCRYCTL_DISABLE_INTERNAL_LOCKING  NEW
 GCRYCTL_DISABLE_SECMEM            NEW
 GCRYCTL_INITIALIZATION_FINISHED   NEW
+GCRYCTL_INITIALIZATION_FINISHED_P NEW
+GCRYCTL_ANY_INITIALIZATION_P      NEW
 gcry_strdup                       NEW
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
index 38fb9a7..e32e76d 100644 (file)
@@ -1,3 +1,10 @@
+2002-05-07  Werner Koch  <wk@gnupg.org>
+
+       * global.c (gcry_control): Add commands
+       GCRYCTL_ANY_INITIALIZATION_P and GCRYCTL_INITIALIZATION_FINISHED_P
+       so that other libraries are able to check for required
+       initializations.
+
 2002-05-02  Werner Koch  <wk@gnupg.org>
 
        * gcrypt.h (GCRYCTL_DISABLE_INTERNAL_LOCKING): New.
index 299fa6a..8c153aa 100644 (file)
@@ -135,7 +135,9 @@ enum gcry_ctl_cmds {
     GCRYCTL_IS_ALGO_ENABLED     = 35,
     GCRYCTL_DISABLE_INTERNAL_LOCKING = 36,
     GCRYCTL_DISABLE_SECMEM      = 37,
-    GCRYCTL_INITIALIZATION_FINISHED = 38
+    GCRYCTL_INITIALIZATION_FINISHED = 38,
+    GCRYCTL_INITIALIZATION_FINISHED_P = 39,
+    GCRYCTL_ANY_INITIALIZATION_P = 40
 };
 
 int gcry_control( enum gcry_ctl_cmds, ... );
index b4c78b6..a6edb09 100644 (file)
@@ -48,6 +48,7 @@ static int (*outofcore_handler)( void*, size_t, unsigned int ) = NULL;
 static void *outofcore_handler_value = NULL;
 static int no_internal_locking = 0;
 static int no_secure_memory = 0;
+static int any_init_done = 0;
 
 static const char*
 parse_version_number( const char *s, int *number )
@@ -123,6 +124,7 @@ gcry_check_version( const char *req_version )
 int
 gcry_control( enum gcry_ctl_cmds cmd, ... )
 {
+    static int init_finished = 0;
     va_list arg_ptr ;
 
     va_start( arg_ptr, cmd ) ;
@@ -151,18 +153,22 @@ gcry_control( enum gcry_ctl_cmds cmd, ... )
        break;
 
       case GCRYCTL_DROP_PRIVS:
+        any_init_done = 1;
        _gcry_secmem_init( 0 );
        break;
 
       case GCRYCTL_DISABLE_SECMEM:
+        any_init_done = 1;
         no_secure_memory = 1;
         break;    
 
       case GCRYCTL_INIT_SECMEM:
+        any_init_done = 1;
        _gcry_secmem_init( va_arg( arg_ptr, unsigned int ) );
        break;
 
       case GCRYCTL_TERM_SECMEM:
+        any_init_done = 1;
        _gcry_secmem_term();
        break;
 
@@ -179,6 +185,7 @@ gcry_control( enum gcry_ctl_cmds cmd, ... )
        break;
 
       case GCRYCTL_USE_SECURE_RNDPOOL:
+        any_init_done = 1;
        _gcry_secure_random_alloc(); /* put random number into secure memory */
        break;
 
@@ -195,16 +202,29 @@ gcry_control( enum gcry_ctl_cmds cmd, ... )
        break;
 
       case GCRYCTL_DISABLE_INTERNAL_LOCKING:
+        any_init_done = 1;
         no_internal_locking = 1;
         break;
 
+      case GCRYCTL_ANY_INITIALIZATION_P:
+        va_end(arg_ptr);
+        return any_init_done? -1 : 0;
+
+      case GCRYCTL_INITIALIZATION_FINISHED_P:
+        va_end(arg_ptr);
+        return init_finished? -1 : 0;
+
       case GCRYCTL_INITIALIZATION_FINISHED:
         /* This is a hook which should be used by an application after
            all intialization has been done and right before any
            threads are started.  It is not really needed but the only
            way to be really sure that all initialization for
            thread-safety has been done. */
-        /* fixme: we should initialize the various mutexs here */
+        if (!init_finished) {
+            any_init_done = 1;
+            /* fixme: we should initialize the various mutexs here */
+            init_finished = 1;
+        }
         break;
 
       default:
@@ -289,6 +309,8 @@ gcry_set_allocation_handler( void *(*new_alloc_func)(size_t n),
                             void *(*new_realloc_func)(void *p, size_t n),
                             void (*new_free_func)(void*) )
 {
+    any_init_done = 1;
+
     alloc_func       = new_alloc_func;
     alloc_secure_func = new_alloc_secure_func;
     is_secure_func    = new_is_secure_func;
@@ -316,6 +338,8 @@ void
 gcry_set_outofcore_handler( int (*f)( void*, size_t, unsigned int ),
                                                        void *value )
 {
+    any_init_done = 1;
+
     outofcore_handler = f;
     outofcore_handler_value = value;
 }