qmail-start.c
changeset 0 068428edee47
equal deleted inserted replaced
-1:000000000000 0:068428edee47
       
     1 #include "fd.h"
       
     2 #include "prot.h"
       
     3 #include "exit.h"
       
     4 #include "fork.h"
       
     5 #include "auto_uids.h"
       
     6 
       
     7 char *(qsargs[]) = { "qmail-send", 0 };
       
     8 char *(qcargs[]) = { "qmail-clean", 0 };
       
     9 char *(qlargs[]) = { "qmail-lspawn", "./Mailbox", 0 };
       
    10 char *(qrargs[]) = { "qmail-rspawn", 0 };
       
    11 
       
    12 void die() { _exit(111); }
       
    13 
       
    14 int pi0[2];
       
    15 int pi1[2];
       
    16 int pi2[2];
       
    17 int pi3[2];
       
    18 int pi4[2];
       
    19 int pi5[2];
       
    20 int pi6[2];
       
    21 
       
    22 void close23456() { close(2); close(3); close(4); close(5); close(6); }
       
    23 
       
    24 void closepipes() {
       
    25   close(pi1[0]); close(pi1[1]); close(pi2[0]); close(pi2[1]);
       
    26   close(pi3[0]); close(pi3[1]); close(pi4[0]); close(pi4[1]);
       
    27   close(pi5[0]); close(pi5[1]); close(pi6[0]); close(pi6[1]);
       
    28 }
       
    29 
       
    30 void main(argc,argv)
       
    31 int argc;
       
    32 char **argv;
       
    33 {
       
    34   if (chdir("/") == -1) die();
       
    35   umask(077);
       
    36   if (prot_gid(auto_gidq) == -1) die();
       
    37 
       
    38   if (fd_copy(2,0) == -1) die();
       
    39   if (fd_copy(3,0) == -1) die();
       
    40   if (fd_copy(4,0) == -1) die();
       
    41   if (fd_copy(5,0) == -1) die();
       
    42   if (fd_copy(6,0) == -1) die();
       
    43 
       
    44   if (argv[1]) {
       
    45     qlargs[1] = argv[1];
       
    46     ++argv;
       
    47   }
       
    48 
       
    49   if (argv[1]) {
       
    50     if (pipe(pi0) == -1) die();
       
    51     switch(fork()) {
       
    52       case -1:
       
    53 	die();
       
    54       case 0:
       
    55         if (prot_gid(auto_gidn) == -1) die();
       
    56         if (prot_uid(auto_uidl) == -1) die();
       
    57         close(pi0[1]);
       
    58         if (fd_move(0,pi0[0]) == -1) die();
       
    59         close23456();
       
    60         execvp(argv[1],argv + 1);
       
    61 	die();
       
    62     }
       
    63     close(pi0[0]);
       
    64     if (fd_move(1,pi0[1]) == -1) die();
       
    65   }
       
    66  
       
    67   if (pipe(pi1) == -1) die();
       
    68   if (pipe(pi2) == -1) die();
       
    69   if (pipe(pi3) == -1) die();
       
    70   if (pipe(pi4) == -1) die();
       
    71   if (pipe(pi5) == -1) die();
       
    72   if (pipe(pi6) == -1) die();
       
    73  
       
    74   switch(fork()) {
       
    75     case -1: die();
       
    76     case 0:
       
    77       if (fd_copy(0,pi1[0]) == -1) die();
       
    78       if (fd_copy(1,pi2[1]) == -1) die();
       
    79       close23456();
       
    80       closepipes();
       
    81       execvp(*qlargs,qlargs);
       
    82       die();
       
    83   }
       
    84  
       
    85   switch(fork()) {
       
    86     case -1: die();
       
    87     case 0:
       
    88       if (prot_uid(auto_uidr) == -1) die();
       
    89       if (fd_copy(0,pi3[0]) == -1) die();
       
    90       if (fd_copy(1,pi4[1]) == -1) die();
       
    91       close23456();
       
    92       closepipes();
       
    93       execvp(*qrargs,qrargs);
       
    94       die();
       
    95   }
       
    96  
       
    97   switch(fork()) {
       
    98     case -1: die();
       
    99     case 0:
       
   100       if (prot_uid(auto_uidq) == -1) die();
       
   101       if (fd_copy(0,pi5[0]) == -1) die();
       
   102       if (fd_copy(1,pi6[1]) == -1) die();
       
   103       close23456();
       
   104       closepipes();
       
   105       execvp(*qcargs,qcargs);
       
   106       die();
       
   107   }
       
   108  
       
   109   if (prot_uid(auto_uids) == -1) die();
       
   110   if (fd_copy(0,1) == -1) die();
       
   111   if (fd_copy(1,pi1[1]) == -1) die();
       
   112   if (fd_copy(2,pi2[0]) == -1) die();
       
   113   if (fd_copy(3,pi3[1]) == -1) die();
       
   114   if (fd_copy(4,pi4[0]) == -1) die();
       
   115   if (fd_copy(5,pi5[1]) == -1) die();
       
   116   if (fd_copy(6,pi6[0]) == -1) die();
       
   117   closepipes();
       
   118   execvp(*qsargs,qsargs);
       
   119   die();
       
   120 }