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);