s/qmail 4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
qmail-qmqpd.c
Go to the documentation of this file.
1#include <unistd.h>
2#include "auto_qmail.h"
3#include "qmail.h"
4#include "received.h"
5#include "sig.h"
6#include "buffer.h"
7#include "exit.h"
8#include "now.h"
9#include "fmt.h"
10#include "env.h"
11#include "case.h"
12#include "byte.h"
13#include "ip.h"
14#include "str.h"
15
16#define PORT_QMQP "628"
17
18void resources() { _exit(111); }
19
20ssize_t safewrite(int fd,char *buf,int len)
21{
22 int r;
23 r = write(fd,buf,len);
24 if (r <= 0) _exit(0);
25 return r;
26}
27
28ssize_t saferead(int fd,char *buf,int len)
29{
30 int r;
31 r = read(fd,buf,len);
32 if (r <= 0) _exit(0);
33 return r;
34}
35
36char inbuf[512];
37buffer bi = BUFFER_INIT(saferead,0,inbuf,sizeof(inbuf));
38char outbuf[256];
39buffer bo = BUFFER_INIT(safewrite,1,outbuf,sizeof(outbuf));
40
41unsigned long bytesleft = 100;
42
43void getbyte(char *ch)
44{
45 if (!bytesleft--) _exit(100);
46 buffer_get(&bi,ch,1);
47}
48
49unsigned long getlen()
50{
51 unsigned long len = 0;
52 char ch;
53
54 for (;;) {
55 getbyte(&ch);
56 if (ch == ':') return len;
57 if (len > 200000000) resources();
58 len = 10 * len + (ch - '0');
59 }
60}
61
63{
64 char ch;
65 getbyte(&ch);
66 if (ch != ',') _exit(100);
67}
68
69struct qmail qq;
70
72{
73 char *remotehost;
74 char *remoteinfo;
75 char *remoteip;
76 char *local;
77 char *localport;
78
79 remotehost = env_get("TCP6REMOTEHOST");
80 if (!remotehost) remotehost = env_get("TCPREMOTEHOST");
81 if (!remotehost) remotehost = "unknown";
82 remoteinfo = env_get("TCP6REMOTEINFO");
83 if (!remoteinfo) remoteinfo = env_get("TCPREMOTEINFO");
84 remoteip = env_get("TCP6REMOTEIP");
85 if (remoteip && byte_equal(remoteip,7,V4MAPPREFIX)) remoteip=remoteip+7;
86 if (!remoteip) remoteip = env_get("TCPREMOTEIP");
87 if (!remoteip) remoteip = "unknown";
88 local = env_get("TCP6LOCALHOST");
89 if (!local) local = env_get("TCPLOCALHOST");
90 if (!local) local = env_get("TCP6LOCALIP");
91 if (!local) local = env_get("TCPLOCALIP");
92 if (!local) local = "unknown";
93 localport = env_get("TCP6LOCALPORT");
94 if (!localport) localport = env_get("TCPLOCALPORT");
95 if (!localport) localport = "0";
96
97 received(&qq,"QMQP",local,remoteip,remotehost,remoteinfo,(char *) 0,(char *) 0,(char *) 0);
98}
99
100char buf[1000];
101char strnum[FMT_ULONG];
102
104{
105 unsigned long len;
106 int i;
107
108 len = getlen();
109 if (len >= 1000) {
110 for (i = 0; i < len; ++i) getbyte(buf);
111 getcomma();
112 buf[0] = 0;
113 return 0;
114 }
115
116 for (i = 0; i < len; ++i) getbyte(buf + i);
117 getcomma();
118 buf[len] = 0;
119 return byte_chr(buf,len,'\0') == len;
120}
121
122int flagok = 1;
123
124int main()
125{
126 char *result;
127 unsigned long qp;
128 unsigned long len;
129 char ch;
130
131 sig_pipeignore();
132 sig_alarmcatch(resources);
133 alarm(3600);
134
135 bytesleft = getlen();
136
137 len = getlen();
138
139 if (chdir(auto_qmail) == -1) resources();
140 if (qmail_open(&qq) == -1) resources();
141 qp = qmail_qp(&qq);
142 identify();
143
144 while (len > 0) { /* XXX: could speed this up */
145 getbyte(&ch);
146 --len;
147 qmail_put(&qq,&ch,1);
148 }
149 getcomma();
150
151 if (getbuf())
152 qmail_from(&qq,buf);
153 else {
154 qmail_from(&qq,"");
155 qmail_fail(&qq);
156 flagok = 0;
157 }
158
159 while (bytesleft)
160 if (getbuf())
161 qmail_to(&qq,buf);
162 else {
163 qmail_fail(&qq);
164 flagok = 0;
165 }
166
167 bytesleft = 1;
168 getcomma();
169
170 result = qmail_close(&qq);
171
172 if (!*result) {
173 len = fmt_str(buf,"Kok ");
174 len += fmt_ulong(buf + len,(unsigned long) now());
175 len += fmt_str(buf + len," qp ");
176 len += fmt_ulong(buf + len,qp);
177 buf[len] = 0;
178 result = buf;
179 }
180
181 if (!flagok)
182 result = "Dsorry, I can't accept addresses like that (#5.1.3)";
183
184 buffer_put(&bo,strnum,fmt_ulong(strnum,(unsigned long) str_len(result)));
185 buffer_puts(&bo,":");
186 buffer_puts(&bo,result);
187 buffer_puts(&bo,",");
188 buffer_flush(&bo);
189 _exit(0);
190}
char auto_qmail[]
void _exit()
char qp[FMT_ULONG]
Definition: fastforward.c:53
datetime_sec now()
Definition: now.c:5
int fd
char * local
Definition: qmail-getpw.c:18
char * remoteip
Definition: qmail-popup.c:71
char * localport
Definition: qmail-popup.c:70
ssize_t saferead(int fd, char *buf, int len)
Definition: qmail-qmqpd.c:28
void getbyte(char *ch)
Definition: qmail-qmqpd.c:43
char strnum[FMT_ULONG]
Definition: qmail-qmqpd.c:101
void identify()
Definition: qmail-qmqpd.c:71
void getcomma()
Definition: qmail-qmqpd.c:62
unsigned long bytesleft
Definition: qmail-qmqpd.c:41
int getbuf()
Definition: qmail-qmqpd.c:103
int flagok
Definition: qmail-qmqpd.c:122
char inbuf[512]
Definition: qmail-qmqpd.c:36
buffer bi
Definition: qmail-qmqpd.c:37
char outbuf[256]
Definition: qmail-qmqpd.c:38
char buf[1000]
Definition: qmail-qmqpd.c:100
void resources()
Definition: qmail-qmqpd.c:18
buffer bo
Definition: qmail-qmqpd.c:39
int main()
Definition: qmail-qmqpd.c:124
unsigned long getlen()
Definition: qmail-qmqpd.c:49
struct qmail qq
Definition: qmail-qmqpd.c:69
char * remoteinfo
Definition: qmail-qmtpd.c:80
char * received
Definition: qmail-queue.c:67
void qmail_to(struct qmail *, char *)
Definition: qmail.c:83
void qmail_from(struct qmail *, char *)
Definition: qmail.c:73
void qmail_put(struct qmail *, char *, int)
Definition: qmail.c:63
char * qmail_close(struct qmail *)
Definition: qmail.c:90
unsigned long qmail_qp(struct qmail *)
Definition: qmail.c:53
int qmail_open(struct qmail *)
Definition: qmail.c:21
void qmail_fail(struct qmail *)
Definition: qmail.c:58
ssize_t safewrite()
Definition: qmail.h:6
stralloc remotehost
Definition: qmail-popup.c:72
void write()