Index: trunk/src/sh_entropy.c
===================================================================
--- trunk/src/sh_entropy.c	(revision 137)
+++ trunk/src/sh_entropy.c	(revision 138)
@@ -333,5 +333,5 @@
 
 #ifdef NAME_OF_DEV_URANDOM
-  m_count = read_mbytes (30, NAME_OF_DEV_RANDOM, nbuf, nbytes);
+  m_count = read_mbytes (  1, NAME_OF_DEV_RANDOM, nbuf, nbytes);
 #else
   m_count = read_mbytes (300, NAME_OF_DEV_RANDOM, nbuf, nbytes);
Index: trunk/src/sh_err_log.c
===================================================================
--- trunk/src/sh_err_log.c	(revision 137)
+++ trunk/src/sh_err_log.c	(revision 138)
@@ -947,5 +947,6 @@
       log_msg.timestamp[0] = '\0';
       (void) sl_strlcpy (sigkey_new, 
-			 sh_tiger_hash (sigkey_old, TIGER_DATA, KEY_LEN, hashbuf, sizeof(hashbuf)),
+			 sh_tiger_hash (sigkey_old, TIGER_DATA, KEY_LEN, 
+					hashbuf, sizeof(hashbuf)),
 			 KEY_LEN+1);
     }
@@ -953,12 +954,13 @@
   /* --- Sign the message with the signature key. ---
    */
-  sh_tiger_hash (log_msg.msg, -1, 10, hashbuf, 10);
   sh_tiger_hash (log_msg.msg, TIGER_DATA,
-		 (unsigned long)(status + KEY_LEN), (char *) hashbuf, (size_t) sizeof(hashbuf));
+		 (unsigned long)(status + KEY_LEN), 
+		 (char *) hashbuf, (size_t) sizeof(hashbuf));
 
   (void) sl_strlcat (log_msg.msg, sigkey_new, (size_t)(status + KEY_LEN + 2));
   (void) sl_strlcpy (log_msg.signature,
 		     sh_tiger_hash (log_msg.msg, (TigerType) TIGER_DATA,
-				    (unsigned long)(status + KEY_LEN), hashbuf, sizeof(hashbuf)),
+				    (unsigned long)(status + KEY_LEN), 
+				    hashbuf, sizeof(hashbuf)),
 		     KEY_LEN+1);
   (void) sl_strlcpy (sigkey_old, sigkey_new, KEY_LEN+1); 
Index: trunk/src/sh_mem.c
===================================================================
--- trunk/src/sh_mem.c	(revision 137)
+++ trunk/src/sh_mem.c	(revision 138)
@@ -20,11 +20,4 @@
 #include "config_xor.h"
 
-/* With glibc, _XOPEN_SOURCE 500 is required for 
- * pthread_mutexattr_settype/PTHREAD_MUTEX_RECURSIVE
- */
-#if defined(HAVE_PTHREAD) && defined(MEM_DEBUG)
-#define _XOPEN_SOURCE 500
-#endif
-
 #include <stdio.h>
 #include <stdlib.h>
@@ -111,16 +104,7 @@
 
 #ifdef HAVE_PTHREAD
-static pthread_once_t mem_is_initialized = PTHREAD_ONCE_INIT;
-static pthread_mutex_t mutex_mem;
-
-static void initialize_mem(void)
-{
-  pthread_mutexattr_t   mta;
-  pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE);
-  pthread_mutex_init(&mutex_mem, &mta);
-  pthread_mutexattr_destroy(&mta);
-  return;
-}
-#define MEM_MUTEX_INIT  (void) pthread_once(&mem_is_initialized, initialize_mem)
+
+SH_MUTEX_RECURSIVE(mutex_mem);
+
 #else
 #define MEM_MUTEX_INIT ((void)0)
@@ -135,6 +119,6 @@
   FILE * fd;
 
-  MEM_MUTEX_INIT;
-  SH_MUTEX_LOCK(mutex_mem);
+  SH_MUTEX_RECURSIVE_INIT(mutex_mem);
+  SH_MUTEX_RECURSIVE_LOCK(mutex_mem);
 
   fd = fopen(MEM_LOG, "w");
@@ -146,5 +130,5 @@
     }
   fclose(fd);
-  SH_MUTEX_UNLOCK(mutex_mem);
+  SH_MUTEX_RECURSIVE_UNLOCK(mutex_mem);
   return;
 }
@@ -163,6 +147,6 @@
   SL_ENTER(_("sh_mem_stat"));
 
-  MEM_MUTEX_INIT;
-  SH_MUTEX_LOCK(mutex_mem);
+  SH_MUTEX_RECURSIVE_INIT(mutex_mem);
+  SH_MUTEX_RECURSIVE_LOCK(mutex_mem);
 
   if (Alloc_Count == Free_Count) 
@@ -201,5 +185,5 @@
     }
  out:
-  SH_MUTEX_UNLOCK(mutex_mem);
+  SH_MUTEX_RECURSIVE_UNLOCK(mutex_mem);
   SL_RET0(_("sh_mem_stat"));
 }
@@ -212,6 +196,6 @@
   SL_ENTER(_("sh_mem_check"));
 
-  MEM_MUTEX_INIT;
-  SH_MUTEX_LOCK(mutex_mem);
+  SH_MUTEX_RECURSIVE_INIT(mutex_mem);
+  SH_MUTEX_RECURSIVE_LOCK(mutex_mem);
   sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_MSTAMP,
 		   Mem_Max, Mem_Current);
@@ -246,5 +230,5 @@
   /* if (nerr > 0) abort(); */
 
