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