--- libelwix/src/pio.c	2013/12/15 22:54:41	1.2
+++ libelwix/src/pio.c	2020/06/19 13:06:17	1.7
@@ -3,7 +3,7 @@
 *  by Michael Pounov <misho@elwix.org>
 *
 * $Author: misho $
-* $Id: pio.c,v 1.2 2013/12/15 22:54:41 misho Exp $
+* $Id: pio.c,v 1.7 2020/06/19 13:06:17 misho Exp $
 *
 **************************************************************************
 The ELWIX and AITNET software is distributed under the following
@@ -12,7 +12,7 @@ terms:
 All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
 
-Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
+Copyright 2004 - 2020
 	by Michael Pounov <misho@elwix.org>.  All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -49,12 +49,16 @@ SUCH DAMAGE.
 extern char **environ;
 
 pio_pid_t pio_pidlist = SLIST_HEAD_INITIALIZER(pio_pidlist);
+#ifdef HAVE_LIBPTHREAD
 static pthread_mutex_t pidlist_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-#define	THREAD_LOCK()	if (__isthreaded) pthread_mutex_lock(&pidlist_mutex)
-#define	THREAD_UNLOCK()	if (__isthreaded) pthread_mutex_unlock(&pidlist_mutex)
+#define	THREAD_LOCK()	pthread_mutex_lock(&pidlist_mutex)
+#define	THREAD_UNLOCK()	pthread_mutex_unlock(&pidlist_mutex)
+#else
+#define	THREAD_LOCK()
+#define	THREAD_UNLOCK()
+#endif
 
-
 /*
  * e_popen() - ELWIX replacement of standard popen
  *
@@ -70,8 +74,28 @@ int
 #endif
 e_popen(const char *command, const char *type, pid_t *ppid)
 {
+	return e_popen2(command, type, ppid, NULL, 0);
+}
+
+/*
+ * e_popen2() - ELWIX replacement of standard popen with post close of chosen handles
+ *
+ * @command = command
+ * @type = type
+ * @ppid = return pid of child program
+ * @fds = file descriptor array for close when fork
+ * @fdslen = fds number of descriptors
+ * return: NULL error or !=NULL open program
+ */
+#ifdef POPEN_STREAM
+FILE *
+#else
+int
+#endif
+e_popen2(const char *command, const char *type, pid_t *ppid, int *fds, size_t fdslen)
+{
 	struct tagPIOPID *cur, *p;
-	int pdes[2], pid, twoway, cloexec;
+	int pdes[2], pid, twoway, cloexec, i;
 	char *argv[4];
 
 	if (!command || !type)
@@ -139,6 +163,11 @@ e_popen(const char *command, const char *type, pid_t *
 #endif
 		/* NOTREACHED */
 	case 0:				/* Child. */
+		if (fds && fdslen) {
+			for (i = 0; i < fdslen; i++)
+				close(fds[i]);
+		}
+
 		if (*type == 'r') {
 			/*
 			 * The _dup2() to STDIN_FILENO is repeated to avoid
@@ -231,7 +260,7 @@ e_pclose(int iop)
 #endif
 {
 	struct tagPIOPID *cur, *last = NULL;
-	int pstat;
+	int pstat = 0;
 	pid_t pid;
 
 	if (!iop)
@@ -318,7 +347,7 @@ pio_pchkpid(array_t ** __restrict pids)
 {
 	register int ret = 0;
 	struct tagPIOPID *p;
-	array_t *pa;
+	array_t *pa = NULL;
 
 	if (pids) {
 		if (!(pa = array_Init(0)))