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