s/qmail 4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
qmail-inject.c
Go to the documentation of this file.
1#include <unistd.h>
2#include "sig.h"
3#include "buffer.h"
4#include "genalloc.h"
5#include "stralloc.h"
6#include "getoptb.h"
7#include "getln.h"
8#include "alloc.h"
9#include "str.h"
10#include "fmt.h"
11#include "hfield.h"
12#include "token822.h"
13#include "control.h"
14#include "env.h"
15#include "qmail.h"
16#include "now.h"
17#include "exit.h"
18#include "error.h"
19#include "quote.h"
20#include "headerbody.h"
21#include "auto_qmail.h"
22#include "newfield.h"
23#include "constmap.h"
24
25#define LINELEN 80
26
28
29char *qmopts;
41
42stralloc control_idhost = {0};
43stralloc control_defaultdomain = {0};
44stralloc control_defaulthost = {0};
45stralloc control_plusdomain = {0};
46
47stralloc sender = {0};
48stralloc envsbuf = {0};
49token822_alloc envs = {0};
51
53struct qmail qqt;
54
55void out(char *s,int len)
56{
57 if (flagqueue) qmail_put(&qqt,s,len);
58 else buffer_putflush(buffer_1,s,len);
59}
60
61void outs(char *s) { out(s,str_len(s)); }
62
63void perm() { _exit(100); }
64void temp() { _exit(111); }
65
66void die_nomem()
67{
68 buffer_putsflush(buffer_2,"qmail-inject: fatal: out of memory\n");
69 temp();
70}
71void die_invalid(stralloc *sa)
72{
73 buffer_putsflush(buffer_2,"qmail-inject: fatal: invalid header field: ");
74 buffer_putflush(buffer_2,sa->s,sa->len);
75 perm();
76}
77void die_qqt()
78{
79 buffer_putsflush(buffer_2,"qmail-inject: fatal: unable to run qmail-queue\n");
80 temp();
81}
82void die_chdir()
83{
84 buffer_putsflush(buffer_2,"qmail-inject: fatal: internal bug\n");
85 temp();
86}
87void die_read()
88{
89 if (errno == ENOMEM) die_nomem();
90 buffer_putsflush(buffer_2,"qmail-inject: fatal: read error\n");
91 temp();
92}
93void doordie(stralloc *sa,int r)
94{
95 if (r == 1) return;
96 if (r == -1) die_nomem();
97 buffer_putsflush(buffer_2,"qmail-inject: fatal: unable to parse this line:\n");
98 buffer_putflush(buffer_2,sa->s,sa->len);
99 perm();
100}
101
102GEN_ALLOC_typedef(saa,stralloc,sa,len,a)
103GEN_ALLOC_readyplus(saa,stralloc,sa,len,a,i,n,x,10,saa_readyplus)
104
105static stralloc sauninit = {0};
106
107saa savedh = {0};
108saa hrlist = {0};
109saa tocclist = {0};
110saa hrrlist = {0};
111saa reciplist = {0};
113
115{
116 char *qqx;
117
118 if (!flagqueue) buffer_flush(buffer_1);
119
120 if (flagqueue) {
121 int i;
122
123 if (!stralloc_0(&sender)) die_nomem();
125
126 for (i = 0; i < reciplist.len; ++i) {
127 if (!stralloc_0(&reciplist.sa[i])) die_nomem();
128 qmail_to(&qqt,reciplist.sa[i].s);
129 }
130 if (flagrh) {
131 if (flagresent) {
132 for (i = 0; i < hrrlist.len; ++i) {
133 if (!stralloc_0(&hrrlist.sa[i])) die_nomem();
134 qmail_to(&qqt,hrrlist.sa[i].s);
135 }
136 } else {
137 for (i = 0; i < hrlist.len; ++i) {
138 if (!stralloc_0(&hrlist.sa[i])) die_nomem();
139 qmail_to(&qqt,hrlist.sa[i].s);
140 }
141 }
142 }
143
144 qqx = qmail_close(&qqt);
145 if (*qqx) {
146 if (*qqx == 'D') {
147 buffer_puts(buffer_2,"qmail-inject: fatal: ");
148 buffer_puts(buffer_2,qqx + 1);
149 buffer_puts(buffer_2,"\n");
150 buffer_flush(buffer_2);
151 perm();
152 } else {
153 buffer_puts(buffer_2,"qmail-inject: fatal: ");
154 buffer_puts(buffer_2,qqx + 1);
155 buffer_puts(buffer_2,"\n");
156 buffer_flush(buffer_2);
157 temp();
158 }
159 }
160 }
161
162 _exit(0);
163}
164
165void savedh_append(stralloc *h)
166{
167 if (!saa_readyplus(&savedh,1)) die_nomem();
168 savedh.sa[savedh.len] = sauninit;
169 if (!stralloc_copy(savedh.sa + savedh.len,h)) die_nomem();
170 ++savedh.len;
171}
172
174{
175 int i;
176
177 for (i = 0; i < savedh.len; ++i)
178 out(savedh.sa[i].s,savedh.sa[i].len);
179}
180
181stralloc defaultdomainbuf = {0};
182token822_alloc defaultdomain = {0};
183stralloc defaulthostbuf = {0};
184token822_alloc defaulthost = {0};
185stralloc plusdomainbuf = {0};
186token822_alloc plusdomain = {0};
187
188void rwroute(token822_alloc *addr)
189{
190 if (addr->t[addr->len - 1].type == TOKEN822_AT)
191 while (addr->len)
192 if (addr->t[--addr->len].type == TOKEN822_COLON)
193 return;
194}
195
196void rwextraat(token822_alloc *addr)
197{
198 int i;
199
200 if (addr->t[0].type == TOKEN822_AT) {
201 --addr->len;
202 for (i = 0; i < addr->len; ++i)
203 addr->t[i] = addr->t[i + 1];
204 }
205}
206
207void rwextradot(token822_alloc *addr)
208{
209 int i;
210
211 if (addr->t[0].type == TOKEN822_DOT) {
212 --addr->len;
213 for (i = 0; i < addr->len; ++i)
214 addr->t[i] = addr->t[i + 1];
215 }
216}
217
218void rwnoat(token822_alloc *addr)
219{
220 int i;
221 int shift;
222
223 for (i = 0; i < addr->len; ++i)
224 if (addr->t[i].type == TOKEN822_AT)
225 return;
226 shift = defaulthost.len;
227 if (!token822_readyplus(addr,shift)) die_nomem();
228 for (i = addr->len - 1; i >= 0; --i)
229 addr->t[i + shift] = addr->t[i];
230
231 addr->len += shift;
232
233 for (i = 0; i < shift; ++i)
234 addr->t[i] = defaulthost.t[shift - 1 - i];
235}
236
237void rwnodot(token822_alloc *addr)
238{
239 int i;
240 int shift;
241
242 for (i = 0; i < addr->len; ++i) {
243 if (addr->t[i].type == TOKEN822_DOT)
244 return;
245 if (addr->t[i].type == TOKEN822_AT)
246 break;
247 }
248 for (i = 0; i < addr->len; ++i) {
249 if (addr->t[i].type == TOKEN822_LITERAL)
250 return;
251 if (addr->t[i].type == TOKEN822_AT)
252 break;
253 }
254 shift = defaultdomain.len;
255 if (!token822_readyplus(addr,shift)) die_nomem();
256
257 for (i = addr->len - 1; i >= 0; --i)
258 addr->t[i + shift] = addr->t[i];
259
260 addr->len += shift;
261
262 for (i = 0; i < shift; ++i)
263 addr->t[i] = defaultdomain.t[shift - 1 - i];
264}
265
266void rwplus(token822_alloc *addr)
267{
268 int i;
269 int shift;
270
271 if (addr->t[0].type != TOKEN822_ATOM) return;
272 if (!addr->t[0].slen) return;
273 if (addr->t[0].s[addr->t[0].slen - 1] != '+') return;
274
275 --addr->t[0].slen; /* remove + */
276
277 shift = plusdomain.len;
278 if (!token822_readyplus(addr,shift)) die_nomem();
279
280 for (i = addr->len - 1; i >= 0; --i)
281 addr->t[i + shift] = addr->t[i];
282
283 addr->len += shift;
284
285 for (i = 0; i < shift; ++i)
286 addr->t[i] = plusdomain.t[shift - 1 - i];
287}
288
289void rwgeneric(token822_alloc *addr)
290{
291 if (!addr->len) return; /* don't rewrite <> */
292 if (addr->len >= 2)
293 if (addr->t[1].type == TOKEN822_AT)
294 if (addr->t[0].type == TOKEN822_LITERAL)
295 if (!addr->t[0].slen) /* don't rewrite <foo@[]> */
296 return;
297
298 rwroute(addr);
299 if (!addr->len) return; /* <@foo:> -> <> */
301 if (!addr->len) return; /* <.> -> <> */
303 if (!addr->len) return; /* <@> -> <> */
304 rwnoat(addr);
305 rwplus(addr);
306 rwnodot(addr);
307}
308
309int setreturn(token822_alloc *addr)
310{
311 if (!sender.s) {
314 if (flaghackrecip)
315 if (!stralloc_cats(&sender,"-@[]")) die_nomem();
317 }
318 return 1;
319}
320
321int rwreturn(token822_alloc *addr)
322{
325 return 1;
326}
327
328int rwsender(token822_alloc *addr)
329{
331 return 1;
332}
333
334void rwappend(token822_alloc *addr,saa *xl)
335{
337 if (!saa_readyplus(xl,1)) die_nomem();
338 xl->sa[xl->len] = sauninit;
339 if (token822_unquote(&xl->sa[xl->len],addr) != 1) die_nomem();
340 ++xl->len;
342}
343
344int rwhrr(token822_alloc *addr)
345{
346 rwgeneric(addr);
348 return 1;
349}
350
351int rwhr(token822_alloc *addr)
352{
353 rwgeneric(addr);
355 return 1;
356}
357
358int rwtocc(token822_alloc *addr)
359{
360 rwgeneric(addr);
363 return 1;
364}
365
367stralloc hfbuf = {0};
368token822_alloc hfin = {0};
369token822_alloc hfrewrite = {0};
370token822_alloc hfaddr = {0};
371
372void doheaderfield(stralloc *h)
373{
374 int htype;
375 int (*rw)() = 0;
376
377 htype = hfield_known(h->s,h->len);
378 if (flagdeletefrom) if (htype == H_FROM) return;
379 if (flagdeletemessid) if (htype == H_MESSAGEID) return;
380 if (flagdeletesender) if (htype == H_RETURNPATH) return;
381
382 if (htype)
383 htypeseen[htype] = 1;
384 else
385 if (!hfield_valid(h->s,h->len))
386 die_invalid(h);
387
388 switch (htype) {
389 case H_TO: case H_CC:
390 rw = rwtocc; break;
391 case H_BCC: case H_APPARENTLYTO:
392 rw = rwhr; break;
393 case H_R_TO: case H_R_CC: case H_R_BCC:
394 rw = rwhrr; break;
395 case H_RETURNPATH:
396 rw = rwreturn; break;
397 case H_SENDER: case H_FROM: case H_REPLYTO:
398 case H_RETURNRECEIPTTO: case H_ERRORSTO:
399 case H_R_SENDER: case H_R_FROM: case H_R_REPLYTO:
400 rw = rwsender; break;
401 }
402
403 if (rw) {
407 die_nomem();
408 }
409
410 if (htype == H_BCC) return;
411 if (htype == H_R_BCC) return;
412 if (htype == H_RETURNPATH) return;
413 if (htype == H_CONTENTLENGTH) return; /* some things are just too stupid */
415}
416
417void dobody(stralloc *h)
418{
419 out(h->s,h->len);
420}
421
422stralloc torecip = {0};
423token822_alloc tr = {0};
424
425void dorecip(char *s)
426{
427 if (!quote2(&torecip,s)) die_nomem();
428
429 switch (token822_parse(&tr,&torecip,&hfbuf)) {
430 case -1: die_nomem();
431 case 0:
432 buffer_puts(buffer_2,"qmail-inject: fatal: unable to parse address: ");
433 buffer_puts(buffer_2,s);
434 buffer_putsflush(buffer_2,"\n");
435 perm();
436 }
438 rwgeneric(&tr);
440}
441
442stralloc defaultfrom = {0};
443token822_alloc df = {0};
444
446{
447 char *fullname;
448 fullname = env_get("QMAILNAME");
449 if (!fullname) fullname = env_get("MAILNAME");
450 if (!fullname) fullname = env_get("NAME");
451 if (!token822_ready(&df,20)) die_nomem();
452
453 df.len = 0;
454 df.t[df.len].type = TOKEN822_ATOM;
455 df.t[df.len].s = "From";
456 df.t[df.len].slen = 4;
457 ++df.len;
458 df.t[df.len].type = TOKEN822_COLON;
459 ++df.len;
460
461 if (fullname && !flagnamecomment) {
462 df.t[df.len].type = TOKEN822_QUOTE;
463 df.t[df.len].s = fullname;
464 df.t[df.len].slen = str_len(fullname);
465 ++df.len;
466 df.t[df.len].type = TOKEN822_LEFT;
467 ++df.len;
468 }
469
470 df.t[df.len].type = mailusertokentype;
471 df.t[df.len].s = mailuser;
472 df.t[df.len].slen = str_len(mailuser);
473 ++df.len;
474
475 if (mailhost) {
476 df.t[df.len].type = TOKEN822_AT;
477 ++df.len;
478 df.t[df.len].type = TOKEN822_ATOM;
479 df.t[df.len].s = mailhost;
480 df.t[df.len].slen = str_len(mailhost);
481 ++df.len;
482 }
483
484 if (fullname && !flagnamecomment) {
485 df.t[df.len].type = TOKEN822_RIGHT;
486 ++df.len;
487 }
488
489 if (fullname && flagnamecomment) {
490 df.t[df.len].type = TOKEN822_COMMENT;
491 df.t[df.len].s = fullname;
492 df.t[df.len].slen = str_len(fullname);
493 ++df.len;
494 }
495
500}
501
502stralloc defaultreturnpath = {0};
503token822_alloc drp = {0};
504stralloc hackedruser = {0};
505char strnum[FMT_ULONG];
506
508{
510
511 if (flaghackmess) {
512 if (!stralloc_cats(&hackedruser,"-")) die_nomem();
513 if (!stralloc_catb(&hackedruser,strnum,fmt_ulong(strnum,(unsigned long) starttime))) die_nomem();
514 if (!stralloc_cats(&hackedruser,".")) die_nomem();
515 if (!stralloc_catb(&hackedruser,strnum,fmt_ulong(strnum,(unsigned long) getpid()))) die_nomem();
516 }
517 if (flaghackrecip)
518 if (!stralloc_cats(&hackedruser,"-")) die_nomem();
519
520 if (!token822_ready(&drp,10)) die_nomem();
521
522 drp.len = 0;
523 drp.t[drp.len].type = TOKEN822_ATOM;
524 drp.t[drp.len].s = "Return-Path";
525 drp.t[drp.len].slen = 11;
526 ++drp.len;
527 drp.t[drp.len].type = TOKEN822_COLON;
528 ++drp.len;
529 drp.t[drp.len].type = TOKEN822_QUOTE;
530 drp.t[drp.len].s = hackedruser.s;
531 drp.t[drp.len].slen = hackedruser.len;
532 ++drp.len;
533
534 if (mailrhost) {
535 drp.t[drp.len].type = TOKEN822_AT;
536 ++drp.len;
537 drp.t[drp.len].type = TOKEN822_ATOM;
538 drp.t[drp.len].s = mailrhost;
539 drp.t[drp.len].slen = str_len(mailrhost);
540 ++drp.len;
541 }
542
547}
548
549int flagmft = 0;
550stralloc mft = {0};
552
554{
555 char *x;
556 int r;
557
558 x = env_get("QMAILMFTFILE");
559 if (!x) return;
560
561 r = control_readfile(&mft,x,0);
562 if (r == -1) die_read(); /*XXX*/
563 if (!r) return;
564
565 if (!constmap_init(&mapmft,mft.s,mft.len,0)) die_nomem();
566 flagmft = 1;
567}
568
570{
571 int i;
572 static stralloc sa = {0};
573 static stralloc sa2 = {0};
574
575 if (!flagmft) return;
576 if (htypeseen[H_MAILFOLLOWUPTO]) return;
577
578 for (i = 0; i < tocclist.len; ++i)
579 if (constmap(&mapmft,tocclist.sa[i].s,tocclist.sa[i].len))
580 break;
581
582 if (i == tocclist.len) return;
583
584 outs("Mail-Followup-To: ");
585 i = tocclist.len;
586 while (i--) {
587 if (!stralloc_copy(&sa,&tocclist.sa[i])) die_nomem();
588 if (!stralloc_0(&sa)) die_nomem();
589 if (!quote2(&sa2,sa.s)) die_nomem();
590 out(sa2.s,sa2.len);
591 if (i) outs(",\n ");
592 }
593 outs("\n");
594}
595
597{
598 flagresent =
602
603 if (!sender.s)
605
606 if (!flagqueue) {
607 static stralloc sa = {0};
608 static stralloc sa2 = {0};
609
610 if (!stralloc_copy(&sa,&sender)) die_nomem();
611 if (!stralloc_0(&sa)) die_nomem();
612 if (!quote2(&sa2,sa.s)) die_nomem();
613
614 outs("Return-Path: <");
615 out(sa2.s,sa2.len);
616 outs(">\n");
617 }
618
619 /* could check at this point whether there are any recipients */
620 if (flagqueue)
621 if (qmail_open(&qqt) == -1) die_qqt();
622
623 if (flagresent) {
624 if (!htypeseen[H_R_DATE]) {
626 outs("Resent-");
628 }
629 if (!htypeseen[H_R_MESSAGEID]) {
631 outs("Resent-");
633 }
634 if (!htypeseen[H_R_FROM]) {
636 outs("Resent-");
638 }
639 if (!htypeseen[H_R_TO] && !htypeseen[H_R_CC])
640 outs("Resent-Cc: recipient list not shown: ;\n");
641 } else {
642 if (!htypeseen[H_DATE]) {
645 }
646 if (!htypeseen[H_MESSAGEID]) {
649 }
650 if (!htypeseen[H_FROM]) {
653 }
654 if (!htypeseen[H_TO] && !htypeseen[H_CC])
655 outs("Cc: recipient list not shown: ;\n");
656 finishmft();
657 }
658
659 savedh_print();
660}
661
663{
664 static stralloc sa = {0};
665 char *x;
666
667 mft_init();
668
669 if (chdir(auto_qmail) == -1) die_chdir();
670 if (control_init() == -1) die_read();
671
672 if (control_rldef(&control_defaultdomain,"control/defaultdomain",1,"defaultdomain") != 1)
673 die_read();
674 x = env_get("QMAILDEFAULTDOMAIN");
676 if (!stralloc_copys(&sa,".")) die_nomem();
677 if (!stralloc_cat(&sa,&control_defaultdomain)) die_nomem();
679
680 if (control_rldef(&control_defaulthost,"control/defaulthost",1,"defaulthost") != 1)
681 die_read();
682 x = env_get("QMAILDEFAULTHOST");
684 if (!stralloc_copys(&sa,"@")) die_nomem();
685 if (!stralloc_cat(&sa,&control_defaulthost)) die_nomem();
687
688 if (control_rldef(&control_plusdomain,"control/plusdomain",1,"plusdomain") != 1)
689 die_read();
690 x = env_get("QMAILPLUSDOMAIN");
692 if (!stralloc_copys(&sa,".")) die_nomem();
693 if (!stralloc_cat(&sa,&control_plusdomain)) die_nomem();
695
696 if (control_rldef(&control_idhost,"control/idhost",1,"idhost") != 1)
697 die_read();
698 x = env_get("QMAILIDHOST");
699 if (x) if (!stralloc_copys(&control_idhost,x)) die_nomem();
700}
701
702#define RECIP_DEFAULT 1
703#define RECIP_ARGS 2
704#define RECIP_HEADER 3
705#define RECIP_AH 4
706
707int main(int argc,char **argv)
708{
709 int i;
710 int opt;
711 int recipstrategy;
712
713 sig_pipeignore();
714
715 starttime = now();
716
717 qmopts = env_get("QMAILINJECT");
718 if (qmopts)
719 while (*qmopts)
720 switch (*qmopts++) {
721 case 'c': flagnamecomment = 1; break;
722 case 's': flagdeletesender = 1; break;
723 case 'f': flagdeletefrom = 1; break;
724 case 'i': flagdeletemessid = 1; break;
725 case 'r': flaghackrecip = 1; break;
726 case 'm': flaghackmess = 1; break;
727 }
728
729 mailhost = env_get("QMAILHOST");
730 if (!mailhost) mailhost = env_get("MAILHOST");
731 mailrhost = env_get("QMAILSHOST");
733
734 mailuser = env_get("QMAILUSER");
735 if (!mailuser) mailuser = env_get("MAILUSER");
736 if (!mailuser) mailuser = env_get("USER");
737 if (!mailuser) mailuser = env_get("LOGNAME");
738 if (!mailuser) mailuser = "anonymous";
741 mailruser = env_get("QMAILSUSER");
743
744 for (i = 0; i < H_NUM; ++i) htypeseen[i] = 0;
745
746 recipstrategy = RECIP_DEFAULT;
747 flagqueue = 1;
748
749 getcontrols();
750
751 if (!saa_readyplus(&hrlist,1)) die_nomem();
752 if (!saa_readyplus(&tocclist,1)) die_nomem();
753 if (!saa_readyplus(&hrrlist,1)) die_nomem();
754 if (!saa_readyplus(&reciplist,1)) die_nomem();
755
756 while ((opt = getopt(argc,argv,"aAhHnNf:")) != opteof)
757 switch (opt) {
758 case 'a': recipstrategy = RECIP_ARGS; break;
759 case 'A': recipstrategy = RECIP_DEFAULT; break;
760 case 'h': recipstrategy = RECIP_HEADER; break;
761 case 'H': recipstrategy = RECIP_AH; break;
762 case 'n': flagqueue = 0; break;
763 case 'N': flagqueue = 1; break;
764 case 'f':
765 if (!quote2(&sender,optarg)) die_nomem();
768 rwgeneric(&envs);
770 if (token822_unquote(&sender,&envs) != 1) die_nomem();
771 break;
772 case '?':
773 default:
774 perm();
775 }
776
777 argc -= optind;
778 argv += optind;
779
780 if (recipstrategy == RECIP_DEFAULT)
781 recipstrategy = (*argv ? RECIP_ARGS : RECIP_HEADER);
782
783 if (recipstrategy != RECIP_HEADER)
784 while (*argv)
785 dorecip(*argv++);
786
787 flagrh = (recipstrategy != RECIP_ARGS);
788
789 if (headerbody(buffer_0,doheaderfield,finishheader,dobody) == -1)
790 die_read();
791
792 exitnicely();
793}
char auto_qmail[]
int main()
Definition: chkshsgr.c:6
int constmap_init(struct constmap *cm, char *s, int len, int flagcolon)
Definition: constmap.c:35
int control_rldef(stralloc *sa, char *fn, int flagme, char *def)
Definition: control.c:41
int control_readfile(stralloc *sa, char *fn, int flagme)
Definition: control.c:86
int control_init(void)
Definition: control.c:32
long datetime_sec
Definition: datetime.h:15
int stralloc_copys(stralloc *, char const *)
stralloc out
Definition: dnscname.c:12
stralloc sa
Definition: dnscname.c:11
void _exit()
int headerbody()
#define H_REPLYTO
Definition: hfield.h:10
#define H_RETURNRECEIPTTO
Definition: hfield.h:25
#define H_R_REPLYTO
Definition: hfield.h:19
#define H_R_MESSAGEID
Definition: hfield.h:24
#define H_BCC
Definition: hfield.h:13
int hfield_known()
#define H_RETURNPATH
Definition: hfield.h:29
#define H_TO
Definition: hfield.h:11
#define H_MAILFOLLOWUPTO
Definition: hfield.h:35
#define H_CC
Definition: hfield.h:12
#define H_R_BCC
Definition: hfield.h:22
#define H_R_TO
Definition: hfield.h:20
#define H_SENDER
Definition: hfield.h:8
#define H_R_DATE
Definition: hfield.h:23
#define H_CONTENTLENGTH
Definition: hfield.h:31
#define H_APPARENTLYTO
Definition: hfield.h:27
#define H_ERRORSTO
Definition: hfield.h:26
#define H_R_SENDER
Definition: hfield.h:17
int hfield_valid()
#define H_R_FROM
Definition: hfield.h:18
#define H_DATE
Definition: hfield.h:14
#define H_NUM
Definition: hfield.h:36
#define H_MESSAGEID
Definition: hfield.h:15
#define H_R_CC
Definition: hfield.h:21
#define H_FROM
Definition: hfield.h:9
void h(char *, int, int, int)
Definition: install.c:15
stralloc newfield_msgid
Definition: newfield.c:11
stralloc newfield_date
Definition: newfield.c:9
int newfield_datemake()
int newfield_msgidmake()
datetime_sec now()
Definition: now.c:5
GEN_ALLOC_readyplus(prioq, struct prioq_elt, p, len, a, i, n, x, 100, prioq_readyplus)
Definition: prioq.c:5
saa hrrlist
Definition: qmail-inject.c:110
stralloc defaultfrom
Definition: qmail-inject.c:442
void rwroute(token822_alloc *addr)
Definition: qmail-inject.c:188
stralloc defaultreturnpath
Definition: qmail-inject.c:502
stralloc plusdomainbuf
Definition: qmail-inject.c:185
char * mailuser
Definition: qmail-inject.c:37
void dodefaultreturnpath()
Definition: qmail-inject.c:507
void doheaderfield(stralloc *h)
Definition: qmail-inject.c:372
int rwsender(token822_alloc *addr)
Definition: qmail-inject.c:328
stralloc hfbuf
Definition: qmail-inject.c:367
void finishmft()
Definition: qmail-inject.c:569
char * mailrhost
Definition: qmail-inject.c:39
void dorecip(char *s)
Definition: qmail-inject.c:425
int rwreturn(token822_alloc *addr)
Definition: qmail-inject.c:321
token822_alloc tr
Definition: qmail-inject.c:423
stralloc control_plusdomain
Definition: qmail-inject.c:45
void die_nomem()
Definition: qmail-inject.c:66
void rwextraat(token822_alloc *addr)
Definition: qmail-inject.c:196
#define RECIP_DEFAULT
Definition: qmail-inject.c:702
int flagresent
Definition: qmail-inject.c:112
int rwhrr(token822_alloc *addr)
Definition: qmail-inject.c:344
int flagqueue
Definition: qmail-inject.c:52
void getcontrols()
Definition: qmail-inject.c:662
void dobody(stralloc *h)
Definition: qmail-inject.c:417
stralloc torecip
Definition: qmail-inject.c:422
char strnum[FMT_ULONG]
Definition: qmail-inject.c:505
void exitnicely()
Definition: qmail-inject.c:114
#define RECIP_AH
Definition: qmail-inject.c:705
datetime_sec starttime
Definition: qmail-inject.c:27
#define RECIP_HEADER
Definition: qmail-inject.c:704
token822_alloc hfrewrite
Definition: qmail-inject.c:369
int flagrh
Definition: qmail-inject.c:50
stralloc sender
Definition: qmail-inject.c:47
void perm()
Definition: qmail-inject.c:63
int setreturn(token822_alloc *addr)
Definition: qmail-inject.c:309
void savedh_print()
Definition: qmail-inject.c:173
stralloc control_defaultdomain
Definition: qmail-inject.c:43
char * mailruser
Definition: qmail-inject.c:40
GEN_ALLOC_typedef(GEN_ALLOC_readyplus(saa, GEN_ALLOC_readyplus(stralloc, GEN_ALLOC_readyplus(sa, GEN_ALLOC_readyplus(len, GEN_ALLOC_readyplus(a)
Definition: qmail-inject.c:102
char * qmopts
Definition: qmail-inject.c:29
int flagdeletefrom
Definition: qmail-inject.c:31
int flagmft
Definition: qmail-inject.c:549
stralloc control_idhost
Definition: qmail-inject.c:42
int htypeseen[H_NUM]
Definition: qmail-inject.c:366
struct qmail qqt
Definition: qmail-inject.c:53
#define LINELEN
Definition: qmail-inject.c:25
int rwhr(token822_alloc *addr)
Definition: qmail-inject.c:351
void rwplus(token822_alloc *addr)
Definition: qmail-inject.c:266
void mft_init()
Definition: qmail-inject.c:553
stralloc control_defaulthost
Definition: qmail-inject.c:44
token822_alloc defaulthost
Definition: qmail-inject.c:184
void die_qqt()
Definition: qmail-inject.c:77
int flagdeletemessid
Definition: qmail-inject.c:32
int flagnamecomment
Definition: qmail-inject.c:33
void temp()
Definition: qmail-inject.c:64
saa hrlist
Definition: qmail-inject.c:108
token822_alloc drp
Definition: qmail-inject.c:503
stralloc defaulthostbuf
Definition: qmail-inject.c:183
void die_read()
Definition: qmail-inject.c:87
int mailusertokentype
Definition: qmail-inject.c:38
token822_alloc df
Definition: qmail-inject.c:443
#define RECIP_ARGS
Definition: qmail-inject.c:703
void die_invalid(stralloc *sa)
Definition: qmail-inject.c:71
token822_alloc hfin
Definition: qmail-inject.c:368
stralloc mft
Definition: qmail-inject.c:550
int flaghackrecip
Definition: qmail-inject.c:35
void die_chdir()
Definition: qmail-inject.c:82
saa reciplist
Definition: qmail-inject.c:111
int flagdeletesender
Definition: qmail-inject.c:30
void rwnoat(token822_alloc *addr)
Definition: qmail-inject.c:218
void rwappend(token822_alloc *addr, saa *xl)
Definition: qmail-inject.c:334
void savedh_append(stralloc *h)
Definition: qmail-inject.c:165
saa tocclist
Definition: qmail-inject.c:109
stralloc hackedruser
Definition: qmail-inject.c:504
saa savedh
Definition: qmail-inject.c:107
token822_alloc envs
Definition: qmail-inject.c:49
char * mailhost
Definition: qmail-inject.c:36
void rwnodot(token822_alloc *addr)
Definition: qmail-inject.c:237
void rwgeneric(token822_alloc *addr)
Definition: qmail-inject.c:289
token822_alloc hfaddr
Definition: qmail-inject.c:370
struct constmap mapmft
Definition: qmail-inject.c:551
void rwextradot(token822_alloc *addr)
Definition: qmail-inject.c:207
void defaultfrommake()
Definition: qmail-inject.c:445
stralloc envsbuf
Definition: qmail-inject.c:48
void finishheader()
Definition: qmail-inject.c:596
int flaghackmess
Definition: qmail-inject.c:34
void doordie(stralloc *sa, int r)
Definition: qmail-inject.c:93
stralloc defaultdomainbuf
Definition: qmail-inject.c:181
token822_alloc plusdomain
Definition: qmail-inject.c:186
int rwtocc(token822_alloc *addr)
Definition: qmail-inject.c:358
token822_alloc defaultdomain
Definition: qmail-inject.c:182
void outs(char *s)
Definition: qmail-inject.c:61
int
Definition: qmail-mrtg.c:26
stralloc addr
Definition: qmail-smtpd.c:521
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
int qmail_open(struct qmail *)
Definition: qmail.c:21
int quote2(stralloc *, char *)
Definition: quote.c:70
int quote_need(char *, unsigned int)
Definition: quote.c:41
Definition: qmail.h:6
int token822_parse(token822_alloc *ta, stralloc *sa, stralloc *buf)
Definition: token822.c:216
#define TOKEN822_ATOM
Definition: token822.h:24
int token822_ready()
#define TOKEN822_COMMENT
Definition: token822.h:27
#define TOKEN822_RIGHT
Definition: token822.h:29
#define TOKEN822_LEFT
Definition: token822.h:28
void token822_reverse()
#define TOKEN822_AT
Definition: token822.h:30
int token822_unparse()
int token822_readyplus()
int token822_unquote()
#define TOKEN822_DOT
Definition: token822.h:34
int token822_addrlist()
#define TOKEN822_COLON
Definition: token822.h:33
#define TOKEN822_LITERAL
Definition: token822.h:26
#define TOKEN822_QUOTE
Definition: token822.h:25