Index: /trunk/Makefile.in
===================================================================
--- /trunk/Makefile.in	(revision 137)
+++ /trunk/Makefile.in	(revision 138)
@@ -117,5 +117,5 @@
 	rijndael-boxes-fst.h sh_socket.h sh_ignore.h sh_prelude.h \
 	sh_mounts.h sh_userfiles.h sh_static.h sh_prelink.h \
-	sh_processcheck.h sh_portcheck.h
+	sh_processcheck.h sh_portcheck.h sh_pthread.h
 
 
@@ -150,5 +150,6 @@
 	$(srcsrc)/sh_prelink.c $(srcsrc)/sh_static.c \
 	$(srcsrc)/sh_portcheck.c \
-	$(srcsrc)/sh_processcheck.c $(srcsrc)/sh_prelude_old.c 
+	$(srcsrc)/sh_processcheck.c $(srcsrc)/sh_prelude_old.c \
+	$(srcsrc)/sh_pthread.c
 
 OBJECTS = sh_files.o sh_tiger0.o sh_tiger2.o sh_tiger2_64.o \
@@ -163,5 +164,6 @@
 	zAVLTree.o sh_socket.o sh_ignore.o sh_prelude.o \
 	sh_mounts.o sh_userfiles.o sh_prelink.o sh_static.o \
-	sh_processcheck.o sh_portcheck.o sh_prelude_old.o  
+	sh_processcheck.o sh_portcheck.o sh_prelude_old.o \
+	sh_pthread.o
 
 KERN = kern_head.h kern_head.c
@@ -1633,12 +1635,12 @@
 
 
-samhain.o: $(srcsrc)/samhain.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_files.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_getopt.h $(srcinc)/sh_readconf.h $(srcinc)/sh_hash.h $(srcinc)/sh_mail.h $(srcinc)/sh_tiger.h $(srcinc)/sh_gpg.h $(srcinc)/sh_mem.h $(srcinc)/sh_forward.h $(srcinc)/sh_tools.h $(srcinc)/sh_hash.h $(srcinc)/sh_extern.h $(srcinc)/sh_modules.h $(srcinc)/sh_ignore.h $(srcinc)/sh_prelink.h sh_MK.h $(srcinc)/sh_schedule.h 
-sh_unix.o: $(srcsrc)/sh_unix.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_utils.h $(srcinc)/sh_mem.h $(srcinc)/sh_hash.h $(srcinc)/sh_tools.h $(srcinc)/sh_tiger.h $(srcinc)/sh_prelink.h $(srcinc)/sh_static.h $(srcinc)/sh_prelude.h $(srcinc)/sh_ignore.h 
-sh_utils.o: $(srcsrc)/sh_utils.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_entropy.h 
+samhain.o: $(srcsrc)/samhain.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_files.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_getopt.h $(srcinc)/sh_readconf.h $(srcinc)/sh_hash.h $(srcinc)/sh_mail.h $(srcinc)/sh_tiger.h $(srcinc)/sh_gpg.h $(srcinc)/sh_mem.h $(srcinc)/sh_forward.h $(srcinc)/sh_tools.h $(srcinc)/sh_hash.h $(srcinc)/sh_extern.h $(srcinc)/sh_modules.h $(srcinc)/sh_ignore.h $(srcinc)/sh_prelink.h sh_MK.h $(srcinc)/sh_schedule.h 
+sh_unix.o: $(srcsrc)/sh_unix.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_utils.h $(srcinc)/sh_mem.h $(srcinc)/sh_hash.h $(srcinc)/sh_tools.h $(srcinc)/sh_tiger.h $(srcinc)/sh_prelink.h $(srcinc)/sh_pthread.h $(srcinc)/sh_static.h $(srcinc)/sh_prelude.h $(srcinc)/sh_ignore.h 
+sh_utils.o: $(srcsrc)/sh_utils.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_entropy.h $(srcinc)/sh_pthread.h 
 sh_error.o: $(srcsrc)/sh_error.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_cat.h $(srcinc)/sh_database.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_mail.h $(srcinc)/sh_forward.h $(srcinc)/sh_prelude.h $(srcinc)/sh_tools.h $(srcinc)/sh_extern.h 
-sh_files.o: $(srcsrc)/sh_files.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_tiger.h $(srcinc)/sh_hash.h $(srcinc)/sh_ignore.h $(srcinc)/zAVLTree.h 
+sh_files.o: $(srcsrc)/sh_files.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_tiger.h $(srcinc)/sh_hash.h $(srcinc)/sh_ignore.h $(srcinc)/zAVLTree.h 
 sh_getopt.o: $(srcsrc)/sh_getopt.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_getopt.h $(srcinc)/sh_files.h $(srcinc)/sh_utils.h $(srcinc)/sh_mail.h $(srcinc)/sh_forward.h $(srcinc)/sh_hash.h $(srcinc)/sh_extern.h 
 sh_readconf.o: $(srcsrc)/sh_readconf.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_database.h $(srcinc)/sh_unix.h $(srcinc)/sh_utils.h $(srcinc)/sh_files.h $(srcinc)/sh_mail.h $(srcinc)/sh_calls.h $(srcinc)/sh_tiger.h $(srcinc)/sh_forward.h $(srcinc)/sh_modules.h $(srcinc)/sh_gpg.h $(srcinc)/sh_hash.h $(srcinc)/sh_ignore.h $(srcinc)/sh_prelink.h $(srcinc)/sh_extern.h $(srcinc)/sh_database.h $(srcinc)/sh_prelude.h 
