gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r8654 - gnunet/src/util


From: gnunet
Subject: [GNUnet-SVN] r8654 - gnunet/src/util
Date: Thu, 9 Jul 2009 14:41:23 -0600

Author: grothoff
Date: 2009-07-09 14:41:23 -0600 (Thu, 09 Jul 2009)
New Revision: 8654

Modified:
   gnunet/src/util/crypto_ksk.c
Log:
fixing find forking

Modified: gnunet/src/util/crypto_ksk.c
===================================================================
--- gnunet/src/util/crypto_ksk.c        2009-07-09 19:28:05 UTC (rev 8653)
+++ gnunet/src/util/crypto_ksk.c        2009-07-09 20:41:23 UTC (rev 8654)
@@ -763,8 +763,13 @@
 }
 
 
-#ifdef gcry_register_random_progress
 /**
+ * Process ID of the "find" process that we use for
+ * entropy gathering.
+ */
+static pid_t genproc;
+
+/**
  * Function called by libgcrypt whenever we are
  * blocked gathering entropy.
  */
@@ -775,30 +780,60 @@
                   int current,
                   int total)
 {
-  static pid_t genproc;
+  unsigned long code;
+  enum GNUNET_OS_ProcessStatusType type;
+  int ret;
+
   if (0 != strcmp (what, "need_entropy"))
     return;
   if (current == total)
     {
       if (genproc != 0)
        {
-         PLIBC_KILL(genproc, SIGKILL);
+         PLIBC_KILL(genproc, SIGTERM);
          GNUNET_break (GNUNET_OK == GNUNET_OS_process_wait (genproc));
          genproc = 0;
        }
       return;
     }
-  genproc = GNUNET_OS_start_process ("find",
-                                    "find",
-                                    "-type",
-                                    "s",
-                                    "-fprint",
-                                    "/dev/null",
+  if (genproc != 0)
+    {
+      ret = GNUNET_OS_process_status (genproc,
+                                     &type,
+                                     &code);
+      if (ret == GNUNET_NO)
+       return; /* still running */
+      if (ret == GNUNET_SYSERR)
+       {
+         GNUNET_break (0);
+         return;
+       }
+      PLIBC_KILL(genproc, SIGTERM);
+      GNUNET_break (GNUNET_OK == GNUNET_OS_process_wait (genproc));
+      genproc = 0;     
+    }
+  GNUNET_log(GNUNET_ERROR_TYPE_INFO,
+            _("Starting `%s' process to generate entropy\n"),
+            "find");
+  genproc = GNUNET_OS_start_process ("sh",
+                                    "sh",
+                                    "-c",
+                                    "exec find / -type f -exec cp {} /dev/null 
\\; 2>/dev/null",
                                     NULL);                                
 }
-#endif
 
 
+static void 
+killfind ()
+{
+  if (genproc != 0)
+    {
+      PLIBC_KILL(genproc, SIGKILL);
+      genproc = 0;
+    }
+}
+
+
 void __attribute__ ((constructor)) GNUNET_CRYPTO_ksk_init ()
 {
   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
@@ -813,11 +848,11 @@
 #ifdef gcry_fast_random_poll
   gcry_fast_random_poll ();
 #endif
-#ifdef gcry_register_random_progress
-  gcry_register_random_progress (&entropy_generator, NULL);
-#endif
+  gcry_set_progress_handler (&entropy_generator, NULL);
+  atexit (&killfind);
 }
 
+
 void __attribute__ ((destructor)) GNUNET_CRYPTO_ksk_fini ()
 {
   int i;
@@ -828,9 +863,7 @@
       GNUNET_free (cache[i]);
     }
   GNUNET_array_grow (cache, cacheSize, 0);
-#ifdef gcry_register_random_progress
-  gcry_register_random_progress (NULL, NULL);
-#endif
+  gcry_set_progress_handler (NULL, NULL);
 }
 
 /* end of kblockkey.c */





reply via email to

[Prev in Thread] Current Thread [Next in Thread]