Index: /trunk/Makefile.in
===================================================================
--- /trunk/Makefile.in	(revision 314)
+++ /trunk/Makefile.in	(revision 315)
@@ -126,5 +126,5 @@
 	sh_log_check.h sh_log_evalrule.h sh_log_correlate.h \
 	sh_log_mark.h sh_log_repeat.h sh_inotify.h sh_registry.h sh_ipvx.h \
-	sh_restrict.h
+	sh_restrict.h sh_sub.h
 
 
@@ -168,5 +168,6 @@
 	$(srcsrc)/sh_inotify.c $(srcsrc)/sh_log_repeat.c \
 	$(srcsrc)/sh_audit.c $(srcsrc)/sh_registry.c \
-	$(srcsrc)/sh_ipvx.c $(srcsrc)/sh_restrict.c $(srcsrc)/sh_filetype.c \
+	$(srcsrc)/sh_ipvx.c $(srcsrc)/sh_restrict.c \
+	$(srcsrc)/sh_filetype.c $(srcsrc)/sh_sub.c \
 	$(srcsrc)/t-test1.c
 
@@ -188,5 +189,6 @@
 	sh_log_correlate.o sh_log_mark.o sh_log_repeat.o \
 	sh_pthread.o sh_string.o sh_inotify.o dnmalloc.o \
-	sh_audit.o sh_registry.o sh_ipvx.o sh_restrict.o sh_filetype.o
+	sh_audit.o sh_registry.o sh_ipvx.o sh_restrict.o \
+	sh_filetype.o sh_sub.o
 
 KERN = kern_head.h kern_head.c
@@ -1730,5 +1732,5 @@
 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 
 sh_cat.o: $(srcsrc)/sh_cat.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_cat.h 
-sh_calls.o: $(srcsrc)/sh_calls.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_calls.h $(srcinc)/sh_ipvx.h 
+sh_calls.o: $(srcsrc)/sh_calls.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_calls.h $(srcinc)/sh_ipvx.h $(srcinc)/sh_sub.h $(srcinc)/sh_utils.h 
 sh_extern.o: $(srcsrc)/sh_extern.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_extern.h $(srcinc)/sh_calls.h $(srcinc)/sh_filter.h $(srcinc)/sh_static.h 
 sh_database.o: $(srcsrc)/sh_database.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_cat.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h 
@@ -1788,2 +1790,3 @@
 sh_restrict.o: $(srcsrc)/sh_restrict.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_mem.h $(srcinc)/sh_error_min.h $(srcinc)/sh_string.h $(srcinc)/sh_utils.h $(srcinc)/sh_restrict.h $(srcinc)/CuTest.h 
 sh_filetype.o: $(srcsrc)/sh_filetype.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_mem.h $(srcinc)/sh_error_min.h $(srcinc)/sh_utils.h 
+sh_sub.o: $(srcsrc)/sh_sub.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h 
Index: /trunk/depend.dep
===================================================================
--- /trunk/depend.dep	(revision 314)
+++ /trunk/depend.dep	(revision 315)
@@ -28,5 +28,5 @@
 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 
 sh_cat.o: $(srcsrc)/sh_cat.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_cat.h 
-sh_calls.o: $(srcsrc)/sh_calls.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_calls.h $(srcinc)/sh_ipvx.h 
+sh_calls.o: $(srcsrc)/sh_calls.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_calls.h $(srcinc)/sh_ipvx.h $(srcinc)/sh_sub.h $(srcinc)/sh_utils.h 
 sh_extern.o: $(srcsrc)/sh_extern.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_utils.h $(srcinc)/sh_unix.h $(srcinc)/sh_tiger.h $(srcinc)/sh_extern.h $(srcinc)/sh_calls.h $(srcinc)/sh_filter.h $(srcinc)/sh_static.h 
 sh_database.o: $(srcsrc)/sh_database.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_cat.h $(srcinc)/sh_error.h $(srcinc)/sh_utils.h 
@@ -88,2 +88,3 @@
 sh_restrict.o: $(srcsrc)/sh_restrict.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_mem.h $(srcinc)/sh_error_min.h $(srcinc)/sh_string.h $(srcinc)/sh_utils.h $(srcinc)/sh_restrict.h $(srcinc)/CuTest.h 
 sh_filetype.o: $(srcsrc)/sh_filetype.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_mem.h $(srcinc)/sh_error_min.h $(srcinc)/sh_utils.h 