-sh_tiger0.o: $(srcsrc)/sh_tiger0.c Makefile config_xor.h $(srcinc)/sh_tiger.h $(srcinc)/sh_unix.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h 
+sh_tiger0.o: $(srcsrc)/sh_tiger0.c Makefile config_xor.h $(srcinc)/sh_tiger.h $(srcinc)/sh_unix.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_pthread.h 
 sh_tiger1.o: $(srcsrc)/sh_tiger1.c Makefile config_xor.h 
 sh_tiger2.o: $(srcsrc)/sh_tiger2.c Makefile config_xor.h 
@@ -1646,15 +1648,15 @@
 sh_tiger2_64.o: $(srcsrc)/sh_tiger2_64.c Makefile config_xor.h 
 sh_hash.o: $(srcsrc)/sh_hash.c Makefile config_xor.h $(srcinc)/sh_hash.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_tiger.h $(srcinc)/sh_gpg.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_ignore.h $(srcinc)/sh_forward.h $(srcinc)/sh_hash.h 
-sh_mail.o: $(srcsrc)/sh_mail.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_mail.h $(srcinc)/sh_utils.h $(srcinc)/sh_fifo.h $(srcinc)/sh_tools.h $(srcinc)/sh_static.h $(srcinc)/sh_tools.h 
-sh_mem.o: $(srcsrc)/sh_mem.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_mem.h 
-sh_entropy.o: $(srcsrc)/sh_entropy.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_calls.h $(srcinc)/sh_static.h 
+sh_mail.o: $(srcsrc)/sh_mail.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_mail.h $(srcinc)/sh_utils.h $(srcinc)/sh_fifo.h $(srcinc)/sh_tools.h $(srcinc)/sh_pthread.h $(srcinc)/sh_static.h $(srcinc)/sh_tools.h 
+sh_mem.o: $(srcsrc)/sh_mem.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_mem.h $(srcinc)/sh_pthread.h 
+sh_entropy.o: $(srcsrc)/sh_entropy.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_calls.h $(srcinc)/sh_pthread.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h 
 sh_forward.o: $(srcsrc)/sh_forward.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_tiger.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_forward.h $(srcinc)/sh_srp.h $(srcinc)/sh_fifo.h $(srcinc)/sh_tools.h $(srcinc)/sh_entropy.h $(srcinc)/sh_html.h $(srcinc)/sh_mail.h $(srcinc)/sh_socket.h $(srcinc)/sh_static.h $(srcinc)/rijndael-api-fst.h $(srcinc)/sh_readconf.h $(srcinc)/zAVLTree.h $(srcinc)/sh_extern.h 
 sh_modules.o: $(srcsrc)/sh_modules.c Makefile config_xor.h $(srcinc)/sh_modules.h $(srcinc)/sh_utmp.h $(srcinc)/sh_mounts.h $(srcinc)/sh_userfiles.h $(srcinc)/sh_kern.h $(srcinc)/sh_suidchk.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_portcheck.h 
 sh_utmp.o: $(srcsrc)/sh_utmp.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_utmp.h 
-sh_kern.o: $(srcsrc)/sh_kern.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_kern.h sh_ks_xor.h $(srcinc)/sh_unix.h $(srcinc)/sh_hash.h 
-sh_suidchk.o: $(srcsrc)/sh_suidchk.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_suidchk.h $(srcinc)/sh_hash.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_schedule.h $(srcinc)/sh_calls.h 
+sh_kern.o: $(srcsrc)/sh_kern.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_kern.h sh_ks_xor.h $(srcinc)/sh_unix.h $(srcinc)/sh_hash.h 
+sh_suidchk.o: $(srcsrc)/sh_suidchk.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_suidchk.h $(srcinc)/sh_hash.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_schedule.h $(srcinc)/sh_calls.h 
 sh_srp.o: $(srcsrc)/sh_srp.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_tiger.h $(srcinc)/sh_mem.h $(srcinc)/sh_utils.h $(srcinc)/sh_srp.h $(srcinc)/bignum.h 
 sh_fifo.o: $(srcsrc)/sh_fifo.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_mem.h $(srcinc)/sh_unix.h 
-sh_tools.o: $(srcsrc)/sh_tools.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_mem.h $(srcinc)/sh_error.h $(srcinc)/sh_tools.h $(srcinc)/sh_utils.h $(srcinc)/sh_tiger.h $(srcinc)/sh_static.h $(srcinc)/rijndael-api-fst.h $(srcinc)/rijndael-api-fst.h 
+sh_tools.o: $(srcsrc)/sh_tools.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_mem.h $(srcinc)/sh_error.h $(srcinc)/sh_tools.h $(srcinc)/sh_utils.h $(srcinc)/sh_tiger.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h $(srcinc)/rijndael-api-fst.h $(srcinc)/rijndael-api-fst.h 
 sh_html.o: $(srcsrc)/sh_html.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_forward.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_utils.h $(srcinc)/sh_html.h $(srcinc)/zAVLTree.h 
 sh_gpg.o: $(srcsrc)/sh_gpg.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_tiger.h $(srcinc)/sh_static.h 
