qmail-rspawn.c
changeset 0 068428edee47
equal deleted inserted replaced
-1:000000000000 0:068428edee47
       
     1 #include "fd.h"
       
     2 #include "wait.h"
       
     3 #include "substdio.h"
       
     4 #include "exit.h"
       
     5 #include "fork.h"
       
     6 #include "error.h"
       
     7 #include "tcpto.h"
       
     8 
       
     9 void initialize(argc,argv)
       
    10 int argc;
       
    11 char **argv;
       
    12 {
       
    13  tcpto_clean();
       
    14 }
       
    15 
       
    16 int truncreport = 0;
       
    17 
       
    18 void report(ss,wstat,s,len)
       
    19 substdio *ss;
       
    20 int wstat;
       
    21 char *s;
       
    22 int len;
       
    23 {
       
    24  int j;
       
    25  int k;
       
    26  int result;
       
    27  int orr;
       
    28 
       
    29  if (wait_crashed(wstat))
       
    30   { substdio_puts(ss,"Zqmail-remote crashed.\n"); return; }
       
    31  switch(wait_exitcode(wstat))
       
    32   {
       
    33    case 0: break;
       
    34    case 111: substdio_puts(ss,"ZUnable to run qmail-remote.\n"); return;
       
    35    default: substdio_puts(ss,"DUnable to run qmail-remote.\n"); return;
       
    36   }
       
    37  if (!len)
       
    38   { substdio_puts(ss,"Zqmail-remote produced no output.\n"); return; }
       
    39 
       
    40  result = -1;
       
    41  j = 0;
       
    42  for (k = 0;k < len;++k)
       
    43    if (!s[k])
       
    44     {
       
    45      if (s[j] == 'K') { result = 1; break; }
       
    46      if (s[j] == 'Z') { result = 0; break; }
       
    47      if (s[j] == 'D') break;
       
    48      j = k + 1;
       
    49     }
       
    50 
       
    51  orr = result;
       
    52  switch(s[0])
       
    53   {
       
    54    case 's': orr = 0; break;
       
    55    case 'h': orr = -1;
       
    56   }
       
    57 
       
    58  switch(orr)
       
    59   {
       
    60    case 1: substdio_put(ss,"K",1); break;
       
    61    case 0: substdio_put(ss,"Z",1); break;
       
    62    case -1: substdio_put(ss,"D",1); break;
       
    63   }
       
    64 
       
    65  for (k = 1;k < len;)
       
    66    if (!s[k++])
       
    67     {
       
    68      substdio_puts(ss,s + 1);
       
    69      if (result <= orr)
       
    70        if (k < len)
       
    71 	 switch(s[k])
       
    72 	  {
       
    73 	   case 'Z': case 'D': case 'K':
       
    74              substdio_puts(ss,s + k + 1);
       
    75 	  }
       
    76      break;
       
    77     }
       
    78 }
       
    79 
       
    80 int spawn(fdmess,fdout,s,r,at)
       
    81 int fdmess; int fdout;
       
    82 char *s; char *r; int at;
       
    83 {
       
    84  int f;
       
    85  char *(args[5]);
       
    86 
       
    87  args[0] = "qmail-remote";
       
    88  args[1] = r + at + 1;
       
    89  args[2] = s;
       
    90  args[3] = r;
       
    91  args[4] = 0;
       
    92 
       
    93  if (!(f = vfork()))
       
    94   {
       
    95    if (fd_move(0,fdmess) == -1) _exit(111);
       
    96    if (fd_move(1,fdout) == -1) _exit(111);
       
    97    if (fd_copy(2,1) == -1) _exit(111);
       
    98    execvp(*args,args);
       
    99    if (error_temp(errno)) _exit(111);
       
   100    _exit(100);
       
   101   }
       
   102  return f;
       
   103 }