From bfb7b4f4bad5d9f0a891f02c75b4dd9fd5ead250 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Wed, 13 Apr 2005 22:31:22 +0000
Subject: [PATCH] Redirect stderr to stdout unless XTRN_LOG_STDERR is defined
 during compile.

---
 src/sbbs3/xtrn.cpp | 74 ++++++++++++++++++++++++++--------------------
 1 file changed, 42 insertions(+), 32 deletions(-)

diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index f3763ac2da..46ec9d75f1 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -1589,10 +1589,12 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		input_thread_mutex_locked=true;
 	}
 
+#ifdef XTERN_LOG_STDERR
 	if(pipe(err_pipe)!=0) {
 		errormsg(WHERE,ERR_CREATE,"err_pipe",0);
 		return(-1);
-	}
+}
+#endif
 
 	if((mode&EX_INR) && (mode&EX_OUTR))  {
 		struct winsize winsize;
@@ -1694,7 +1696,9 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		if(mode&EX_OUTR && !(mode&EX_INR)) {
 			close(out_pipe[0]);		/* close read-end of pipe */
 			dup2(out_pipe[1],1);	/* stdout */
-			/* dup2(out_pipe[1],2);	stderr */
+#ifndef XTERN_LOG_STDERR
+			dup2(out_pipe[1],2);	/* stderr */
+#endif
 			close(out_pipe[1]);		/* close excess file descriptor */
 		}
 
@@ -1704,8 +1708,10 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 			daemon(TRUE,FALSE);
    	    }
 
+#ifdef XTERN_LOG_STDERR
 		close(err_pipe[0]);		/* close read-end of pipe */
 		dup2(err_pipe[1],2);	/* stderr */
+#endif
 	
 		execvp(argv[0],argv);
 		sprintf(str,"!ERROR %d executing %s",errno,argv[0]);
@@ -1720,7 +1726,9 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 	if(!(mode&EX_OFFLINE))
 		rio_abortable=false;
 	
+#ifdef XTERN_LOG_STDERR
 	close(err_pipe[1]);	/* close write-end of pipe */
+#endif
 
 	if(mode&EX_OUTR) {
 		if(!(mode&EX_INR))
@@ -1746,15 +1754,22 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 				
 			/* Error Output */
 			FD_ZERO(&ibits);
+#ifdef XTERN_LOG_STDERR
 			FD_SET(err_pipe[0],&ibits);
 			high_fd=err_pipe[0];
+#endif
 			FD_SET(out_pipe[0],&ibits);
+#ifdef XTERN_LOG_STDERR
 			if(out_pipe[0]>err_pipe[0])
 				high_fd=out_pipe[0];
+#endif
 			timeout.tv_sec=0;
 			timeout.tv_usec=1000;
 			bp=buf;
 			i=0;
+#ifdef XTERN_LOG_STDERR
+			select(high_fd+1,&ibits,NULL,NULL,&timeout);
+#else
 			while ((select(high_fd+1,&ibits,NULL,NULL,&timeout)>0) && FD_ISSET(err_pipe[0],&ibits) && (i<(int)sizeof(buf)-1))  {
 				if((rd=read(err_pipe[0],bp,1))>0)  {
 					i+=rd;
@@ -1778,17 +1793,9 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 				bp=buf;
 				i=0;
 			}
+#endif
 
-#if 0
-			/* Output */
-			FD_ZERO(&ibits);
-			FD_SET(out_pipe[0],&ibits);
-			timeout.tv_sec=0;
-			timeout.tv_usec=1000;
-			data_waiting=(select(out_pipe[0]+1,&ibits,NULL,NULL,&timeout)!=0);
-#else
 			data_waiting=FD_ISSET(out_pipe[0],&ibits);
-#endif
 			if(i==0 && data_waiting==0)
 				continue;
 
@@ -1863,31 +1870,32 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		/* Enable the Nagle algorithm */
 		int nodelay=FALSE;
 		setsockopt(client_socket,IPPROTO_TCP,TCP_NODELAY,(char*)&nodelay,sizeof(nodelay));
-	}
-
-	while(waitpid(pid, &i, WNOHANG)==0)  {
-		FD_ZERO(&ibits);
-		FD_SET(err_pipe[0],&ibits);
-		timeout.tv_sec=1;
-		timeout.tv_usec=0;
-		bp=buf;
-		i=0;
-		while ((select(err_pipe[0]+1,&ibits,NULL,NULL,&timeout)>0) && (i<XTRN_IO_BUF_LEN-1))  {
-			if((rd=read(err_pipe[0],bp,1))>0)  {
-				i+=rd;
-				if(*bp=='\n') {
-					lprintf(LOG_NOTICE,"%.*s",i-1,buf);
-					i=0;
-					bp=buf;
+		while(waitpid(pid, &i, WNOHANG)==0)  {
+#ifdef XTERN_LOG_STDERR
+			FD_ZERO(&ibits);
+			FD_SET(err_pipe[0],&ibits);
+			timeout.tv_sec=1;
+			timeout.tv_usec=0;
+			bp=buf;
+			i=0;
+			while ((select(err_pipe[0]+1,&ibits,NULL,NULL,&timeout)>0) && (i<XTRN_IO_BUF_LEN-1))  {
+				if((rd=read(err_pipe[0],bp,1))>0)  {
+					i+=rd;
+					if(*bp=='\n') {
+						lprintf(LOG_NOTICE,"%.*s",i-1,buf);
+						i=0;
+						bp=buf;
+					}
+					else
+						bp++;
 				}
 				else
-					bp++;
+					break;
 			}
-			else
-				break;
+			if(i)
+				lprintf(LOG_NOTICE,"%.*s",i,buf);
+#endif
 		}
-		if(i)
-			lprintf(LOG_NOTICE,"%.*s",i,buf);
 	}
 
 	if(!(mode&EX_OFFLINE)) {	/* !off-line execution */
@@ -1909,7 +1917,9 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
 		request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX);
 	}
 
+#ifdef XTERN_LOG_STDERR
 	close(err_pipe[0]);
+#endif
 
 	if(input_thread_mutex_locked && input_thread_running) {
 		if(pthread_mutex_unlock(&input_thread_mutex)!=0)
-- 
GitLab