@@ -1673,5 +1675,5 @@
 encode.o: $(srcsrc)/encode.c Makefile 
 sstrip.o: $(srcsrc)/sstrip.c Makefile config.h 
-trustfile.o: $(srcsrc)/trustfile.c Makefile config_xor.h $(srcinc)/sh_calls.h $(srcinc)/slib.h $(srcinc)/sh_static.h 
+trustfile.o: $(srcsrc)/trustfile.c Makefile config_xor.h $(srcinc)/sh_calls.h $(srcinc)/slib.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h 
 exepack.o: $(srcsrc)/exepack.c Makefile config.h $(srcinc)/minilzo.h $(srcinc)/exepack.data 
 exepack_fill.o: $(srcsrc)/exepack_fill.c Makefile config.h config.h $(srcinc)/minilzo.h 
@@ -1686,11 +1688,12 @@
 yulectl.o: $(srcsrc)/yulectl.c Makefile config_xor.h 
 sh_mounts.o: $(srcsrc)/sh_mounts.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_mounts.h 
-sh_userfiles.o: $(srcsrc)/sh_userfiles.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_userfiles.h $(srcinc)/sh_utils.h $(srcinc)/sh_schedule.h $(srcinc)/sh_error.h $(srcinc)/sh_hash.h $(srcinc)/sh_files.h $(srcinc)/sh_static.h 
-sh_prelude.o: $(srcsrc)/sh_prelude.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_cat.h $(srcinc)/sh_error_min.h $(srcinc)/sh_prelude.h 
+sh_userfiles.o: $(srcsrc)/sh_userfiles.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_userfiles.h $(srcinc)/sh_utils.h $(srcinc)/sh_schedule.h $(srcinc)/sh_error.h $(srcinc)/sh_hash.h $(srcinc)/sh_files.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h 
+sh_prelude.o: $(srcsrc)/sh_prelude.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_cat.h $(srcinc)/sh_error_min.h $(srcinc)/sh_prelude.h $(srcinc)/sh_static.h 
 kern_head.o: $(srcsrc)/kern_head.c Makefile config.h $(srcinc)/kern_head.h $(srcinc)/kern_head.h 
 sh_prelink.o: $(srcsrc)/sh_prelink.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_tiger.h $(srcinc)/sh_extern.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h 
-sh_static.o: $(srcsrc)/sh_static.c Makefile config_xor.h 
-sh_prelude_old.o: $(srcsrc)/sh_prelude_old.c Makefile config_xor.h $(srcinc)/slib.h $(srcinc)/sh_mem.h $(srcinc)/sh_cat.h $(srcinc)/sh_error_min.h $(srcinc)/sh_prelude.h $(srcinc)/sh_static.h 
+sh_static.o: $(srcsrc)/sh_static.c Makefile config_xor.h $(srcinc)/sh_pthread.h 
+sh_prelude_old.o: $(srcsrc)/sh_prelude_old.c Makefile config_xor.h $(srcinc)/slib.h $(srcinc)/sh_mem.h $(srcinc)/sh_cat.h $(srcinc)/sh_error_min.h $(srcinc)/sh_prelude.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h 
 sh_async.o: $(srcsrc)/sh_async.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_calls.h $(srcinc)/sh_error.h 
 sh_processcheck.o: $(srcsrc)/sh_processcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_extern.h $(srcinc)/sh_calls.h $(srcinc)/CuTest.h 
-sh_portcheck.o: $(srcsrc)/sh_portcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_mem.h $(srcinc)/sh_calls.h $(srcinc)/sh_utils.h $(srcinc)/sh_modules.h $(srcinc)/CuTest.h 
+sh_portcheck.o: $(srcsrc)/sh_portcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_mem.h $(srcinc)/sh_calls.h $(srcinc)/sh_utils.h $(srcinc)/sh_modules.h $(srcinc)/sh_pthread.h $(srcinc)/CuTest.h 
+sh_pthread.o: $(srcsrc)/sh_pthread.c Makefile config_xor.h $(srcinc)/sh_pthread.h 
Index: /trunk/aclocal.m4
===================================================================
--- /trunk/aclocal.m4	(revision 137)
+++ /trunk/aclocal.m4	(revision 138)
@@ -1701,4 +1701,10 @@
                 ;;
 
+                -pthread)
+                AC_MSG_CHECKING([whether pthreads work with $flag])
+                PTHREAD_CFLAGS="$flag"
+                PTHREAD_LDFLAGS="$flag"
+                ;;
+
                 -*)
                 AC_MSG_CHECKING([whether pthreads work with $flag])
@@ -1721,6 +1727,8 @@
         save_LIBS="$LIBS"
         save_CFLAGS="$CFLAGS"
+        save_LDFLAGS="$LDFLAGS"
         LIBS="$PTHREAD_LIBS $LIBS"
         CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LDFLAGS="$LDFLAGS $PTHREAD_LDFLAGS"
 
         # Check for various functions.  We must include pthread.h,