+sh_sub.o: $(srcsrc)/sh_sub.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_pthread.h 
Index: /trunk/depend.sum
===================================================================
--- /trunk/depend.sum	(revision 314)
+++ /trunk/depend.sum	(revision 315)
@@ -1,1 +1,1 @@
-2589357922
+2743510484
Index: /trunk/docs/Changelog
===================================================================
--- /trunk/docs/Changelog	(revision 314)
+++ /trunk/docs/Changelog	(revision 315)
@@ -1,3 +1,8 @@
 2.8.3:
+	* fix zeroing of result from getnameinfo() (problem reported by Richard)
+	* fix spurious warnings about unsupported address family (reported
+	  by N Silverman)
+	* option to run lstat/stat in subprocess to avoid hanging on NFS mounts 
+	  (off by default)
 	* fix Windows/Cygwin compile error (reported by A. Schmidt)
 
Index: /trunk/include/sh_calls.h
===================================================================
--- /trunk/include/sh_calls.h	(revision 314)
+++ /trunk/include/sh_calls.h	(revision 315)
@@ -39,4 +39,6 @@
 		      int fd, struct sh_sockaddr *serv_addr, int * addrlen);
 #endif
+
+int sh_calls_set_sub (const char * str);
 
 long int retry_stat (const char * file, int line, 
Index: /trunk/include/sh_ipvx.h
===================================================================
--- /trunk/include/sh_ipvx.h	(revision 314)
+++ /trunk/include/sh_ipvx.h	(revision 315)
@@ -46,7 +46,15 @@
 int sh_ipvx_set_port(struct sh_sockaddr * ss, int port);
 
+/* Get the port
+ */
+int sh_ipvx_get_port(struct sockaddr * ss, int sa_family);
+
 /* Save a sockaddress
  */
 void sh_ipvx_save(struct sh_sockaddr * ss, int sa_family, struct sockaddr * sa);
+
+/* Ascii numerical sockaddress
+ */
+char * sh_ipvx_print_sockaddr (struct sockaddr * sa, int sa_family);
 
 /* Determine whether the given address is numeric
Index: /trunk/include/sh_pthread.h
===================================================================
--- /trunk/include/sh_pthread.h	(revision 314)
+++ /trunk/include/sh_pthread.h	(revision 315)
@@ -10,4 +10,8 @@
 #define SH_MUTEX_STATIC(M,I)			static pthread_mutex_t M = I
 #define SH_MUTEX_EXTERN(M)			extern pthread_mutex_t M
+
+#define SH_SETSIGMASK(A, B, C)                  sh_pthread_setsigmask(A,B,C)
+
+int sh_pthread_setsigmask(int how, const void *set, void *oldset);
 
 /* pthread_mutex_unlock() has the wrong type (returns int), so
@@ -133,4 +137,8 @@
 #else
 
+#define SH_SETSIGMASK(A, B, C)                  sh_pthread_setsigmask(A,B,C)
+
+int sh_pthread_setsigmask(int how, const void *set, void *oldset);
+
 #define PTHREAD_MUTEX_INITIALIZER               NULL
 #define SH_MUTEX(M)				void *SH_MUTEX_DUMMY_ ## M
Index: /trunk/src/sh_calls.c
===================================================================
--- /trunk/src/sh_calls.c	(revision 314)
+++ /trunk/src/sh_calls.c	(revision 315)
@@ -52,4 +52,6 @@
 #include "sh_calls.h"
 #include "sh_ipvx.h"
+#include "sh_sub.h"
+#include "sh_utils.h"
 
 #undef  FIL__
@@ -240,4 +242,11 @@
 }
 
+static int sh_use_sub = 0;
+
+int sh_calls_set_sub (const char * str)
+{
+  return sh_util_flagval(str, &sh_use_sub);
+}
+
 long int retry_lstat(const char * file, int line, 
 		     const char *file_name, struct stat *buf)
@@ -249,7 +258,15 @@
   SL_ENTER(_("retry_lstat"));
 
-  do {
-    val_retry = /*@-unrecog@*/lstat (file_name, buf)/*@+unrecog@*/;
-  } while (val_retry < 0 && errno == EINTR);
+  if (sh_use_sub)
+    {
+      val_retry = sh_sub_lstat (file_name, buf);
+    }
+  else
+    {
+      do {
+	val_retry = /*@-unrecog@*/lstat (file_name, buf)/*@+unrecog@*/;
+      } while (val_retry < 0 && errno == EINTR);
+    }
+
   error = errno;
   if (val_retry < 0) {
@@ -260,4 +277,5 @@
   }
   errno = error;    
