13 #include "triggerpull.h"
15 #include "auto_qmail.h"
16 #include "auto_uids.h"
17 #include "date822fmt.h"
20 #define DEATH 86400 /* 24 hours; _must_ be below q-s's OSSIFIED (36 hours) */
26 struct substdio ssout;
28 datetime_sec starttime;
34 unsigned long messnum;
48 if (unlink(intdfn) == -1) return;
53 if (unlink(messfn) == -1) return;
57 void die(e) int e; { _exit(e); }
58 void die_write() { cleanup(); die(53); }
59 void die_read() { cleanup(); die(54); }
60 void sigalrm() { /* thou shalt not clean up here */ die(52); }
61 void sigbug() { die(81); }
63 unsigned int receivedlen;
65 /* "Received: (qmail-queue invoked by alias); 26 Sep 1995 04:46:54 -0000\n" */
67 static unsigned int receivedfmt(s)
73 i = fmt_str(s,"Received: (qmail "); len += i; if (s) s += i;
74 i = fmt_ulong(s,mypid); len += i; if (s) s += i;
75 i = fmt_str(s," invoked "); len += i; if (s) s += i;
77 { i = fmt_str(s,"by alias"); len += i; if (s) s += i; }
78 else if (uid == auto_uidd)
79 { i = fmt_str(s,"from network"); len += i; if (s) s += i; }
80 else if (uid == auto_uids)
81 { i = fmt_str(s,"for bounce"); len += i; if (s) s += i; }
84 i = fmt_str(s,"by uid "); len += i; if (s) s += i;
85 i = fmt_ulong(s,uid); len += i; if (s) s += i;
87 i = fmt_str(s,"); "); len += i; if (s) s += i;
88 i = date822fmt(s,&dt); len += i; if (s) s += i;
94 receivedlen = receivedfmt((char *) 0);
95 received = alloc(receivedlen + 1);
96 if (!received) die(51);
97 receivedfmt(received);
100 unsigned int pidfmt(s,seq)
108 i = fmt_str(s,"pid/"); len += i; if (s) s += i;
109 i = fmt_ulong(s,mypid); len += i; if (s) s += i;
110 i = fmt_str(s,"."); len += i; if (s) s += i;
111 i = fmt_ulong(s,starttime); len += i; if (s) s += i;
112 i = fmt_str(s,"."); len += i; if (s) s += i;
113 i = fmt_ulong(s,seq); len += i; if (s) s += i;
114 ++len; if (s) *s++ = 0;
119 char *fnnum(dirslash,flagsplit)
125 s = alloc(fmtqfn((char *) 0,dirslash,messnum,flagsplit));
127 fmtqfn(s,dirslash,messnum,flagsplit);
137 len = pidfmt((char *) 0,seq);
141 for (seq = 1;seq < 10;++seq)
143 if (pidfmt((char *) 0,seq) > len) die(81); /* paranoia */
145 messfd = open_excl(pidfn);
146 if (messfd != -1) return;
161 if (chdir(auto_qmail) == -1) die(61);
162 if (chdir("queue") == -1) die(62);
167 datetime_tai(&dt,starttime);
173 sig_alarmcatch(sigalrm);
174 sig_bugcatch(sigbug);
179 if (fstat(messfd,&pidst) == -1) die(63);
181 messnum = pidst.st_ino;
182 messfn = fnnum("mess/",1);
183 todofn = fnnum("todo/",0);
184 intdfn = fnnum("intd/",0);
186 if (link(pidfn,messfn) == -1) die(64);
187 if (unlink(pidfn) == -1) die(63);
190 substdio_fdbuf(&ssout,write,messfd,outbuf,sizeof(outbuf));
191 substdio_fdbuf(&ssin,read,0,inbuf,sizeof(inbuf));
193 if (substdio_bput(&ssout,received,receivedlen) == -1) die_write();
195 switch(substdio_copy(&ssout,&ssin))
198 case -3: die_write();
201 if (substdio_flush(&ssout) == -1) die_write();
202 if (fsync(messfd) == -1) die_write();
204 intdfd = open_excl(intdfn);
205 if (intdfd == -1) die(65);
208 substdio_fdbuf(&ssout,write,intdfd,outbuf,sizeof(outbuf));
209 substdio_fdbuf(&ssin,read,1,inbuf,sizeof(inbuf));
211 if (substdio_bput(&ssout,"u",1) == -1) die_write();
212 if (substdio_bput(&ssout,tmp,fmt_ulong(tmp,uid)) == -1) die_write();
213 if (substdio_bput(&ssout,"",1) == -1) die_write();
215 if (substdio_bput(&ssout,"p",1) == -1) die_write();
216 if (substdio_bput(&ssout,tmp,fmt_ulong(tmp,mypid)) == -1) die_write();
217 if (substdio_bput(&ssout,"",1) == -1) die_write();
219 if (substdio_get(&ssin,&ch,1) < 1) die_read();
220 if (ch != 'F') die(91);
221 if (substdio_bput(&ssout,&ch,1) == -1) die_write();
222 for (len = 0;len < ADDR;++len)
224 if (substdio_get(&ssin,&ch,1) < 1) die_read();
225 if (substdio_put(&ssout,&ch,1) == -1) die_write();
228 if (len >= ADDR) die(11);
230 if (substdio_bput(&ssout,QUEUE_EXTRA,QUEUE_EXTRALEN) == -1) die_write();
234 if (substdio_get(&ssin,&ch,1) < 1) die_read();
236 if (ch != 'T') die(91);
237 if (substdio_bput(&ssout,&ch,1) == -1) die_write();
238 for (len = 0;len < ADDR;++len)
240 if (substdio_get(&ssin,&ch,1) < 1) die_read();
241 if (substdio_bput(&ssout,&ch,1) == -1) die_write();
244 if (len >= ADDR) die(11);
247 if (substdio_flush(&ssout) == -1) die_write();
248 if (fsync(intdfd) == -1) die_write();
250 if (link(intdfn,todofn) == -1) die(66);