@@ -1740,4 +1748,5 @@
 
         LIBS="$save_LIBS"
+        LDFLAGS="$save_LDFLAGS"
         CFLAGS="$save_CFLAGS"
 
@@ -1749,4 +1758,5 @@
         PTHREAD_LIBS=""
         PTHREAD_CFLAGS=""
+        PTHREAD_LDFLAGS=""
 done
 fi
@@ -1799,4 +1809,5 @@
 AC_SUBST(PTHREAD_LIBS)
 AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_LDFLAGS)
 AC_SUBST(PTHREAD_CC)
 
Index: /trunk/configure.ac
===================================================================
--- /trunk/configure.ac	(revision 137)
+++ /trunk/configure.ac	(revision 138)
@@ -800,12 +800,4 @@
 )
 
-if test x"${mytclient}" = x-DSH_STANDALONE -o x"${mytclient}" = x-DSH_WITH_CLIENT;
-then
-	ACX_PTHREAD
-	CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-	LIBS="$PTHREAD_LIBS $LIBS"
-	CC="$PTHREAD_CC"
-fi
-	
 AC_SUBST(setpwd_prg)
 AC_SUBST(yulectl_prg)
@@ -878,4 +870,13 @@
 )
 
+if test x"${mytclient}" = x-DSH_STANDALONE -o x"${mytclient}" = x-DSH_WITH_CLIENT;
+then
+	ACX_PTHREAD
+	CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+	LIBS="$PTHREAD_LIBS $LIBS"
+	LDFLAGS="$PTHREAD_LDFLAGS $LDFLAGS"
+	CC="$PTHREAD_CC"
+fi
+	
 #
 # this is from the snort configure.in
Index: /trunk/depend.dep
===================================================================
--- /trunk/depend.dep	(revision 137)
+++ /trunk/depend.dep	(revision 138)
@@ -1,12 +1,12 @@
 
 # DO NOT DELETE THIS LINE
-samhain.o: $(srcsrc)/samhain.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_files.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_getopt.h $(srcinc)/sh_readconf.h $(srcinc)/sh_hash.h $(srcinc)/sh_mail.h $(srcinc)/sh_tiger.h $(srcinc)/sh_gpg.h $(srcinc)/sh_mem.h $(srcinc)/sh_forward.h $(srcinc)/sh_tools.h $(srcinc)/sh_hash.h $(srcinc)/sh_extern.h $(srcinc)/sh_modules.h $(srcinc)/sh_ignore.h $(srcinc)/sh_prelink.h sh_MK.h $(srcinc)/sh_schedule.h 
-sh_unix.o: $(srcsrc)/sh_unix.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_utils.h $(srcinc)/sh_mem.h $(srcinc)/sh_hash.h $(srcinc)/sh_tools.h $(srcinc)/sh_tiger.h $(srcinc)/sh_prelink.h $(srcinc)/sh_static.h $(srcinc)/sh_prelude.h $(srcinc)/sh_ignore.h 
-sh_utils.o: $(srcsrc)/sh_utils.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_entropy.h 
+samhain.o: $(srcsrc)/samhain.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_files.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_getopt.h $(srcinc)/sh_readconf.h $(srcinc)/sh_hash.h $(srcinc)/sh_mail.h $(srcinc)/sh_tiger.h $(srcinc)/sh_gpg.h $(srcinc)/sh_mem.h $(srcinc)/sh_forward.h $(srcinc)/sh_tools.h $(srcinc)/sh_hash.h $(srcinc)/sh_extern.h $(srcinc)/sh_modules.h $(srcinc)/sh_ignore.h $(srcinc)/sh_prelink.h sh_MK.h $(srcinc)/sh_schedule.h 
+sh_unix.o: $(srcsrc)/sh_unix.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_utils.h $(srcinc)/sh_mem.h $(srcinc)/sh_hash.h $(srcinc)/sh_tools.h $(srcinc)/sh_tiger.h $(srcinc)/sh_prelink.h $(srcinc)/sh_pthread.h $(srcinc)/sh_static.h $(srcinc)/sh_prelude.h $(srcinc)/sh_ignore.h 
+sh_utils.o: $(srcsrc)/sh_utils.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_entropy.h $(srcinc)/sh_pthread.h 
 sh_error.o: $(srcsrc)/sh_error.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_cat.h $(srcinc)/sh_database.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_mail.h $(srcinc)/sh_forward.h $(srcinc)/sh_prelude.h $(srcinc)/sh_tools.h $(srcinc)/sh_extern.h 