-  SH_MUTEX_UNLOCK(mutex_mem);
+  SH_MUTEX_RECURSIVE_UNLOCK(mutex_mem);
   SL_RET0(_("sh_mem_check"));
 }
@@ -258,6 +242,6 @@
   SL_ENTER(_("sh_mem_malloc"));
 
-  MEM_MUTEX_INIT;
-  SH_MUTEX_LOCK(mutex_mem);
+  SH_MUTEX_RECURSIVE_INIT(mutex_mem);
+  SH_MUTEX_RECURSIVE_LOCK(mutex_mem);
   the_realAddress = malloc(size + 2 * SH_MEMMULT);
   
@@ -368,17 +352,19 @@
       _exit(42);
     }
-
-  /* make list entry */
-
-  this->real_address = the_realAddress;
-  this->address      = theAddress;
-  this->size         = size;
-  this->line         = line;
-  sl_strlcpy(this->file, file, 20);
-
-  this->next = memlist;
-  memlist = this;
-
-  SH_MUTEX_UNLOCK(mutex_mem);
+  else
+    {
+      /* make list entry */
+
+      this->real_address = the_realAddress;
+      this->address      = theAddress;
+      this->size         = size;
+      this->line         = line;
+      sl_strlcpy(this->file, file, 20);
+
+      this->next = memlist;
+      memlist = this;
+    }
+
+  SH_MUTEX_RECURSIVE_UNLOCK(mutex_mem);
   SL_RETURN( theAddress, _("sh_mem_malloc"));
 }
@@ -393,6 +379,6 @@
   SL_ENTER(_("sh_mem_free"));
 
-  MEM_MUTEX_INIT;
-  SH_MUTEX_LOCK(mutex_mem);
+  SH_MUTEX_RECURSIVE_INIT(mutex_mem);
+  SH_MUTEX_RECURSIVE_LOCK(mutex_mem);
   if ( a == NULL ) 
     {
@@ -466,5 +452,5 @@
   Mem_Current -= size;
  out:
-  SH_MUTEX_UNLOCK(mutex_mem);
+  SH_MUTEX_RECURSIVE_UNLOCK(mutex_mem);
   SL_RET0(_("sh_mem_free"));
 }
Index: trunk/src/sh_pthread.c
===================================================================
--- trunk/src/sh_pthread.c	(revision 137)
+++ trunk/src/sh_pthread.c	(revision 138)
@@ -14,3 +14,61 @@
   return;
 }
+
+
+/**
+ * libxml2 threads.c: set of generic threading related routines 
+ *
+ * Gary Pennington <Gary.Pennington@uk.sun.com>
+ * daniel@veillard.com
+ */
+
+void sh_InitRMutex(struct sh_RMutex * tok)
+{
+  pthread_mutex_init(&tok->lock, NULL);
+  tok->held = 0;
+  tok->waiters = 0;
+  pthread_cond_init(&tok->cv, NULL);
+
+  return;
+}
+
+void sh_RMutexLock(struct sh_RMutex * tok)
+{
+  if (tok == NULL)
+    return;
+
+  pthread_mutex_lock(&tok->lock);
+  if (tok->held) {
+    if (pthread_equal(tok->tid, pthread_self())) {
+      tok->held++;
+      pthread_mutex_unlock(&tok->lock);
+      return;
+    } else {
+      tok->waiters++;
+      while (tok->held)
+	pthread_cond_wait(&tok->cv, &tok->lock);
+      tok->waiters--;
+    }
+  }
+  tok->tid = pthread_self();
+  tok->held = 1;
+  pthread_mutex_unlock(&tok->lock);
+}
+
+void sh_RMutexUnlock(void * arg)
+{
+  struct sh_RMutex * tok = (struct sh_RMutex *) arg;
+
+  if (tok == NULL)
+    return;
+    
+  pthread_mutex_lock(&tok->lock);
+  tok->held--;
+  if (tok->held == 0) {
+    if (tok->waiters)
+      pthread_cond_signal(&tok->cv);
+    tok->tid = 0;
+  }
+  pthread_mutex_unlock(&tok->lock);
+}
 #endif
Index: trunk/src/sh_srp.c
===================================================================
--- trunk/src/sh_srp.c	(revision 137)
+++ trunk/src/sh_srp.c	(revision 138)
@@ -337,4 +337,5 @@
   int    res;
   char   hash[KEY_LEN+1];
+  char hashbuf[KEYBUF_SIZE];
 
   SL_ENTER(_("sh_srp_make_a"));
@@ -345,5 +346,6 @@
   (void) sl_strlcpy (hash, 
 		     sh_tiger_hash((char *)&randl[0], TIGER_DATA, 
-				   (unsigned long) 6*sizeof(UINT32)), 
+				   (unsigned long) 6*sizeof(UINT32),
+				   hashbuf, sizeof(hashbuf)), 
 		     KEY_LEN+1);
 
Index: trunk/src/sh_suidchk.c
===================================================================
--- trunk/src/sh_suidchk.c	(revision 137)
+++ trunk/src/sh_suidchk.c	(revision 138)
@@ -1010,5 +1010,5 @@
 	    
 	    status = sh_unix_getinfo (ShDFLevel[SH_ERR_T_RO], 
-				      thisEntry->d_name,
+				      dirlist->sh_d_name,
 				      &theFile, fileHash, 0);
 	    
Index: trunk/src/sh_unix.c
===================================================================
--- trunk/src/sh_unix.c	(revision 137)
+++ trunk/src/sh_unix.c	(revision 138)
@@ -3611,5 +3611,5 @@
 	  SL_RETURN((-1),_("sh_unix_getinfo"));
 	}
-    
+
     if (linknamebuf[0] == '/') 
       {
