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-07-02 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             :         // FIX THIS: convert to asfd?
      61           0 :         fzp_setlinebuf(*sout);
      62           0 :         fzp_setlinebuf(*serr);
      63           0 :         set_non_blocking(soutfd);
      64           0 :         set_non_blocking(serrfd);
      65             : 
      66             :         while(1)
      67             :         {
      68           0 :                 mfd=-1;
      69           0 :                 FD_ZERO(&fsr);
      70           0 :                 if(*sout) add_fd_to_sets(soutfd, &fsr, NULL, NULL, &mfd);
      71           0 :                 if(*serr) add_fd_to_sets(serrfd, &fsr, NULL, NULL, &mfd);
      72           0 :                 tval.tv_sec=1;
      73           0 :                 tval.tv_usec=0;
      74           0 :                 if(select(mfd+1, &fsr, NULL, NULL, &tval)<0)
      75             :                 {
      76           0 :                         if(errno!=EAGAIN && errno!=EINTR)
      77             :                         {
      78             :                                 logp("%s error: %s\n", __func__,
      79           0 :                                         strerror(errno));
      80           0 :                                 return -1;
      81             :                         }
      82             :                 }
      83           0 :                 if(FD_ISSET(soutfd, &fsr))
      84             :                 {
      85           0 :                         if(log_script_output(asfd, sout, confs,
      86           0 :                                 do_logp, log_remote, 0, logbuf)) return -1;
      87             :                 }
      88           0 :                 if(FD_ISSET(serrfd, &fsr))
      89             :                 {
      90           0 :                         if(log_script_output(asfd, serr, confs,
      91           0 :                                 do_logp, log_remote, 1, logbuf)) return -1;
      92             :                 }
      93             : 
      94           0 :                 if(!*sout && !*serr && got_sigchld)
      95             :                 {
      96             :                         //fclose(*sout); *sout=NULL;
      97             :                         //fclose(*serr); *serr=NULL;
      98           0 :                         got_sigchld=0;
      99           0 :                         return 0;
     100             :                 }
     101             :         }
     102             : 
     103             :         // Never get here.
     104             :         return -1;
     105             : }
     106             : 
     107             : #endif
     108             : 
     109           0 : int run_script_to_buf(struct asfd *asfd,
     110             :         const char **args, struct strlist *userargs, struct conf **confs,
     111             :         int do_wait, int do_logp, int log_remote, char **logbuf)
     112             : {
     113           0 :         int a=0;
     114           0 :         int l=0;
     115             :         pid_t p;
     116           0 :         struct fzp *serr=NULL;
     117           0 :         struct fzp *sout=NULL;
     118           0 :         char *cmd[64]={ NULL };
     119             :         struct strlist *sl;
     120             : #ifndef HAVE_WIN32
     121           0 :         struct cntr *cntr=NULL;
     122           0 :         int s=0;
     123             : #endif
     124           0 :         if(!args || !args[0]) return 0;
     125             : 
     126           0 :         for(a=0; args[a]; a++) cmd[l++]=(char *)args[a];
     127           0 :         for(sl=userargs; sl; sl=sl->next) cmd[l++]=sl->path;
     128           0 :         cmd[l++]=NULL;
     129             : 
     130             : #ifndef HAVE_WIN32
     131           0 :         setup_signal(SIGCHLD, run_script_sigchld_handler);
     132             : #endif
     133             : 
     134           0 :         fflush(stdout); fflush(stderr);
     135           0 :         if(do_wait)
     136             :         {
     137           0 :                 if((p=forkchild(NULL,
     138           0 :                         &sout, &serr, cmd[0], cmd))==-1) return -1;
     139             :         }
     140             :         else
     141             :         {
     142           0 :                 if((p=forkchild_no_wait(NULL,
     143           0 :                         &sout, &serr, cmd[0], cmd))==-1) return -1;
     144           0 :                 return 0;
     145             :         }
     146             : #ifdef HAVE_WIN32
     147             :         // My windows forkchild currently just executes, then returns.
     148             :         return 0;
     149             : #else
     150             :         s=run_script_select(asfd, &sout, &serr,
     151           0 :                 confs, do_logp, log_remote, logbuf);
     152             : 
     153             :         // Set SIGCHLD back to default.
     154           0 :         setup_signal(SIGCHLD, SIG_DFL);
     155             : 
     156           0 :         if(s) return -1;
     157             : 
     158           0 :         if(confs) cntr=get_cntr(confs);
     159             : 
     160           0 :         if(WIFEXITED(run_script_status))
     161             :         {
     162           0 :                 int ret=WEXITSTATUS(run_script_status);
     163           0 :                 logp("%s returned: %d\n", cmd[0], ret);
     164           0 :                 if(log_remote && confs && ret)
     165           0 :                         logw(asfd, cntr, "%s returned: %d\n", cmd[0], ret);
     166           0 :                 return ret;
     167             :         }
     168           0 :         else if(WIFSIGNALED(run_script_status))
     169             :         {
     170             :                 logp("%s terminated on signal %d\n",
     171           0 :                         cmd[0], WTERMSIG(run_script_status));
     172           0 :                 if(log_remote && confs)
     173             :                         logw(asfd, cntr, "%s terminated on signal %d\n",
     174           0 :                                 cmd[0], WTERMSIG(run_script_status));
     175             :         }
     176             :         else
     177             :         {
     178           0 :                 logp("Strange return when trying to run %s\n", cmd[0]);
     179           0 :                 if(log_remote && confs) logw(asfd, cntr,
     180           0 :                         "Strange return when trying to run %s\n", cmd[0]);
     181             :         }
     182             :         return -1;
     183             : #endif
     184             : }
     185             : 
     186           0 : int run_script(struct asfd *asfd, const char **args, struct strlist *userargs,
     187             :         struct conf **confs, int do_wait, int do_logp, int log_remote)
     188             : {
     189             :         return run_script_to_buf(asfd, args, userargs, confs, do_wait,
     190           0 :                 do_logp, log_remote, NULL /* do not save output to buffer */);
     191             : }

Generated by: LCOV version 1.10