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
Branches
Tags
No related merge requests found
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment