--- qmail-queue.c.orig 1998-06-15
+++ qmail-queue.c 2007-03-21
--- .././qmail-1.03/qmail-queue.c Mon Jun 15 12:53:16 1998
+++ ../qmail-1.03.2418/qmail-queue.c Sat Jan 6 21:21:07 2007
@@ -16,6 +16,11 @@
#include "auto_uids.h"
#include "date822fmt.h"
#include "fmtqfn.h"
+#include "env.h"
+#include "fork.h"
+#include "wait.h"
+
+#define BIGTODO
#define DEATH 86400 /* 24 hours; _must_ be below q-s's OSSIFIED (36 hours) */
#define ADDR 1003
@@ -55,6 +60,7 @@
}
void die(e) int e; { _exit(e); }
+void die_qhpsi() { cleanup(); die(71); }
void die_write() { cleanup(); die(53); }
void die_read() { cleanup(); die(54); }
void sigalrm() { /* thou shalt not clean up here */ die(52); }
@@ -149,6 +155,59 @@
die(63);
}
+char *qhpsi;
+
+void qhpsiprog(arg) char *arg;
+{
+ int wstat;
+ int child;
+ char *qhpsiargs[6] = { 0, 0, 0, 0, 0, 0 };
+ char *x;
+ unsigned long u;
+ int childrc;
+ int qhpsirc = 1;
+ unsigned int size;
+ unsigned int qhpsiminsize = 0;
+ unsigned int qhpsimaxsize = 0;
+
+ struct stat st;
+
+ if (stat(messfn,&st) == -1) die(63);
+ size = (unsigned int) st.st_size;
+
+ x = env_get("QHPSIMINSIZE");
+ if (x) { scan_ulong(x,&u); qhpsiminsize = (int) u; }
+ if (qhpsiminsize) if (size < qhpsiminsize) return;
+ x = env_get("QHPSIMAXSIZE");
+ if (x) { scan_ulong(x,&u); qhpsimaxsize = (int) u; }
+ if (qhpsimaxsize) if (size > qhpsimaxsize) return;
+
+ if (*arg) {
+ switch(child = fork()) {
+ case -1:
+ die_qhpsi();
+ case 0:
+ qhpsiargs[0] = arg;
+ qhpsiargs[1] = messfn;
+ qhpsiargs[2] = env_get("QHPSIARG1");
+ if(!qhpsiargs[2]) qhpsiargs[2] = 0;
+ qhpsiargs[3] = env_get("QHPSIARG2");
+ if(!qhpsiargs[3]) qhpsiargs[3] = 0;
+ qhpsiargs[4] = env_get("QHPSIARG3");
+ if(!qhpsiargs[4]) qhpsiargs[4] = 0;
+ x = env_get("QHPSIRC");
+ if (x) { scan_ulong(x,&u); qhpsirc = (int) u; }
+ execvp(*qhpsiargs,qhpsiargs);
+ die_qhpsi();
+ }
+ if (wait_pid(&wstat,child) == -1) die_qhpsi();
+ if (wait_crashed(wstat)) die_qhpsi();
+ childrc = wait_exitcode(wstat);
+ if (childrc == qhpsirc) { cleanup(); die(31); }
+ else if (childrc != 0) die_qhpsi();
+ }
+}
+
char tmp[FMT_ULONG];
void main()
@@ -165,6 +224,7 @@
uid = getuid();
starttime = now();
datetime_tai(&dt,starttime);
+ qhpsi = env_get("QHPSI");
received_setup();
@@ -180,8 +240,13 @@
messnum = pidst.st_ino;
messfn = fnnum("mess/",1);
+#ifdef BIGTODO
+ todofn = fnnum("todo/",1);
+ intdfn = fnnum("intd/",1);
+#else
todofn = fnnum("todo/",0);
intdfn = fnnum("intd/",0);
+#endif
if (link(pidfn,messfn) == -1) die(64);
if (unlink(pidfn) == -1) die(63);
@@ -233,6 +298,7 @@
{
if (substdio_get(&ssin,&ch,1) < 1) die_read();
if (!ch) break;
+ if (ch == 'Q') { qhpsi = 0; break; }
if (ch != 'T') die(91);
if (substdio_bput(&ssout,&ch,1) == -1) die_write();
for (len = 0;len < ADDR;++len)
@@ -243,6 +309,8 @@
}
if (len >= ADDR) die(11);
}
+
+ if (qhpsi) qhpsiprog(qhpsi);
if (substdio_flush(&ssout) == -1) die_write();
if (fsync(intdfd) == -1) die_write();
syntax highlighted by Code2HTML, v. 0.9.1