Commit | Line | Data |
---|---|---|
212b6f5d MW |
1 | #include "auto_qmail.h" |
2 | #include "qmail.h" | |
3 | #include "received.h" | |
4 | #include "sig.h" | |
5 | #include "substdio.h" | |
6 | #include "readwrite.h" | |
7 | #include "exit.h" | |
8 | #include "now.h" | |
9 | #include "fmt.h" | |
10 | #include "env.h" | |
11 | ||
12 | void resources() { _exit(111); } | |
13 | ||
14 | int safewrite(fd,buf,len) int fd; char *buf; int len; | |
15 | { | |
16 | int r; | |
17 | r = write(fd,buf,len); | |
18 | if (r <= 0) _exit(0); | |
19 | return r; | |
20 | } | |
21 | int saferead(fd,buf,len) int fd; char *buf; int len; | |
22 | { | |
23 | int r; | |
24 | r = read(fd,buf,len); | |
25 | if (r <= 0) _exit(0); | |
26 | return r; | |
27 | } | |
28 | ||
29 | char ssinbuf[512]; | |
30 | substdio ssin = SUBSTDIO_FDBUF(saferead,0,ssinbuf,sizeof ssinbuf); | |
31 | char ssoutbuf[256]; | |
32 | substdio ssout = SUBSTDIO_FDBUF(safewrite,1,ssoutbuf,sizeof ssoutbuf); | |
33 | ||
34 | unsigned long bytesleft = 100; | |
35 | ||
36 | void getbyte(ch) | |
37 | char *ch; | |
38 | { | |
39 | if (!bytesleft--) _exit(100); | |
40 | substdio_get(&ssin,ch,1); | |
41 | } | |
42 | ||
43 | unsigned long getlen() | |
44 | { | |
45 | unsigned long len = 0; | |
46 | char ch; | |
47 | ||
48 | for (;;) { | |
49 | getbyte(&ch); | |
50 | if (ch == ':') return len; | |
51 | if (len > 200000000) resources(); | |
52 | len = 10 * len + (ch - '0'); | |
53 | } | |
54 | } | |
55 | ||
56 | void getcomma() | |
57 | { | |
58 | char ch; | |
59 | getbyte(&ch); | |
60 | if (ch != ',') _exit(100); | |
61 | } | |
62 | ||
63 | struct qmail qq; | |
64 | ||
65 | void identify() | |
66 | { | |
67 | char *remotehost; | |
68 | char *remoteinfo; | |
69 | char *remoteip; | |
70 | char *local; | |
71 | ||
72 | remotehost = env_get("TCPREMOTEHOST"); | |
73 | if (!remotehost) remotehost = "unknown"; | |
74 | remoteinfo = env_get("TCPREMOTEINFO"); | |
75 | remoteip = env_get("TCPREMOTEIP"); | |
76 | if (!remoteip) remoteip = "unknown"; | |
77 | local = env_get("TCPLOCALHOST"); | |
78 | if (!local) local = env_get("TCPLOCALIP"); | |
79 | if (!local) local = "unknown"; | |
80 | ||
81 | received(&qq,"QMQP",local,remoteip,remotehost,remoteinfo,(char *) 0); | |
82 | } | |
83 | ||
84 | char buf[1000]; | |
85 | char strnum[FMT_ULONG]; | |
86 | ||
87 | int getbuf() | |
88 | { | |
89 | unsigned long len; | |
90 | int i; | |
91 | ||
92 | len = getlen(); | |
93 | if (len >= 1000) { | |
94 | for (i = 0;i < len;++i) getbyte(buf); | |
95 | getcomma(); | |
96 | buf[0] = 0; | |
97 | return 0; | |
98 | } | |
99 | ||
100 | for (i = 0;i < len;++i) getbyte(buf + i); | |
101 | getcomma(); | |
102 | buf[len] = 0; | |
103 | return byte_chr(buf,len,'\0') == len; | |
104 | } | |
105 | ||
106 | int flagok = 1; | |
107 | ||
108 | main() | |
109 | { | |
110 | char *result; | |
111 | unsigned long qp; | |
112 | unsigned long len; | |
113 | char ch; | |
114 | ||
115 | sig_pipeignore(); | |
116 | sig_alarmcatch(resources); | |
117 | alarm(3600); | |
118 | ||
119 | bytesleft = getlen(); | |
120 | ||
121 | len = getlen(); | |
122 | ||
123 | if (chdir(auto_qmail) == -1) resources(); | |
124 | if (qmail_open(&qq) == -1) resources(); | |
125 | qp = qmail_qp(&qq); | |
126 | identify(); | |
127 | ||
128 | while (len > 0) { /* XXX: could speed this up */ | |
129 | getbyte(&ch); | |
130 | --len; | |
131 | qmail_put(&qq,&ch,1); | |
132 | } | |
133 | getcomma(); | |
134 | ||
135 | if (getbuf()) | |
136 | qmail_from(&qq,buf); | |
137 | else { | |
138 | qmail_from(&qq,""); | |
139 | qmail_fail(&qq); | |
140 | flagok = 0; | |
141 | } | |
142 | ||
143 | while (bytesleft) | |
144 | if (getbuf()) | |
145 | qmail_to(&qq,buf); | |
146 | else { | |
147 | qmail_fail(&qq); | |
148 | flagok = 0; | |
149 | } | |
150 | ||
151 | bytesleft = 1; | |
152 | getcomma(); | |
153 | ||
154 | result = qmail_close(&qq); | |
155 | ||
156 | if (!*result) { | |
157 | len = fmt_str(buf,"Kok "); | |
158 | len += fmt_ulong(buf + len,(unsigned long) now()); | |
159 | len += fmt_str(buf + len," qp "); | |
160 | len += fmt_ulong(buf + len,qp); | |
161 | buf[len] = 0; | |
162 | result = buf; | |
163 | } | |
164 | ||
165 | if (!flagok) | |
166 | result = "Dsorry, I can't accept addresses like that (#5.1.3)"; | |
167 | ||
168 | substdio_put(&ssout,strnum,fmt_ulong(strnum,(unsigned long) str_len(result))); | |
169 | substdio_puts(&ssout,":"); | |
170 | substdio_puts(&ssout,result); | |
171 | substdio_puts(&ssout,","); | |
172 | substdio_flush(&ssout); | |
173 | _exit(0); | |
174 | } |