-sh_files.o: $(srcsrc)/sh_files.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_tiger.h $(srcinc)/sh_hash.h $(srcinc)/sh_ignore.h $(srcinc)/zAVLTree.h 
+sh_files.o: $(srcsrc)/sh_files.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_tiger.h $(srcinc)/sh_hash.h $(srcinc)/sh_ignore.h $(srcinc)/zAVLTree.h 
 sh_getopt.o: $(srcsrc)/sh_getopt.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_getopt.h $(srcinc)/sh_files.h $(srcinc)/sh_utils.h $(srcinc)/sh_mail.h $(srcinc)/sh_forward.h $(srcinc)/sh_hash.h $(srcinc)/sh_extern.h 
 sh_readconf.o: $(srcsrc)/sh_readconf.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_database.h $(srcinc)/sh_unix.h $(srcinc)/sh_utils.h $(srcinc)/sh_files.h $(srcinc)/sh_mail.h $(srcinc)/sh_calls.h $(srcinc)/sh_tiger.h $(srcinc)/sh_forward.h $(srcinc)/sh_modules.h $(srcinc)/sh_gpg.h $(srcinc)/sh_hash.h $(srcinc)/sh_ignore.h $(srcinc)/sh_prelink.h $(srcinc)/sh_extern.h $(srcinc)/sh_database.h $(srcinc)/sh_prelude.h 
-sh_tiger0.o: $(srcsrc)/sh_tiger0.c Makefile config_xor.h $(srcinc)/sh_tiger.h $(srcinc)/sh_unix.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h 
+sh_tiger0.o: $(srcsrc)/sh_tiger0.c Makefile config_xor.h $(srcinc)/sh_tiger.h $(srcinc)/sh_unix.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_pthread.h 
 sh_tiger1.o: $(srcsrc)/sh_tiger1.c Makefile config_xor.h 
 sh_tiger2.o: $(srcsrc)/sh_tiger2.c Makefile config_xor.h 
@@ -14,15 +14,15 @@
 sh_tiger2_64.o: $(srcsrc)/sh_tiger2_64.c Makefile config_xor.h 
 sh_hash.o: $(srcsrc)/sh_hash.c Makefile config_xor.h $(srcinc)/sh_hash.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_tiger.h $(srcinc)/sh_gpg.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_ignore.h $(srcinc)/sh_forward.h $(srcinc)/sh_hash.h 
-sh_mail.o: $(srcsrc)/sh_mail.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_mail.h $(srcinc)/sh_utils.h $(srcinc)/sh_fifo.h $(srcinc)/sh_tools.h $(srcinc)/sh_static.h $(srcinc)/sh_tools.h 
-sh_mem.o: $(srcsrc)/sh_mem.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_mem.h 
-sh_entropy.o: $(srcsrc)/sh_entropy.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_calls.h $(srcinc)/sh_static.h 
+sh_mail.o: $(srcsrc)/sh_mail.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_mail.h $(srcinc)/sh_utils.h $(srcinc)/sh_fifo.h $(srcinc)/sh_tools.h $(srcinc)/sh_pthread.h $(srcinc)/sh_static.h $(srcinc)/sh_tools.h 
+sh_mem.o: $(srcsrc)/sh_mem.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h $(srcinc)/sh_mem.h $(srcinc)/sh_pthread.h 
+sh_entropy.o: $(srcsrc)/sh_entropy.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_calls.h $(srcinc)/sh_pthread.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h 
 sh_forward.o: $(srcsrc)/sh_forward.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_tiger.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_forward.h $(srcinc)/sh_srp.h $(srcinc)/sh_fifo.h $(srcinc)/sh_tools.h $(srcinc)/sh_entropy.h $(srcinc)/sh_html.h $(srcinc)/sh_mail.h $(srcinc)/sh_socket.h $(srcinc)/sh_static.h $(srcinc)/rijndael-api-fst.h $(srcinc)/sh_readconf.h $(srcinc)/zAVLTree.h $(srcinc)/sh_extern.h 
 sh_modules.o: $(srcsrc)/sh_modules.c Makefile config_xor.h $(srcinc)/sh_modules.h $(srcinc)/sh_utmp.h $(srcinc)/sh_mounts.h $(srcinc)/sh_userfiles.h $(srcinc)/sh_kern.h $(srcinc)/sh_suidchk.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_portcheck.h 
 sh_utmp.o: $(srcsrc)/sh_utmp.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_utmp.h 
-sh_kern.o: $(srcsrc)/sh_kern.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_kern.h sh_ks_xor.h $(srcinc)/sh_unix.h $(srcinc)/sh_hash.h 
-sh_suidchk.o: $(srcsrc)/sh_suidchk.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_suidchk.h $(srcinc)/sh_hash.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_schedule.h $(srcinc)/sh_calls.h 
+sh_kern.o: $(srcsrc)/sh_kern.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_kern.h sh_ks_xor.h $(srcinc)/sh_unix.h $(srcinc)/sh_hash.h 
+sh_suidchk.o: $(srcsrc)/sh_suidchk.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_suidchk.h $(srcinc)/sh_hash.h $(srcinc)/sh_unix.h $(srcinc)/sh_files.h $(srcinc)/sh_schedule.h $(srcinc)/sh_calls.h 
 sh_srp.o: $(srcsrc)/sh_srp.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_tiger.h $(srcinc)/sh_mem.h $(srcinc)/sh_utils.h $(srcinc)/sh_srp.h $(srcinc)/bignum.h 
 sh_fifo.o: $(srcsrc)/sh_fifo.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_mem.h $(srcinc)/sh_unix.h 