+
   SL_RETURN(val_retry, _("retry_lstat"));
 }
@@ -272,7 +290,15 @@
   SL_ENTER(_("retry_stat"));
 
-  do {
-    val_retry = stat (file_name, buf);
-  } while (val_retry < 0 && errno == EINTR);
+  if (sh_use_sub)
+    {
+      val_retry = sh_sub_stat (file_name, buf);
+    }
+  else
+    {
+      do {
+	val_retry = stat (file_name, buf);
+      } while (val_retry < 0 && errno == EINTR);
+    }
+
   error = errno;
   if (val_retry < 0) {
@@ -283,4 +309,5 @@
   }
   errno = error;    
+
   SL_RETURN(val_retry, _("retry_stat"));
 }
Index: /trunk/src/sh_forward.c
===================================================================
--- /trunk/src/sh_forward.c	(revision 314)
+++ /trunk/src/sh_forward.c	(revision 315)
@@ -4862,4 +4862,8 @@
   int flag   = 1; /* non-zero to enable an option */
 
+  /* fprintf(stderr, "FIXME IPVX: bind addr %s (%d) :%d\n", 
+	  sh_ipvx_print_sockaddr (sa, domain), salen,
+	  sh_ipvx_get_port(sa, domain)); */
+
   /* create the socket, bind() it and listen()
    */
@@ -4940,4 +4944,5 @@
       hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
       hints.ai_socktype = SOCK_STREAM;
+      hints.ai_family   = AF_UNSPEC;
       sl_snprintf(port, sizeof(port), "%d", server_port);
 
Index: /trunk/src/sh_port2proc.c
===================================================================
--- /trunk/src/sh_port2proc.c	(revision 314)
+++ /trunk/src/sh_port2proc.c	(revision 315)
@@ -422,5 +422,5 @@
 
 		sh_ipvx_ntoa(a, sizeof(a), &ss);
-		sh_ipvx_ntoa(b, sizeof(b), &ss);
+		sh_ipvx_ntoa(b, sizeof(b), saddr);
 
 		fprintf(stderr, " -> inode %u, iface/port %s,%u, status %u, searching %s,%u, %u\n", 
Index: /trunk/src/sh_pthread.c
===================================================================
--- /trunk/src/sh_pthread.c	(revision 314)
+++ /trunk/src/sh_pthread.c	(revision 315)
@@ -15,4 +15,9 @@
 SH_MUTEX_INIT(mutex_readdir,      PTHREAD_MUTEX_INITIALIZER);
 SH_MUTEX_INIT(mutex_thread_nolog, PTHREAD_MUTEX_INITIALIZER);
+
+int sh_pthread_setsigmask(int how, const void *set, void *oldset)
+{
+  return pthread_sigmask(how, (const sigset_t *)set, (sigset_t *)oldset);
+}
 
 void sh_pthread_mutex_unlock (void *arg)
@@ -288,4 +293,13 @@
 #endif
 
+#else
+
+#include <signal.h>
+
+int sh_pthread_setsigmask(int how, const void *set, void *oldset)
+{
+  return sigprocmask(how, (const sigset_t *)set, (sigset_t *)oldset);
+}
+
 
 #endif
Index: /trunk/src/sh_readconf.c
===================================================================
--- /trunk/src/sh_readconf.c	(revision 314)
+++ /trunk/src/sh_readconf.c	(revision 315)
@@ -1227,4 +1227,7 @@
     sh_util_sigtype },
 
+  { N_("avoidblock"),     SH_SECTION_MISC,  SH_SECTION_NONE, 
+    sh_calls_set_sub },
+
   { NULL,    0,   0,  NULL}
 };
Index: /trunk/src/sh_socket.c
===================================================================
--- /trunk/src/sh_socket.c	(revision 314)
+++ /trunk/src/sh_socket.c	(revision 315)
@@ -683,5 +683,5 @@
       {
 	++retry;
-	retry_msleep(0, 1);
+	retry_msleep(0, 10);
       }
   } while ((nbytes < 0) && (retry < 3));
Index: /trunk/src/sh_unix.c
===================================================================
--- /trunk/src/sh_unix.c	(revision 314)
+++ /trunk/src/sh_unix.c	(revision 315)
@@ -1529,5 +1529,5 @@
   do {
     errno = 0;
-    test  = sigprocmask(SIG_UNBLOCK, &set_proc, NULL);
+    test  = SH_SETSIGMASK(SIG_UNBLOCK, &set_proc, NULL);
   } while (test < 0 && errno == EINTR);
 
