LCOV - code coverage report
Current view: top level - src - run_script.c (source / functions) Hit Total Coverage
Test: burp-coverage-clean.info Lines: 0 83 0.0 %
Date: 2016-05-01 Functions: 0 5 0.0 %

          Line data    Source code
       1             : #include "burp.h"
       2             : #include "alloc.h"
       3             : #include "asfd.h"
       4             : #include "conf.h"
       5             : #include "fzp.h"
       6             : #include "forkchild.h"
       7             : #include "handy.h"
       8             : #include "log.h"
       9             : #include "strlist.h"
      10             : 
      11             : #ifndef HAVE_WIN32
      12             : 
      13           0 : static int log_script_output(struct asfd *asfd, struct fzp **fzp,
      14             :         struct conf **confs,
      15             :         int do_logp, int log_remote, int is_stderr, char **logbuf)
      16             : {
      17           0 :         char buf[256]="";
      18           0 :         if(!fzp || !*fzp) return 0;
      19           0 :         if(fzp_gets(*fzp, buf, sizeof(buf)))
      20             :         {
      21           0 :                 if(logbuf && astrcat(logbuf, buf, __func__)) return -1;
      22           0 :                 if(log_remote)
      23             :                 {
      24             :                         // logm and low will also log to stdout.
      25           0 :                         if(is_stderr) logw(asfd, confs?get_cntr(confs):NULL,
      26           0 :                                 "%s", buf);
      27           0 :                         else logm(asfd, confs, "%s", buf);
      28             :                 }
      29             :                 else
      30             :                 {
      31             :                         // logc does not print a prefix
      32           0 :                         if(do_logp) logp("%s", buf);
      33           0 :                         else logc("%s", buf);
      34             :                 }
      35             :         }
      36           0 :         if(fzp_eof(*fzp)) fzp_close(fzp);
      37             :         return 0;
      38             : }
      39             : 
      40             : static int got_sigchld=0;
      41             : static int run_script_status=-1;
      42             : 
      43           0 : static void run_script_sigchld_handler(int sig)
      44             : {
      45             :         //printf("in run_script_sigchld_handler\n");
      46           0 :         got_sigchld=1;
      47           0 :         run_script_status=-1;
      48           0 :         waitpid(-1, &run_script_status, 0);
      49           0 : }
      50             : 
      51           0 : static int run_script_select(struct asfd *asfd,
      52             :         struct fzp **sout, struct fzp **serr,
      53             :         struct conf **confs, int do_logp, int log_remote, char **logbuf)
      54             : {
      55           0 :         int mfd=-1;
      56             :         fd_set fsr;
      57             :         struct timeval tval;
      58           0 :         int soutfd=fzp_fileno(*sout);
      59           0 :         int serrfd=fzp_fileno(*serr);
      60           0 :         fzp_setlinebuf(*sout);
      61           0 :         fzp_setlinebuf(*serr);
      62           0 :         set_non_blocking(soutfd);
      63           0 :         set_non_blocking(serrfd);
      64             : 
      65             :         while(1)
      66             :         {
      67           0 :                 mfd=-1;
      68           0 :                 FD_ZERO(&fsr);
      69           0 :                 if(*sout) add_fd_to_sets(soutfd, &fsr, NULL, NULL, &mfd);
      70           0 :                 if(*serr) add_fd_to_sets(serrfd, &fsr, NULL, NULL, &mfd);
      71           0 :                 tval.tv_sec=1;
      72           0 :                 tval.tv_usec=0;
      73           0 :                 if(select(mfd+1, &fsr, NULL, NULL, &tval)<0)
      74             :                 {
      75           0 :                         if(errno!=EAGAIN && errno!=EINTR)
      76             :                         {
      77             :                                 logp("%s error: %s\n", __func__,
      78           0 :                                         strerror(errno));
      79           0 :                                 return -1;
      80             :                         }
      81             :                 }
      82           0 :                 if(FD_ISSET(soutfd, &fsr))
      83             :                 {
      84           0 :                         if(log_script_output(asfd, sout, confs,
      85           0 :                                 do_logp, log_remote, 0, logbuf)) return -1;
      86             :                 }
      87           0 :                 if(FD_ISSET(serrfd, &fsr))
      88             :                 {
      89           0 :                         if(log_script_output(asfd, serr, confs,
      90           0 :                                 do_logp, log_remote, 1, logbuf)) return -1;
      91             :                 }
      92             : 
      93           0 :                 if(!*sout && !*serr && got_sigchld)
      94             :                 {
      95             :                         //fclose(*sout); *sout=NULL;
      96             :                         //fclose(*serr); *serr=NULL;
      97           0 :                         got_sigchld=0;
      98           0 :                         return 0;
      99             :                 }
     100             :         }
     101             : 
     102             :         // Never get here.
     103             :         return -1;
     104             : }
     105             : 
     106             : #endif
     107             : 
     108           0 : int run_script_to_buf(struct asfd *asfd,
     109             :         const char **args, struct strlist *userargs, struct conf **confs,
     110             :         int do_wait, int do_logp, int log_remote, char **logbuf)
     111             : {
     112           0 :         int a=0;
     113           0 :         int l=0;
     114             :         pid_t p;
     115           0 :         struct fzp *serr=NULL;
     116           0 :         struct fzp *sout=NULL;
     117           0 :         char *cmd[64]={ NULL };
     118             :         struct strlist *sl;
     119             : #ifndef HAVE_WIN32
     120           0 :         struct cntr *cntr=NULL;
     121           0 :         int s=0;
     122             : #endif
     123           0 :         if(!args || !args[0]) return 0;
     124             : 
     125           0 :         for(a=0; args[a]; a++) cmd[l++]=(char *)args[a];
     126           0 :         for(sl=userargs; sl; sl=sl->next) cmd[l++]=sl->path;
     127           0 :         cmd[l++]=NULL;
     128             : 
     129             : #ifndef HAVE_WIN32
     130           0 :         setup_signal(SIGCHLD, run_script_sigchld_handler);
     131             : #endif
     132             : 
     133           0 :         fflush(stdout); fflush(stderr);
     134           0 :         if(do_wait)
     135             :         {
     136           0 :                 if((p=forkchild(NULL,
     137           0 :                         &sout, &serr, cmd[0], cmd))==-1) return -1;
     138             :         }
     139             :         else
     140             :         {
     141           0 :                 if((p=forkchild_no_wait(NULL,
     142           0 :                         &sout, &serr, cmd[0], cmd))==-1) return -1;
     143           0 :                 return 0;
     144             :         }
     145             : #ifdef HAVE_WIN32
     146             :         // My windows forkchild currently just executes, then returns.
     147             :         return 0;
     148             : #else
     149             :         s=run_script_select(asfd, &sout, &serr,
     150           0 :                 confs, do_logp, log_remote, logbuf);
     151             : 
     152             :         // Set SIGCHLD back to default.
     153           0 :         setup_signal(SIGCHLD, SIG_DFL);
     154             : 
     155           0 :         if(s) return -1;
     156             : 
     157           0 :         if(confs) cntr=get_cntr(confs);
     158             : 
     159           0 :         if(WIFEXITED(run_script_status))
     160             :         {
     161           0 :                 int ret=WEXITSTATUS(run_script_status);
     162           0 :                 logp("%s returned: %d\n", cmd[0], ret);
     163           0 :                 if(log_remote && confs && ret)
     164           0 :                         logw(asfd, cntr, "%s returned: %d\n", cmd[0], ret);
     165           0 :                 return ret;
     166             :         }
     167           0 :         else if(WIFSIGNALED(run_script_status))
     168             :         {
     169             :                 logp("%s terminated on signal %d\n",
     170           0 :                         cmd[0], WTERMSIG(run_script_status));
     171           0 :                 if(log_remote && confs)
     172             :                         logw(asfd, cntr, "%s terminated on signal %d\n",
     173           0 :                                 cmd[0], WTERMSIG(run_script_status));
     174             :         }
     175             :         else
     176             :         {
     177           0 :                 logp("Strange return when trying to run %s\n", cmd[0]);
     178           0 :                 if(log_remote && confs) logw(asfd, cntr,
     179           0 :                         "Strange return when trying to run %s\n", cmd[0]);
     180             :         }
     181             :         return -1;
     182             : #endif
     183             : }
     184             : 
     185           0 : int run_script(struct asfd *asfd, const char **args, struct strlist *userargs,
     186             :         struct conf **confs, int do_wait, int do_logp, int log_remote)
     187             : {
     188             :         return run_script_to_buf(asfd, args, userargs, confs, do_wait,
     189           0 :                 do_logp, log_remote, NULL /* do not save output to buffer */);
     190             : }

Generated by: LCOV version 1.10