-sh_tools.o: $(srcsrc)/sh_tools.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_mem.h $(srcinc)/sh_error.h $(srcinc)/sh_tools.h $(srcinc)/sh_utils.h $(srcinc)/sh_tiger.h $(srcinc)/sh_static.h $(srcinc)/rijndael-api-fst.h $(srcinc)/rijndael-api-fst.h 
+sh_tools.o: $(srcsrc)/sh_tools.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_mem.h $(srcinc)/sh_error.h $(srcinc)/sh_tools.h $(srcinc)/sh_utils.h $(srcinc)/sh_tiger.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h $(srcinc)/rijndael-api-fst.h $(srcinc)/rijndael-api-fst.h 
 sh_html.o: $(srcsrc)/sh_html.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_forward.h $(srcinc)/sh_error.h $(srcinc)/sh_unix.h $(srcinc)/sh_utils.h $(srcinc)/sh_html.h $(srcinc)/zAVLTree.h 
 sh_gpg.o: $(srcsrc)/sh_gpg.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_tiger.h $(srcinc)/sh_static.h 
@@ -41,5 +41,5 @@
 encode.o: $(srcsrc)/encode.c Makefile 
 sstrip.o: $(srcsrc)/sstrip.c Makefile config.h 
-trustfile.o: $(srcsrc)/trustfile.c Makefile config_xor.h $(srcinc)/sh_calls.h $(srcinc)/slib.h $(srcinc)/sh_static.h 
+trustfile.o: $(srcsrc)/trustfile.c Makefile config_xor.h $(srcinc)/sh_calls.h $(srcinc)/slib.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h 
 exepack.o: $(srcsrc)/exepack.c Makefile config.h $(srcinc)/minilzo.h $(srcinc)/exepack.data 
 exepack_fill.o: $(srcsrc)/exepack_fill.c Makefile config.h config.h $(srcinc)/minilzo.h 
@@ -54,11 +54,12 @@
 yulectl.o: $(srcsrc)/yulectl.c Makefile config_xor.h 
 sh_mounts.o: $(srcsrc)/sh_mounts.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_modules.h $(srcinc)/sh_mounts.h 
-sh_userfiles.o: $(srcsrc)/sh_userfiles.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_userfiles.h $(srcinc)/sh_utils.h $(srcinc)/sh_schedule.h $(srcinc)/sh_error.h $(srcinc)/sh_hash.h $(srcinc)/sh_files.h $(srcinc)/sh_static.h 
-sh_prelude.o: $(srcsrc)/sh_prelude.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_cat.h $(srcinc)/sh_error_min.h $(srcinc)/sh_prelude.h 
+sh_userfiles.o: $(srcsrc)/sh_userfiles.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_userfiles.h $(srcinc)/sh_utils.h $(srcinc)/sh_schedule.h $(srcinc)/sh_error.h $(srcinc)/sh_hash.h $(srcinc)/sh_files.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h 
+sh_prelude.o: $(srcsrc)/sh_prelude.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_cat.h $(srcinc)/sh_error_min.h $(srcinc)/sh_prelude.h $(srcinc)/sh_static.h 
 sh_prelink.o: $(srcsrc)/sh_prelink.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_tiger.h $(srcinc)/sh_extern.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h 
-sh_static.o: $(srcsrc)/sh_static.c Makefile config_xor.h 
-sh_prelude_old.o: $(srcsrc)/sh_prelude_old.c Makefile config_xor.h $(srcinc)/slib.h $(srcinc)/sh_mem.h $(srcinc)/sh_cat.h $(srcinc)/sh_error_min.h $(srcinc)/sh_prelude.h $(srcinc)/sh_static.h 
+sh_static.o: $(srcsrc)/sh_static.c Makefile config_xor.h $(srcinc)/sh_pthread.h 
+sh_prelude_old.o: $(srcsrc)/sh_prelude_old.c Makefile config_xor.h $(srcinc)/slib.h $(srcinc)/sh_mem.h $(srcinc)/sh_cat.h $(srcinc)/sh_error_min.h $(srcinc)/sh_prelude.h $(srcinc)/sh_static.h $(srcinc)/sh_pthread.h 
 kern_head.o: $(srcsrc)/kern_head.c Makefile config.h $(srcinc)/kern_head.h $(srcinc)/kern_head.h 
 sh_async.o: $(srcsrc)/sh_async.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_calls.h $(srcinc)/sh_error.h 
 sh_processcheck.o: $(srcsrc)/sh_processcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_extern.h $(srcinc)/sh_calls.h $(srcinc)/CuTest.h 
-sh_portcheck.o: $(srcsrc)/sh_portcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_mem.h $(srcinc)/sh_calls.h $(srcinc)/sh_utils.h $(srcinc)/sh_modules.h $(srcinc)/CuTest.h 
+sh_portcheck.o: $(srcsrc)/sh_portcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_mem.h $(srcinc)/sh_calls.h $(srcinc)/sh_utils.h $(srcinc)/sh_modules.h $(srcinc)/sh_pthread.h $(srcinc)/CuTest.h 
+sh_pthread.o: $(srcsrc)/sh_pthread.c Makefile config_xor.h $(srcinc)/sh_pthread.h 
Index: /trunk/depend.sum
===================================================================
--- /trunk/depend.sum	(revision 137)
+++ /trunk/depend.sum	(revision 138)
@@ -1,1 +1,1 @@
-1096789008
+754800869
Index: /trunk/docs/Changelog
===================================================================
--- /trunk/docs/Changelog	(revision 137)
+++ /trunk/docs/Changelog	(revision 138)
@@ -5,6 +5,7 @@
 	* protect readdir(), getpwent(), gethostname() with mutexes 
 	  (readdir_r considered harmful)
-	* make checksum/hash, entropy function reentrant
+	* make checksum/hash, entropy, rng functions reentrant
 	* use thread-specific conversion buffer for globber()
+	* fixed compile problems and problems with test suite
 
 2.3.8:
Index: /trunk/include/samhain.h
===================================================================
--- /trunk/include/samhain.h	(revision 137)
+++ /trunk/include/samhain.h	(revision 138)
@@ -43,6 +43,4 @@
 #define SH_PATHBUF      256
 
-#define SH_GRBUF_SIZE  4096
-#define SH_PWBUF_SIZE  4096
 #define SH_ERRBUF_SIZE   64
 
Index: /trunk/include/sh_files.h
===================================================================
--- /trunk/include/sh_files.h	(revision 137)
+++ /trunk/include/sh_files.h	(revision 138)
@@ -30,8 +30,11 @@
 void kill_sh_dirlist (struct sh_dirent * dirlist);
 
+#ifdef NEED_ADD_DIRENT
 /* add an entry to a directory listing
  */
 struct sh_dirent * addto_sh_dirlist (struct dirent * thisEntry, 
 				     struct sh_dirent * dirlist);
+#endif
+
 /* register exceptions to hardlink check
  */
Index: /trunk/include/sh_pthread.h
===================================================================
--- /trunk/include/sh_pthread.h	(revision 137)
+++ /trunk/include/sh_pthread.h	(revision 138)
@@ -5,4 +5,5 @@
 
 #include <pthread.h>
+
 #define SH_MUTEX(M)				pthread_mutex_t M
 #define SH_MUTEX_INIT(M,I)			pthread_mutex_t M = I
@@ -10,13 +11,18 @@
 #define SH_MUTEX_EXTERN(M)			extern pthread_mutex_t M
 
+/* pthread_mutex_unlock() has the wrong type (returns int), so
+ * we need to wrap it in this function.
+ */
+extern void sh_pthread_mutex_unlock (void *arg);
+
 #define SH_MUTEX_LOCK(M)						   \
 	do {                                                               \
                 int oldtype;                                               \
 		pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);  \
-                pthread_cleanup_push(pthread_mutex_unlock, (void *) &(M)); \
+                pthread_cleanup_push(sh_pthread_mutex_unlock, (void*)&(M));\
                 pthread_mutex_lock(&(M))
 
 
-#define SH_MUTEX_UNLOCK(M,C)						   \
+#define SH_MUTEX_UNLOCK(M)						   \
 		pthread_cleanup_pop(1);                                    \
                 pthread_setcanceltype(oldtype, NULL);                      \
@@ -26,4 +32,80 @@
 #define SH_MUTEX_UNLOCK_UNSAFE(M) pthread_mutex_unlock(&(M))
 
