Download | Plain Text | No Line Numbers


  1. --- Makefile.orig Fri Dec 29 02:54:34 2006
  2. +++ Makefile Fri Dec 29 02:54:43 2006
  3. @@ -657,6 +657,16 @@
  4. compile gfrom.c str.h gfrom.h
  5. ./compile gfrom.c
  6.  
  7. +greetdelay: \
  8. +load greetdelay.o scan_ulong.o timeoutread.o timeoutwrite.o strerr.a \
  9. +substdio.a env.a error.a str.a
  10. + ./load greetdelay scan_ulong.o timeoutread.o timeoutwrite.o strerr.a \
  11. + substdio.a env.a error.a str.a
  12. +
  13. +greetdelay.o: \
  14. +compile greetdelay.c substdio.h env.h timeoutread.h error.h strerr.h
  15. + ./compile greetdelay.c
  16. +
  17. hasflock.h: \
  18. tryflock.c compile load
  19. ( ( ./compile tryflock.c && ./load tryflock ) >/dev/null \
  20. @@ -832,3 +842,3 @@
  21. forward preline condredirect bouncesaying except maildirmake \
  22. -maildir2mbox maildirwatch qail elq pinq idedit install-big install \
  23. +maildir2mbox maildirwatch qail elq greetdelay pinq idedit install-big install \
  24. instcheck home home+df proc proc+df binm1 binm1+df binm2 binm2+df \
  25. --- TARGETS.orig Fri Dec 29 15:01:04 2006
  26. +++ TARGETS Fri Dec 29 15:03:39 2006
  27. @@ -303,6 +303,8 @@
  28. qsmhook
  29. qbiff.o
  30. qbiff
  31. +greetdelay.o
  32. +greetdelay
  33. forward.o
  34. forward
  35. preline.o
  36. --- FILES.orig Fri Dec 29 15:06:09 2006
  37. +++ FILES Fri Dec 29 15:05:52 2006
  38. @@ -144,6 +144,7 @@
  39. qreceipt.c
  40. qsmhook.c
  41. qbiff.c
  42. +greetdelay.c
  43. forward.c
  44. preline.c
  45. predate.c
  46. --- /dev/null Fri Dec 29 02:56:54 2006
  47. +++ /root/greetdelay.c Fri Dec 29 02:43:04 2006
  48. @@ -0,0 +1,70 @@
  49. +#include "substdio.h"
  50. +#include "env.h"
  51. +#include "timeoutread.h"
  52. +#include "error.h"
  53. +#include "strerr.h"
  54. +
  55. +unsigned int greetdelay = 0;
  56. +unsigned int drop_pre_greet = 0;
  57. +int timeout = 1200;
  58. +
  59. +int safewrite(fd,buf,len) int fd; char *buf; int len;
  60. +{
  61. + int r;
  62. + r = timeoutwrite(timeout,fd,buf,len);
  63. + if (r <= 0) _exit(1);
  64. + return r;
  65. +}
  66. +
  67. +char ssoutbuf[512];
  68. +char ssinbuf[1024];
  69. +substdio ssout = SUBSTDIO_FDBUF(safewrite,1,ssoutbuf,sizeof ssoutbuf);
  70. +void die_pre_greet() { substdio_puts(&ssout, "554 SMTP protocol violation\r\n"); substdio_flush(&ssout); exit(1); }
  71. +
  72. +void main(argc,argv)
  73. +int argc;
  74. +char **argv;
  75. +{
  76. + char *remoteip;
  77. + char *x;
  78. + unsigned long u;
  79. + int n, m;
  80. +
  81. + x = env_get("GREETDELAY");
  82. + if (x) { scan_ulong(x, &u); greetdelay = u; }
  83. + x = env_get("DROP_PRE_GREET");
  84. + if (x) { scan_ulong(x, &u); drop_pre_greet = u; }
  85. + remoteip = env_get("TCPREMOTEIP");
  86. + if (!remoteip) remoteip = "unknown";
  87. +
  88. + if (!env_get("RELAYCLIENT") && greetdelay) {
  89. + if (drop_pre_greet) {
  90. + n = timeoutread(greetdelay ? greetdelay : 1, 0, ssinbuf, sizeof(ssinbuf));
  91. + if(n == -1) {
  92. + if (errno != error_timeout)
  93. + strerr_die3sys(1, "GREETDELAY from ", remoteip, ": ");
  94. + } else if (n == 0) {
  95. + strerr_die3x(1, "GREETDELAY from ", remoteip, ": client disconnected");
  96. + } else {
  97. + strerr_warn3("GREETDELAY from ", remoteip, ": client sent data before greeting", 0);
  98. + die_pre_greet();
  99. + }
  100. + }
  101. + else {
  102. + sleep(greetdelay);
  103. + m = 0;
  104. + for (;;) {
  105. + n = timeoutread(0, 0, ssinbuf, sizeof(ssinbuf));
  106. + if (n <= 0)
  107. + break;
  108. + if (n > 0 && m == 0) {
  109. + strerr_warn3("GREETDELAY from ", remoteip, ": client sent data before greeting. ignoring", 0);
  110. + m = 1;
  111. + }
  112. + }
  113. + }
  114. + }
  115. + if (argv[1])
  116. + execvp(argv[1], argv + 1);
  117. + _exit(0);
  118. +}
  119.