[MASOCH-L] qmail srs patch
Marcelo Coelho
marcelo at tpn.com.br
Fri Dec 15 19:14:17 -03 2006
Olá,
Segue um patch que criei para o qmail suportar srs utilizando libsrs2
http://www.libsrs2.org/.
Fiz vários testes, funcionou muito bem tanto em servidores com
qmail-1.03 "puro" como em servidores com domínios virtuais (vpopmail).
Aguardo os comentários de quem se interessar em testá-lo.
--
Marcelo Coelho
marcelo at tpn.com.br
-------------- next part --------------
QMAIL SRS PATCH
Marcelo Coelho
marcelo at tpn dot com dot br
1) Download and install libsrs2 from http://www.libsrs2.org/download.html
2) Apply the patch
tar -xzf /path/to/qmail-1.03.tar.gz
cd qmail-1.03
patch -p1 < qmail-srs-0.1.patch
And follow your qmail instalation (config, make, make setup check, ...)
3) Configure some variables in /var/qmail/control
echo srs.YOURDOMAIN > /var/qmail/control/srs_domain
echo SECRET > /var/qmail/control/srs_secrets
echo 21 > /var/qmail/control/srs_maxage
echo 4 > /var/qmail/control/srs_hashlength
echo 4> /var/qmail/control/srs_hashmin
This document describes what each control file does:
http://www.libsrs2.org/docs/mta-users.html
echo srs.YOURDOMAIN >> /var/qmail/control/rcpthosts
echo "srs.YOURDOMAIN:srs" >> /var/qmail/control/virtualdomains
echo "| /var/qmail/bin/srsfilter" >> /var/qmail/alias/.qmail-srs-default
* YOURDOMAIN: Replace with your domain name, e.g. srs.foo-bar.com
* SECRET: Replace with a random string
diff -Nu qmail-1.03.orig/Makefile qmail-1.03/Makefile
--- qmail-1.03.orig/Makefile Mon Jun 15 07:53:16 1998
+++ qmail-1.03/Makefile Fri Dec 15 15:08:59 2006
@@ -808,7 +808,7 @@
forward preline condredirect bouncesaying except maildirmake \
maildir2mbox maildirwatch qail elq pinq idedit install-big install \
instcheck home home+df proc proc+df binm1 binm1+df binm2 binm2+df \
-binm3 binm3+df
+binm3 binm3+df srsfilter
load: \
make-load warn-auto.sh systype
@@ -1136,15 +1136,16 @@
nroff -man qmail-header.5 > qmail-header.0
qmail-inject: \
-load qmail-inject.o headerbody.o hfield.o newfield.o quote.o now.o \
+load qmail-inject.o rcpthosts.o cdb.a srs.o headerbody.o hfield.o newfield.o quote.o now.o \
control.o date822fmt.o constmap.o qmail.o case.a fd.a wait.a open.a \
getln.a sig.a getopt.a datetime.a token822.o env.a stralloc.a alloc.a \
substdio.a error.a str.a fs.a auto_qmail.o
- ./load qmail-inject headerbody.o hfield.o newfield.o \
+ ./load qmail-inject rcpthosts.o cdb.a srs.o headerbody.o hfield.o newfield.o \
quote.o now.o control.o date822fmt.o constmap.o qmail.o \
case.a fd.a wait.a open.a getln.a sig.a getopt.a datetime.a \
token822.o env.a stralloc.a alloc.a substdio.a error.a \
- str.a fs.a auto_qmail.o
+ str.a fs.a auto_qmail.o \
+ -I/usr/local/include -L/usr/local/lib -lsrs2
qmail-inject.0: \
qmail-inject.8
@@ -1171,15 +1172,16 @@
> qmail-limits.7
qmail-local: \
-load qmail-local.o qmail.o quote.o now.o gfrom.o myctime.o \
+load qmail-local.o constmap.o control.o rcpthosts.o srs.o cdb.a qmail.o quote.o now.o gfrom.o myctime.o \
slurpclose.o case.a getln.a getopt.a sig.a open.a seek.a lock.a fd.a \
wait.a env.a stralloc.a alloc.a strerr.a substdio.a error.a str.a \
fs.a datetime.a auto_qmail.o auto_patrn.o socket.lib
- ./load qmail-local qmail.o quote.o now.o gfrom.o myctime.o \
+ ./load qmail-local constmap.o control.o rcpthosts.o srs.o cdb.a qmail.o quote.o now.o gfrom.o myctime.o \
slurpclose.o case.a getln.a getopt.a sig.a open.a seek.a \
lock.a fd.a wait.a env.a stralloc.a alloc.a strerr.a \
substdio.a error.a str.a fs.a datetime.a auto_qmail.o \
- auto_patrn.o `cat socket.lib`
+ auto_patrn.o `cat socket.lib` \
+ -I/usr/local/include -L/usr/local/lib -lsrs2
qmail-local.0: \
qmail-local.8
@@ -1479,16 +1481,17 @@
./compile qmail-rspawn.c
qmail-send: \
-load qmail-send.o qsutil.o control.o constmap.o newfield.o prioq.o \
+load qmail-send.o rcpthosts.o cdb.a srs.o qsutil.o control.o constmap.o newfield.o prioq.o \
trigger.o fmtqfn.o quote.o now.o readsubdir.o qmail.o date822fmt.o \
datetime.a case.a ndelay.a getln.a wait.a seek.a fd.a sig.a open.a \
lock.a stralloc.a alloc.a substdio.a error.a str.a fs.a auto_qmail.o \
auto_split.o
- ./load qmail-send qsutil.o control.o constmap.o newfield.o \
+ ./load qmail-send rcpthosts.o cdb.a srs.o qsutil.o control.o constmap.o newfield.o \
prioq.o trigger.o fmtqfn.o quote.o now.o readsubdir.o \
qmail.o date822fmt.o datetime.a case.a ndelay.a getln.a \
wait.a seek.a fd.a sig.a open.a lock.a stralloc.a alloc.a \
- substdio.a error.a str.a fs.a auto_qmail.o auto_split.o
+ substdio.a error.a str.a fs.a auto_qmail.o auto_split.o \
+ -I/usr/local/include -L/usr/local/lib -lsrs2
qmail-send.0: \
qmail-send.8
@@ -1910,6 +1913,23 @@
compile splogger.c error.h substdio.h subfd.h substdio.h exit.h str.h \
scan.h fmt.h
./compile splogger.c
+
+srs.o: \
+compile srs.c srs.h auto_qmail.h stralloc.h
+ ./compile srs.c
+
+
+srsfilter: \
+load srsfilter.o srs.o qmail.o strerr.a control.o rcpthosts.o constmap.o cdb.a case.a open.a stralloc.a alloc.a getln.a \
+ fd.a wait.a sig.a env.a substdio.a error.a str.a fs.a auto_qmail.o
+ ./load srsfilter srs.o qmail.o strerr.a control.o rcpthosts.o constmap.o cdb.a case.a open.a stralloc.a alloc.a getln.a \
+ fd.a wait.a sig.a env.a substdio.a error.a str.a fs.a auto_qmail.o \
+ -I/usr/local/include -L/usr/local/lib -lsrs2
+
+srsfilter.o: \
+compile srsfilter.c sig.h readwrite.h exit.h env.h qmail.h substdio.h strerr.h substdio.h fmt.h stralloc.h srs.h
+ ./compile srsfilter.c
+
str.a: \
makelib str_len.o str_diff.o str_diffn.o str_cpy.o str_chr.o \
diff -Nu qmail-1.03.orig/TARGETS qmail-1.03/TARGETS
--- qmail-1.03.orig/TARGETS Mon Jun 15 07:53:16 1998
+++ qmail-1.03/TARGETS Fri Dec 15 14:58:33 2006
@@ -171,6 +171,10 @@
timeoutconn.o
tcpto.o
dns.o
+srsfilter
+srsfilter.o
+srs
+srs.o
ip.o
ipalloc.o
hassalen.h
diff -Nu qmail-1.03.orig/hier.c qmail-1.03/hier.c
--- qmail-1.03.orig/hier.c Mon Jun 15 07:53:16 1998
+++ qmail-1.03/hier.c Fri Dec 15 14:59:07 2006
@@ -127,6 +127,7 @@
c(auto_qmail,"bin","qmail-qmqpd",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","qmail-qmtpd",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","qmail-smtpd",auto_uido,auto_gidq,0755);
+ c(auto_qmail,"bin","srsfilter",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","sendmail",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","tcp-env",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","qreceipt",auto_uido,auto_gidq,0755);
diff -Nu qmail-1.03.orig/install-big.c qmail-1.03/install-big.c
--- qmail-1.03.orig/install-big.c Mon Jun 15 07:53:16 1998
+++ qmail-1.03/install-big.c Fri Dec 15 14:58:39 2006
@@ -133,6 +133,7 @@
c(auto_qmail,"bin","qsmhook",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","qbiff",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","forward",auto_uido,auto_gidq,0755);
+ c(auto_qmail,"bin","srsfilter",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","preline",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","condredirect",auto_uido,auto_gidq,0755);
c(auto_qmail,"bin","bouncesaying",auto_uido,auto_gidq,0755);
diff -Nu qmail-1.03.orig/qmail-inject.c qmail-1.03/qmail-inject.c
--- qmail-1.03.orig/qmail-inject.c Mon Jun 15 07:53:16 1998
+++ qmail-1.03/qmail-inject.c Fri Dec 15 14:55:20 2006
@@ -22,6 +22,7 @@
#include "auto_qmail.h"
#include "newfield.h"
#include "constmap.h"
+#include "srs.h"
#define LINELEN 80
@@ -61,6 +62,8 @@
void temp() { _exit(111); }
void die_nomem() {
substdio_putsflush(subfderr,"qmail-inject: fatal: out of memory\n"); temp(); }
+void die_srs() {
+ substdio_putsflush(subfderr,"qmail-inject: fatal: unable to rewrite envelope\n"); perm(); }
void die_invalid(sa) stralloc *sa; {
substdio_putsflush(subfderr,"qmail-inject: fatal: invalid header field: ");
substdio_putflush(subfderr,sa->s,sa->len); perm(); }
@@ -99,6 +102,15 @@
int i;
if (!stralloc_0(&sender)) die_nomem();
+
+ switch(srsforward(sender.s)) {
+ case -3: die_srs(); break;
+ case -2: die_nomem(); break;
+ case -1: die_read(); break;
+ case 0: break;
+ case 1: if (!stralloc_copy(&sender,&srs_result)) die_nomem(); break;
+ }
+
qmail_from(&qqt,sender.s);
for (i = 0;i < reciplist.len;++i)
diff -Nu qmail-1.03.orig/qmail-local.c qmail-1.03/qmail-local.c
--- qmail-1.03.orig/qmail-local.c Mon Jun 15 07:53:16 1998
+++ qmail-1.03/qmail-local.c Fri Dec 15 14:54:30 2006
@@ -28,6 +28,7 @@
#include "myctime.h"
#include "gfrom.h"
#include "auto_patrn.h"
+#include "srs.h"
void usage() { strerr_die1x(100,"qmail-local: usage: qmail-local [ -nN ] user homedir local dash ext domain sender aliasempty"); }
@@ -67,6 +68,14 @@
char buf[1024];
char outbuf[1024];
+void die_control() { strerr_die1x(111,"Unable to read controls (#4.3.0)"); }
+void die_srs() {
+ if (!stralloc_copys(&foo,srs_error.s)) temp_nomem();
+ if (!stralloc_cats(&foo," (#4.3.0)")) temp_nomem();
+ if (!stralloc_0(&foo)) temp_nomem();
+ strerr_die1x(111,foo.s);
+}
+
/* child process */
char fntmptph[80 + FMT_ULONG * 2];
@@ -282,6 +291,15 @@
qmail_put(&qqt,messline.s,messline.len);
}
while (match);
+
+ switch(srsforward(ueo.s)) {
+ case -3: die_srs(); break;
+ case -2: temp_nomem(); break;
+ case -1: die_control(); break;
+ case 0: break;
+ case 1: if (!stralloc_copy(&ueo,&srs_result)) temp_nomem(); break;
+ }
+
qmail_from(&qqt,ueo.s);
while (*recips) qmail_to(&qqt,*recips++);
qqx = qmail_close(&qqt);
diff -Nu qmail-1.03.orig/qmail-send.c qmail-1.03/qmail-send.c
--- qmail-1.03.orig/qmail-send.c Mon Jun 15 07:53:16 1998
+++ qmail-1.03/qmail-send.c Fri Dec 15 14:56:34 2006
@@ -31,6 +31,7 @@
#include "constmap.h"
#include "fmtqfn.h"
#include "readsubdir.h"
+#include "srs.h"
/* critical timing feature #1: if not triggered, do not busy-loop */
/* critical timing feature #2: if triggered, respond within fixed time */
@@ -55,6 +56,7 @@
stralloc bouncehost = {0};
stralloc doublebounceto = {0};
stralloc doublebouncehost = {0};
+stralloc srs_domain = {0};
char strnum2[FMT_ULONG];
char strnum3[FMT_ULONG];
@@ -689,9 +691,28 @@
{ log1("warning: unable to start qmail-queue, will try later\n"); return 0; }
qp = qmail_qp(&qqt);
- if (*sender.s) { bouncesender = ""; bouncerecip = sender.s; }
- else { bouncesender = "#@[]"; bouncerecip = doublebounceto.s; }
-
+ if (*sender.s) {
+ int j = 0;
+ j = byte_rchr(sender.s, sender.len, '@');
+ if (j < sender.len) {
+ if (srs_domain.len == sender.len - j - 1 && stralloc_starts(&srs_domain, sender.s + j + 1)) {
+ switch(srsreverse(sender.s)) {
+ case -3: log1(srs_error.s); log1("\n"); _exit(111); break;
+ case -2: nomem(); break;
+ case -1: log1("alert: unable to read controls\n"); _exit(111); break;
+ case 0: break;
+ case 1: if (!stralloc_copy(&sender,&srs_result)) nomem(); break;
+ }
+ if (chdir("queue") == -1) { log1("alert: unable to switch to queue directory\n"); _exit(111); }
+ }
+ }
+ bouncesender = "";
+ bouncerecip = sender.s;
+ } else {
+ bouncesender = "#@[]";
+ bouncerecip = doublebounceto.s;
+ }
+
while (!newfield_datemake(now())) nomem();
qmail_put(&qqt,newfield_date.s,newfield_date.len);
qmail_puts(&qqt,"From: ");
@@ -1449,6 +1470,8 @@
if (control_rldef(&bouncefrom,"control/bouncefrom",0,"MAILER-DAEMON") != 1) return 0;
if (control_rldef(&bouncehost,"control/bouncehost",1,"bouncehost") != 1) return 0;
if (control_rldef(&doublebouncehost,"control/doublebouncehost",1,"doublebouncehost") != 1) return 0;
+ if (control_readline(&srs_domain,"control/srs_domain") == -1) return 0;
+ if (srs_domain.len && !stralloc_0(&srs_domain)) return 0;
if (control_rldef(&doublebounceto,"control/doublebounceto",0,"postmaster") != 1) return 0;
if (!stralloc_cats(&doublebounceto,"@")) return 0;
if (!stralloc_cat(&doublebounceto,&doublebouncehost)) return 0;
diff -Nu qmail-1.03.orig/qmail-showctl.c qmail-1.03/qmail-showctl.c
--- qmail-1.03.orig/qmail-showctl.c Mon Jun 15 07:53:16 1998
+++ qmail-1.03/qmail-showctl.c Fri Dec 15 14:57:33 2006
@@ -257,6 +257,11 @@
do_str("smtpgreeting",1,"smtpgreeting","SMTP greeting: 220 ");
do_lst("smtproutes","No artificial SMTP routes.","SMTP route: ","");
+ do_str("srs_domain",0,"","SRS domain name is ");
+ do_lst("srs_secrets","No secrets","","");
+ do_int("srs_maxage","21","SRS maxage is ","");
+ do_int("srs_hashlength","4","SRS hashlength is ","");
+ do_int("srs_hashmin","4","SRS hashmin is ","");
do_int("timeoutconnect","60","SMTP client connection timeout is "," seconds");
do_int("timeoutremote","1200","SMTP client data timeout is "," seconds");
do_int("timeoutsmtpd","1200","SMTP server data timeout is "," seconds");
@@ -292,6 +297,11 @@
if (str_equal(d->d_name,"rcpthosts")) continue;
if (str_equal(d->d_name,"smtpgreeting")) continue;
if (str_equal(d->d_name,"smtproutes")) continue;
+ if (str_equal(d->d_name,"srs_domain")) continue;
+ if (str_equal(d->d_name,"srs_secrets")) continue;
+ if (str_equal(d->d_name,"srs_maxage")) continue;
+ if (str_equal(d->d_name,"srs_hashlength")) continue;
+ if (str_equal(d->d_name,"srs_hashmin")) continue;
if (str_equal(d->d_name,"timeoutconnect")) continue;
if (str_equal(d->d_name,"timeoutremote")) continue;
if (str_equal(d->d_name,"timeoutsmtpd")) continue;
diff -Nu qmail-1.03.orig/srs.c qmail-1.03/srs.c
--- qmail-1.03.orig/srs.c Wed Dec 31 21:00:00 1969
+++ qmail-1.03/srs.c Fri Dec 15 14:53:25 2006
@@ -0,0 +1,149 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include </usr/local/include/srs2.h>
+#include "auto_qmail.h"
+#include "stralloc.h"
+#include "srs.h"
+
+
+static stralloc srs_domain = {0};
+static stralloc srs_secrets = {0};
+static unsigned int srs_maxage = 21;
+static unsigned int srs_hashlength = 4;
+static unsigned int srs_hashmin = 4;
+stralloc srs_result = {0};
+stralloc srs_error = {0};
+
+static int setup_ok = 0;
+static int srs_secrets_ok = 0;
+
+static int setup(int with_rcpthosts) {
+
+ if (setup_ok == 1) return 1;
+
+ if (chdir(auto_qmail) == -1) return -1;
+
+ if (control_init() == -1) return -1;
+
+ if (control_readline(&srs_domain,"control/srs_domain") == -1) return -1;
+ if (srs_domain.len) {
+ if (!stralloc_0(&srs_domain)) return -2;
+ } else {
+ return 0;
+ }
+
+ srs_secrets_ok = control_readfile(&srs_secrets,"control/srs_secrets",0);
+ if (srs_secrets_ok == -1) return -1;
+
+ if (control_readint(&srs_maxage,"control/srs_maxage") == -1) return 0;
+ if (control_readint(&srs_maxage,"control/srs_hashlength") == -1) return 0;
+ if (control_readint(&srs_maxage,"control/srs_hashmin") == -1) return 0;
+ if (srs_hashmin > srs_hashlength) srs_hashmin = srs_hashlength;
+
+ if (with_rcpthosts && rcpthosts_init() == -1) return -1;
+
+ setup_ok = 1;
+ return 1;
+
+}
+
+int srsforward(char *address) {
+
+ int x = 0;
+
+ x = setup(1);
+
+ /* Return if setup was unsucessfull */
+ if (x < 1) return(x);
+
+ x = str_len(address);
+
+ /* Return zero if null-sender */
+ if (x <= 1) return 0;
+
+ /* Return zero if local address */
+ if (rcpthosts(address,x) == 1) return 0;
+
+ /* Now it's time to rewrite the envelope */
+ char srsaddress[1000];
+
+ srs_t *srs;
+ srs = srs_new();
+ srs->maxage = srs_maxage;
+ srs->hashlength = srs_hashlength;
+ srs->hashmin = srs_hashmin;
+
+ int i = 0;
+ int j = 0;
+ for (j = 0;j < srs_secrets.len;++j)
+ if (!srs_secrets.s[j]) {
+ x = srs_add_secret(srs, srs_secrets.s + i);
+ if (x != SRS_SUCCESS) return srs_error_str(x);
+ i = j + 1;
+ }
+
+ x = srs_forward(srs, srsaddress, 1000, address, srs_domain.s);
+ if (x != SRS_SUCCESS) return srs_error_str(x);
+
+ if (!stralloc_copys(&srs_result,srsaddress)) return -2;
+ if (!stralloc_0(&srs_result)) return -2;
+
+ srs_free(srs);
+
+ return 1;
+
+}
+
+
+int srsreverse(char *srsaddress) {
+
+ int x = 0;
+
+ x = setup(0);
+
+ /* Return if setup was unsucessfull */
+ if (x < 1) return(x);
+
+ x = str_len(srsaddress);
+
+ /* Return error if null-sender */
+ if (x <= 1) return -3;
+
+ /* Now it's time to rewrite the envelope */
+ char address[1000];
+
+ srs_t *srs;
+ srs = srs_new();
+ srs->maxage = srs_maxage;
+ srs->hashlength = srs_hashlength;
+ srs->hashmin = srs_hashmin;
+
+ int i = 0;
+ int j = 0;
+ for (j = 0;j < srs_secrets.len;++j)
+ if (!srs_secrets.s[j]) {
+ x = srs_add_secret(srs, srs_secrets.s + i);
+ if (x != SRS_SUCCESS) return srs_error_str(x);
+ i = j + 1;
+ }
+
+ x = srs_reverse(srs, address, 1000, srsaddress);
+ if (x != SRS_SUCCESS) return srs_error_str(x);
+
+ if (!stralloc_copys(&srs_result,address)) return -2;
+ if (!stralloc_0(&srs_result)) return -2;
+
+ srs_free(srs);
+
+ return 1;
+
+}
+
+int srs_error_str(int code) {
+ if (!stralloc_copys(&srs_error,"SRS: ")) return -2;
+ if (!stralloc_cats(&srs_error,srs_strerror(code))) return -2;
+ if (!stralloc_0(&srs_error)) return -2;
+ return -3;
+}
+
+
diff -Nu qmail-1.03.orig/srs.h qmail-1.03/srs.h
--- qmail-1.03.orig/srs.h Wed Dec 31 21:00:00 1969
+++ qmail-1.03/srs.h Fri Dec 15 14:53:30 2006
@@ -0,0 +1,10 @@
+#ifndef SRS_H
+#define SRS_H
+
+extern stralloc srs_result;
+extern stralloc srs_error;
+extern int srsforward(char *);
+extern int srsreverse(char *);
+
+#endif
+
diff -Nu qmail-1.03.orig/srsfilter.c qmail-1.03/srsfilter.c
--- qmail-1.03.orig/srsfilter.c Wed Dec 31 21:00:00 1969
+++ qmail-1.03/srsfilter.c Fri Dec 15 14:53:12 2006
@@ -0,0 +1,74 @@
+#include "sig.h"
+#include "readwrite.h"
+#include "exit.h"
+#include "env.h"
+#include "qmail.h"
+#include "strerr.h"
+#include "substdio.h"
+#include "fmt.h"
+#include "stralloc.h"
+#include "srs.h"
+
+#define FATAL "srsfilter: fatal: "
+
+void die_nomem() { strerr_die2x(111,FATAL,"out of memory"); }
+
+struct qmail qqt;
+
+int mywrite(fd,buf,len) int fd; char *buf; int len;
+{
+ qmail_put(&qqt,buf,len);
+ return len;
+}
+
+char inbuf[SUBSTDIO_INSIZE];
+char outbuf[1];
+substdio ssin = SUBSTDIO_FDBUF(read,0,inbuf,sizeof inbuf);
+substdio ssout = SUBSTDIO_FDBUF(mywrite,-1,outbuf,sizeof outbuf);
+
+char num[FMT_ULONG];
+
+void main(argc,argv)
+int argc;
+char **argv;
+{
+ char *ext2;
+ char *host;
+ char *qqx;
+
+ sig_pipeignore();
+
+ ext2 = env_get("EXT2");
+ if (!ext2)
+ strerr_die2x(100,FATAL,"EXT2 not set");
+ host = env_get("HOST");
+ if (!host)
+ strerr_die2x(100,FATAL,"HOST not set");
+
+ switch(srsreverse(ext2)) {
+ case -3: strerr_die2x(111,FATAL,srs_error.s); break;
+ case -2: die_nomem(); break;
+ case -1: strerr_die2x(111,FATAL,"unable to read controls"); break;
+ case 0: strerr_die2x(100,FATAL,"unable to rewrite envelope"); break;
+ }
+
+ if (qmail_open(&qqt) == -1)
+ strerr_die2x(111,FATAL,"unable to fork");
+ if (substdio_copy(&ssout,&ssin) != 0)
+ strerr_die2x(111,FATAL,"unable to read message");
+ substdio_flush(&ssout);
+
+ num[fmt_ulong(num,qmail_qp(&qqt))] = 0;
+
+ /* Always from nullsender */
+ qmail_from(&qqt,"");
+
+ qmail_to(&qqt,srs_result.s);
+
+ qqx = qmail_close(&qqt);
+ if (*qqx) strerr_die2x(*qqx == 'D' ? 100 : 111,FATAL,qqx + 1);
+ strerr_die2x(0,"srsfilter: qp ",num);
+
+}
+
+
More information about the masoch-l
mailing list