The patch file is here.
Kelvin
Quoting Kelvin Wu <[EMAIL PROTECTED]>:
This is just a little piece of patch which can be applied onto
toaster-0.8. It provides the "tapping" function to netqmail.
After applying the patch, create the file control/taps with the
corresponding format should enable the tap function. For details,
please see the instructions in inter7.com.
Bill, again, if you find it appropriate, please feel free to
incorporate it into your next release of toaster.
cheers,
Kelvin
diff -Nuar netqmail-1.05/Makefile netqmail-1.05.tap/Makefile
--- netqmail-1.05/Makefile 2005-09-06 14:28:09.000000000 +0800
+++ netqmail-1.05.tap/Makefile 2005-09-07 17:55:06.000000000 +0800
@@ -1550,13 +1550,14 @@
nroff -man qmail-qstat.8 > qmail-qstat.0
qmail-queue: \
-load qmail-queue.o triggerpull.o fmtqfn.o now.o date822fmt.o \
-datetime.a seek.a ndelay.a open.a sig.a alloc.a substdio.a error.a \
-str.a fs.a auto_qmail.o auto_split.o auto_uids.o
+load qmail-queue.o triggerpull.o fmtqfn.o now.o date822fmt.o qregex.o \
+datetime.a seek.a case.a ndelay.a open.a sig.a getln.a stralloc.a alloc.a \
+substdio.a error.a control.o constmap.o str.a fs.a auto_qmail.o \
+auto_split.o auto_uids.o
./load qmail-queue triggerpull.o fmtqfn.o now.o \
- date822fmt.o datetime.a seek.a ndelay.a open.a sig.a \
- alloc.a substdio.a error.a str.a fs.a auto_qmail.o \
- auto_split.o auto_uids.o
+ date822fmt.o qregex.o control.o constmap.o datetime.a case.a seek.a \
+ ndelay.a open.a sig.a getln.a stralloc.a alloc.a substdio.a error.a \
+ str.a fs.a auto_qmail.o auto_split.o auto_uids.o
qmail-queue.0: \
qmail-queue.8
diff -Nuar netqmail-1.05/qmail-control.9 netqmail-1.05.tap/qmail-control.9
--- netqmail-1.05/qmail-control.9 2005-09-06 14:28:09.000000000 +0800
+++ netqmail-1.05.tap/qmail-control.9 2005-09-07 17:58:31.000000000 +0800
@@ -77,6 +77,7 @@
.I servercert.pem \fR(none) \fRqmail-smtpd
.I smtpgreeting \fIme \fRqmail-smtpd
.I smtproutes \fR(none) \fRqmail-remote
+.I taps \fR(none) \fRqmail-queue
.I spfbehavior \fR0 \fRqmail-smtpd
.I spfexp \fR(default) \fRqmail-smtpd
.I spfguess \fR(none) \fRqmail-smtpd
@@ -95,6 +96,7 @@
.SH "SEE ALSO"
qmail-inject(8),
qmail-qmqpc(8),
+qmail-queue(8),
qmail-remote(8),
qmail-send(8),
qmail-showctl(8),
diff -Nuar netqmail-1.05/qmail-queue.8 netqmail-1.05.tap/qmail-queue.8
--- netqmail-1.05/qmail-queue.8 2005-09-06 14:03:52.000000000 +0800
+++ netqmail-1.05.tap/qmail-queue.8 2005-09-07 18:01:01.000000000 +0800
@@ -40,6 +40,12 @@
However, the recipients probably expect to see a proper header,
as described in
.BR qmail-header(5) .
+.SH "CONTROL FILES"
+.TP 5
+.I taps
+Should contain regex syntax of email addresses to tap and
+the associated email address to send the copy to. The two
+fields should be separated by a colon.
Programs included with qmail which invoke
.B qmail-queue
diff -Nuar netqmail-1.05/qmail-queue.c netqmail-1.05.tap/qmail-queue.c
--- netqmail-1.05/qmail-queue.c 1998-06-15 18:53:16.000000000 +0800
+++ netqmail-1.05.tap/qmail-queue.c 2005-09-07 18:12:39.000000000 +0800
@@ -16,6 +16,8 @@
#include "auto_uids.h"
#include "date822fmt.h"
#include "fmtqfn.h"
+#include "stralloc.h"
+#include "constmap.h"
#define DEATH 86400 /* 24 hours; _must_ be below q-s's OSSIFIED (36 hours) */
#define ADDR 1003
@@ -25,6 +27,14 @@
char outbuf[256];
struct substdio ssout;
+int tapok = 0;
+stralloc tap = {0};
+struct constmap maptap;
+stralloc chkaddr = {0};
+int tapped;
+stralloc tapaddr = {0};
+stralloc controlfile = {0};
+
datetime_sec starttime;
struct datetime dt;
unsigned long mypid;
@@ -175,6 +185,13 @@
alarm(DEATH);
+ stralloc_copys( &controlfile, auto_qmail);
+ stralloc_cats( &controlfile, "/control/taps");
+ stralloc_0( &controlfile);
+ tapok = control_readfile(&tap,controlfile.s,0);
+ if (tapok == -1) die(65);
+ if (!constmap_init(&maptap,tap.s,tap.len,0)) die(65);
+
pidopen();
if (fstat(messfd,&pidst) == -1) die(63);
@@ -219,14 +236,28 @@
if (substdio_get(&ssin,&ch,1) < 1) die_read();
if (ch != 'F') die(91);
if (substdio_bput(&ssout,&ch,1) == -1) die_write();
+ stralloc_0(&chkaddr);
for (len = 0;len < ADDR;++len)
{
+ if ( len == 1 ) stralloc_copyb(&chkaddr, &ch,1);
+ else if ( len > 1 ) stralloc_catb(&chkaddr, &ch,1);
if (substdio_get(&ssin,&ch,1) < 1) die_read();
if (substdio_put(&ssout,&ch,1) == -1) die_write();
if (!ch) break;
}
if (len >= ADDR) die(11);
+ /* check the from address */
+ stralloc_0(&chkaddr);
+ if (tapped == 0 && tapcheck()==1 ) {
+ tapped = 1;
+ if ( tapaddr.len > 0 ) {
+ if (substdio_bput(&ssout,"T",1) == -1) die_write();
+ if (substdio_bput(&ssout,tapaddr.s,tapaddr.len) == -1) die_write();
+ if (substdio_bput(&ssout,"",1) == -1) die_write();
+ }
+ }
+
if (substdio_bput(&ssout,QUEUE_EXTRA,QUEUE_EXTRALEN) == -1) die_write();
for (;;)
@@ -237,10 +268,24 @@
if (substdio_bput(&ssout,&ch,1) == -1) die_write();
for (len = 0;len < ADDR;++len)
{
+ if ( len == 1 ) stralloc_copyb(&chkaddr, &ch,1);
+ else if ( len > 1 ) stralloc_catb(&chkaddr, &ch,1);
if (substdio_get(&ssin,&ch,1) < 1) die_read();
if (substdio_bput(&ssout,&ch,1) == -1) die_write();
if (!ch) break;
}
+
+ /* check the to address */
+ stralloc_0(&chkaddr);
+ if (tapped == 0 && tapcheck()==1 ) {
+ tapped = 1;
+ if ( tapaddr.len > 0 ) {
+ if (substdio_bput(&ssout,"T",1) == -1) die_write();
+ if (substdio_bput(&ssout,tapaddr.s,tapaddr.len) == -1) die_write();
+ if (substdio_bput(&ssout,"",1) == -1) die_write();
+ }
+ }
+
if (len >= ADDR) die(11);
}
@@ -252,3 +297,42 @@
triggerpull();
die(0);
}
+
+int tapcheck()
+{
+ int i = 0;
+ int j = 0;
+ int x = 0;
+ int negate = 0;
+ stralloc curregex = {0};
+ char tmpbuf[200];
+
+ while (j < tap.len) {
+ i = j;
+ while ((tap.s[i] != ':') && (i < tap.len)) i++;
+ if (tap.s[j] == '!') {
+ negate = 1;
+ j++;
+ }
+ stralloc_copys(&tapaddr, &tap.s[i+1]);
+
+ stralloc_copyb(&curregex,tap.s + j,(i - j));
+ stralloc_0(&curregex);
+ x = matchregex(chkaddr.s, curregex.s, tmpbuf);
+
+ while ((tap.s[i] != '\0') && (i < tap.len)) i++;
+
+ if ((negate) && (x == 0)) {
+ return 1;
+ }
+ if (!(negate) && (x > 0)) {
+ return 1;
+ }
+ j = i + 1;
+ negate = 0;
+
+
+ }
+ return 0;
+}
+
diff -Nuar netqmail-1.05/README.tap netqmail-1.05.tap/README.tap
--- netqmail-1.05/README.tap 1970-01-01 08:00:00.000000000 +0800
+++ netqmail-1.05.tap/README.tap 2005-09-07 18:14:22.000000000 +0800
@@ -0,0 +1,28 @@
+qmail provides the ability to make a copy of each email that flows through the
system.
+This is done using the QUEUE_EXTRA code. See qmail FAQ #8.2
+
+The qmail tap patch adds additional functionality:
+1) Specify which email addresses to tap using a regex style control file. With
the
+ regex function, you can specify full domains or individual email addresses.
+
+2) Specify which email address to send the emails to.
+
+3) Qmail does not need to be restated to when the taps control file is changed.
+
+The regex match is applied to both the to and from email addresses. So email
+sent to or from the addresses will be copied. Matching is case insensitive.
+If there are multiple matches, the first match is used.
+
+The queue tap patch adds a new control file:
+
+/var/qmail/control/taps
+Contains a regex style list of addresses to tap and the email
+address of where you want the copy sent to.
+
+Examples:
+a) To tap a whole domain add a line like:
[EMAIL PROTECTED]:[EMAIL PROTECTED]
+
+
+b) To tap an individual email address add a line like:
[EMAIL PROTECTED]:[EMAIL PROTECTED]