diff options
Diffstat (limited to 'qmail-rspawn.c')
| -rw-r--r-- | qmail-rspawn.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/qmail-rspawn.c b/qmail-rspawn.c new file mode 100644 index 0000000..9d838e6 --- /dev/null +++ b/qmail-rspawn.c | |||
| @@ -0,0 +1,103 @@ | |||
| 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 | } | ||
