Download | Plain Text | No Line Numbers
- --- Makefile.orig Fri Dec 29 02:54:34 2006
- +++ Makefile Fri Dec 29 02:54:43 2006
- @@ -657,6 +657,16 @@
- compile gfrom.c str.h gfrom.h
- ./compile gfrom.c
-
- +greetdelay: \
- +load greetdelay.o scan_ulong.o timeoutread.o timeoutwrite.o strerr.a \
- +substdio.a env.a error.a str.a
- + ./load greetdelay scan_ulong.o timeoutread.o timeoutwrite.o strerr.a \
- + substdio.a env.a error.a str.a
- +
- +greetdelay.o: \
- +compile greetdelay.c substdio.h env.h timeoutread.h error.h strerr.h
- + ./compile greetdelay.c
- +
- hasflock.h: \
- tryflock.c compile load
- ( ( ./compile tryflock.c && ./load tryflock ) >/dev/null \
- @@ -832,3 +842,3 @@
- forward preline condredirect bouncesaying except maildirmake \
- -maildir2mbox maildirwatch qail elq pinq idedit install-big install \
- +maildir2mbox maildirwatch qail elq greetdelay pinq idedit install-big install \
- instcheck home home+df proc proc+df binm1 binm1+df binm2 binm2+df \
- --- TARGETS.orig Fri Dec 29 15:01:04 2006
- +++ TARGETS Fri Dec 29 15:03:39 2006
- @@ -303,6 +303,8 @@
- qsmhook
- qbiff.o
- qbiff
- +greetdelay.o
- +greetdelay
- forward.o
- forward
- preline.o
- --- FILES.orig Fri Dec 29 15:06:09 2006
- +++ FILES Fri Dec 29 15:05:52 2006
- @@ -144,6 +144,7 @@
- qreceipt.c
- qsmhook.c
- qbiff.c
- +greetdelay.c
- forward.c
- preline.c
- predate.c
- --- /dev/null Fri Dec 29 02:56:54 2006
- +++ /root/greetdelay.c Fri Dec 29 02:43:04 2006
- @@ -0,0 +1,70 @@
- +#include "substdio.h"
- +#include "env.h"
- +#include "timeoutread.h"
- +#include "error.h"
- +#include "strerr.h"
- +
- +unsigned int greetdelay = 0;
- +unsigned int drop_pre_greet = 0;
- +int timeout = 1200;
- +
- +int safewrite(fd,buf,len) int fd; char *buf; int len;
- +{
- + int r;
- + r = timeoutwrite(timeout,fd,buf,len);
- + if (r <= 0) _exit(1);
- + return r;
- +}
- +
- +char ssoutbuf[512];
- +char ssinbuf[1024];
- +substdio ssout = SUBSTDIO_FDBUF(safewrite,1,ssoutbuf,sizeof ssoutbuf);
- +void die_pre_greet() { substdio_puts(&ssout, "554 SMTP protocol violation\r\n"); substdio_flush(&ssout); exit(1); }
- +
- +void main(argc,argv)
- +int argc;
- +char **argv;
- +{
- + char *remoteip;
- + char *x;
- + unsigned long u;
- + int n, m;
- +
- + x = env_get("GREETDELAY");
- + if (x) { scan_ulong(x, &u); greetdelay = u; }
- + x = env_get("DROP_PRE_GREET");
- + if (x) { scan_ulong(x, &u); drop_pre_greet = u; }
- + remoteip = env_get("TCPREMOTEIP");
- + if (!remoteip) remoteip = "unknown";
- +
- + if (!env_get("RELAYCLIENT") && greetdelay) {
- + if (drop_pre_greet) {
- + n = timeoutread(greetdelay ? greetdelay : 1, 0, ssinbuf, sizeof(ssinbuf));
- + if(n == -1) {
- + if (errno != error_timeout)
- + strerr_die3sys(1, "GREETDELAY from ", remoteip, ": ");
- + } else if (n == 0) {
- + strerr_die3x(1, "GREETDELAY from ", remoteip, ": client disconnected");
- + } else {
- + strerr_warn3("GREETDELAY from ", remoteip, ": client sent data before greeting", 0);
- + die_pre_greet();
- + }
- + }
- + else {
- + sleep(greetdelay);
- + m = 0;
- + for (;;) {
- + n = timeoutread(0, 0, ssinbuf, sizeof(ssinbuf));
- + if (n <= 0)
- + break;
- + if (n > 0 && m == 0) {
- + strerr_warn3("GREETDELAY from ", remoteip, ": client sent data before greeting. ignoring", 0);
- + m = 1;
- + }
- + }
- + }
- + }
- + if (argv[1])
- + execvp(argv[1], argv + 1);
- + _exit(0);
- +}
-