+
+/*
+ * ----   Recursive mutex  ----
+ */
+#if defined(PTHREAD_MUTEX_RECURSIVE)
+
+/* On GNU C, it's an enum, thus the alternative implementation 
+ * below is used.
+ */
+#define SH_MUTEX_RECURSIVE(M)                                          \
+static pthread_mutex_t M;                                              \
+static void M ## _init (void)                                          \
+{                                                                      \
+  pthread_mutexattr_t   mta;                                           \
+  pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE);            \
+  pthread_mutex_init(&(M), &mta);                                      \
+  pthread_mutexattr_destroy(&mta);                                     \
+  return;                                                              \
+}                                                                      \
+static pthread_once_t  M ## _initialized = PTHREAD_ONCE_INIT
+
+#define SH_MUTEX_RECURSIVE_INIT(M)                                     \
+(void) pthread_once(&(M ## _initialized), (M ## _init))
+
+#define SH_MUTEX_RECURSIVE_LOCK(M)					   \
+	do {                                                               \
+                int oldtype;                                               \
+		pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);  \
+                pthread_cleanup_push(sh_pthread_mutex_unlock, (void*)&(M));\
+                pthread_mutex_lock(&(M))
+
+#define SH_MUTEX_RECURSIVE_UNLOCK(M)					   \
+		pthread_cleanup_pop(1);                                    \
+                pthread_setcanceltype(oldtype, NULL);                      \
+	} while (0)
+
+#else
+/* !defined(PTHREAD_MUTEX_RECURSIVE) */
+ struct sh_RMutex {
+
+  pthread_mutex_t lock;
+  unsigned int    held;
+  unsigned int    waiters;
+  pthread_t       tid;
+  pthread_cond_t  cv;
+};
+
+void sh_RMutexLock(struct sh_RMutex * tok);
+void sh_RMutexUnlock(void * arg);
+void sh_InitRMutex(struct sh_RMutex * tok);
+
+#define SH_MUTEX_RECURSIVE(M)                                          \
+static struct sh_RMutex M;                                             \
+static void M ## _init (void)                                          \
+{                                                                      \
+  sh_InitRMutex(&(M));                                                 \
+  return;                                                              \
+}                                                                      \
+static pthread_once_t  M ## _initialized = PTHREAD_ONCE_INIT
+
+#define SH_MUTEX_RECURSIVE_INIT(M)                                     \
+(void) pthread_once(&(M ## _initialized), (M ## _init))
+
+#define SH_MUTEX_RECURSIVE_LOCK(M)					   \
+	do {                                                               \
+                int oldtype;                                               \
+		pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);  \
+                pthread_cleanup_push(sh_RMutexUnlock, (void*)&(M));        \
+                sh_RMutexLock(&(M))
+
+#define SH_MUTEX_RECURSIVE_UNLOCK(M)					   \
+		pthread_cleanup_pop(1);                                    \
+                pthread_setcanceltype(oldtype, NULL);                      \
+	} while (0)
+
+#endif
 /* 
  * ----   Global mutexes   ----
@@ -32,4 +114,5 @@
 SH_MUTEX_EXTERN(mutex_resolv);
 SH_MUTEX_EXTERN(mutex_pwent);
+SH_MUTEX_EXTERN(mutex_readdir);
 
 /*
@@ -49,4 +132,9 @@
 #define SH_MUTEX_UNLOCK_UNSAFE(M)		((void)0)
 
+#define SH_MUTEX_RECURSIVE(M)                   extern void *SH_MUTEX_DUMMY_ ## M
+#define SH_MUTEX_RECURSIVE_INIT(M)              ((void)0)
+#define SH_MUTEX_RECURSIVE_LOCK(M)		((void)0)
+#define SH_MUTEX_RECURSIVE_UNLOCK(M)		((void)0)
+
 /* #ifdef HAVE_PTHREAD */
 #endif
Index: /trunk/include/sh_tiger.h
===================================================================
--- /trunk/include/sh_tiger.h	(revision 137)
+++ /trunk/include/sh_tiger.h	(revision 138)
@@ -9,8 +9,9 @@
 typedef long int TigerType;
 
-#define TIGER_FILE -1;
-#define TIGER_DATA -2;
+#define TIGER_FILE -1
+#define TIGER_DATA -2
 
 /****************
+typedef long int TigerType;
 typedef enum {
   TIGER_FILE,
@@ -24,6 +25,6 @@
 /* the checksum function
  */
-/*@owned@*/ char * sh_tiger_hash (const char * filename, TigerType what, 
-				  UINT64 Length, char * out, size_t len);
+char * sh_tiger_hash (const char * filename, TigerType what, 
+		      UINT64 Length, char * out, size_t len);
 
 /* NEW Thu Oct 18 19:59:08 CEST 2001
Index: /trunk/include/sh_utils.h
===================================================================
--- /trunk/include/sh_utils.h	(revision 137)
+++ /trunk/include/sh_utils.h	(revision 138)
@@ -58,5 +58,5 @@
  *  generator. 
  */
-UINT32 taus_get            (void *state1, void *state2, void *state3);  
+UINT32 taus_get            ();  
 double taus_get_double     (void *vstate);  /* fast */
 int    taus_seed           (void);
@@ -85,5 +85,6 @@
  */
 char * sh_util_siggen (char * hexkey,  
-		       char * text, size_t textlen);
+		       char * text, size_t textlen, 
+		       char * sigbuf, size_t sigbuflen);
 
 /* eval boolean input
@@ -112,7 +113,7 @@
 int sh_util_obscure_ok (const char * str);
 
-/* output a hexchar[2]
+/* output a hexchar[2]; i2h must be char[2]
  */
-char * sh_util_charhex( unsigned char c );
+char * sh_util_charhex( unsigned char c, char * i2h );
 
 /* read a hexchar, return int value (0-15)
Index: /trunk/include/slib.h
===================================================================
--- /trunk/include/slib.h	(revision 137)
+++ /trunk/include/slib.h	(revision 138)
@@ -60,4 +60,6 @@
 #define SL_FALSE 0
 
+#define SH_GRBUF_SIZE  4096
+#define SH_PWBUF_SIZE  4096
 
 
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] == '/') 
       {
Index: /trunk/test/testcompile.sh
===================================================================
--- /trunk/test/testcompile.sh	(revision 137)
+++ /trunk/test/testcompile.sh	(revision 138)
@@ -110,4 +110,5 @@
 	if test x$1 = x0; then
 		[ -z "$verbose" ]     ||  log_msg_ok  "configure...  $TEST";
+		$MAKE clean > /dev/null 2>> test_log
 		$MAKE ${SMATCH} cutest > /dev/null 2>> test_log
 		if test x$? = x0; then
Index: /trunk/test/testrun_1.sh
===================================================================
--- /trunk/test/testrun_1.sh	(revision 137)
+++ /trunk/test/testrun_1.sh	(revision 138)
@@ -933,5 +933,5 @@
 run_check ()
 {
-     ${VALGRIND} ./samhain -t check -p none -l debug 2>>test_log_valgrind
+    ${VALGRIND} ./samhain -t check -p none -l debug 2>>test_log_valgrind
  
     if test x$? = x0; then
