|
0
|
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 |
}
|