Skip to content
Snippets Groups Projects
Commit bfb7b4f4 authored by deuce's avatar deuce
Browse files

Redirect stderr to stdout unless XTRN_LOG_STDERR is defined during

compile.
parent 4156a4b3
No related branches found
No related tags found
No related merge requests found
...@@ -1589,10 +1589,12 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) ...@@ -1589,10 +1589,12 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
input_thread_mutex_locked=true; input_thread_mutex_locked=true;
} }
#ifdef XTERN_LOG_STDERR
if(pipe(err_pipe)!=0) { if(pipe(err_pipe)!=0) {
errormsg(WHERE,ERR_CREATE,"err_pipe",0); errormsg(WHERE,ERR_CREATE,"err_pipe",0);
return(-1); return(-1);
} }
#endif
if((mode&EX_INR) && (mode&EX_OUTR)) { if((mode&EX_INR) && (mode&EX_OUTR)) {
struct winsize winsize; struct winsize winsize;
...@@ -1694,7 +1696,9 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) ...@@ -1694,7 +1696,9 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
if(mode&EX_OUTR && !(mode&EX_INR)) { if(mode&EX_OUTR && !(mode&EX_INR)) {
close(out_pipe[0]); /* close read-end of pipe */ close(out_pipe[0]); /* close read-end of pipe */
dup2(out_pipe[1],1); /* stdout */ 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 */ 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) ...@@ -1704,8 +1708,10 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
daemon(TRUE,FALSE); daemon(TRUE,FALSE);
} }
#ifdef XTERN_LOG_STDERR
close(err_pipe[0]); /* close read-end of pipe */ close(err_pipe[0]); /* close read-end of pipe */
dup2(err_pipe[1],2); /* stderr */ dup2(err_pipe[1],2); /* stderr */
#endif
execvp(argv[0],argv); execvp(argv[0],argv);
sprintf(str,"!ERROR %d executing %s",errno,argv[0]); 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) ...@@ -1720,7 +1726,9 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
if(!(mode&EX_OFFLINE)) if(!(mode&EX_OFFLINE))
rio_abortable=false; rio_abortable=false;
#ifdef XTERN_LOG_STDERR
close(err_pipe[1]); /* close write-end of pipe */ close(err_pipe[1]); /* close write-end of pipe */
#endif
if(mode&EX_OUTR) { if(mode&EX_OUTR) {
if(!(mode&EX_INR)) if(!(mode&EX_INR))
...@@ -1746,15 +1754,22 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) ...@@ -1746,15 +1754,22 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
/* Error Output */ /* Error Output */
FD_ZERO(&ibits); FD_ZERO(&ibits);
#ifdef XTERN_LOG_STDERR
FD_SET(err_pipe[0],&ibits); FD_SET(err_pipe[0],&ibits);
high_fd=err_pipe[0]; high_fd=err_pipe[0];
#endif
FD_SET(out_pipe[0],&ibits); FD_SET(out_pipe[0],&ibits);
#ifdef XTERN_LOG_STDERR
if(out_pipe[0]>err_pipe[0]) if(out_pipe[0]>err_pipe[0])
high_fd=out_pipe[0]; high_fd=out_pipe[0];
#endif
timeout.tv_sec=0; timeout.tv_sec=0;
timeout.tv_usec=1000; timeout.tv_usec=1000;
bp=buf; bp=buf;
i=0; 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)) { 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) { if((rd=read(err_pipe[0],bp,1))>0) {
i+=rd; i+=rd;
...@@ -1778,17 +1793,9 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) ...@@ -1778,17 +1793,9 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
bp=buf; bp=buf;
i=0; 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); data_waiting=FD_ISSET(out_pipe[0],&ibits);
#endif
if(i==0 && data_waiting==0) if(i==0 && data_waiting==0)
continue; continue;
...@@ -1863,31 +1870,32 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) ...@@ -1863,31 +1870,32 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
/* Enable the Nagle algorithm */ /* Enable the Nagle algorithm */
int nodelay=FALSE; int nodelay=FALSE;
setsockopt(client_socket,IPPROTO_TCP,TCP_NODELAY,(char*)&nodelay,sizeof(nodelay)); setsockopt(client_socket,IPPROTO_TCP,TCP_NODELAY,(char*)&nodelay,sizeof(nodelay));
} while(waitpid(pid, &i, WNOHANG)==0) {
#ifdef XTERN_LOG_STDERR
while(waitpid(pid, &i, WNOHANG)==0) { FD_ZERO(&ibits);
FD_ZERO(&ibits); FD_SET(err_pipe[0],&ibits);
FD_SET(err_pipe[0],&ibits); timeout.tv_sec=1;
timeout.tv_sec=1; timeout.tv_usec=0;
timeout.tv_usec=0; bp=buf;
bp=buf; i=0;
i=0; while ((select(err_pipe[0]+1,&ibits,NULL,NULL,&timeout)>0) && (i<XTRN_IO_BUF_LEN-1)) {
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) {
if((rd=read(err_pipe[0],bp,1))>0) { i+=rd;
i+=rd; if(*bp=='\n') {
if(*bp=='\n') { lprintf(LOG_NOTICE,"%.*s",i-1,buf);
lprintf(LOG_NOTICE,"%.*s",i-1,buf); i=0;
i=0; bp=buf;
bp=buf; }
else
bp++;
} }
else else
bp++; break;
} }
else if(i)
break; lprintf(LOG_NOTICE,"%.*s",i,buf);
#endif
} }
if(i)
lprintf(LOG_NOTICE,"%.*s",i,buf);
} }
if(!(mode&EX_OFFLINE)) { /* !off-line execution */ if(!(mode&EX_OFFLINE)) { /* !off-line execution */
...@@ -1909,7 +1917,9 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) ...@@ -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); request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX);
} }
#ifdef XTERN_LOG_STDERR
close(err_pipe[0]); close(err_pipe[0]);
#endif
if(input_thread_mutex_locked && input_thread_running) { if(input_thread_mutex_locked && input_thread_running) {
if(pthread_mutex_unlock(&input_thread_mutex)!=0) if(pthread_mutex_unlock(&input_thread_mutex)!=0)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment