Cleanup: remove #ifdef MIGRATION_WARNING transitional code
from postscreen. File: postscreen/postscreen.c.
-20110124
+20110125
- Cleanup: use the right primitive to flush responses when
- the Postfix SMTP server is taking an excessive amount of
- time to process client requests. File: smtpd/smtpd_chat.c.
+ Cleaned up and finalized read/write deadline support. Once
+ this code has been fielded it can go into Postfix 2.8.1,
+ and made available as optional patch for earlier releases.
+ Further refinements have only dimishing returns and can
+ evolve in the 2.9 release cycle. File: util/vstream.c.
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20110125"
+#define MAIL_RELEASE_DATE "20110126"
#define MAIL_VERSION_NUMBER "2.9"
#ifdef SNAPSHOT
/* VSTREAM *stream;
/* int timeout;
/*
-/* void smtp_timeout_reset(stream)
-/* VSTREAM *stream;
-/*
/* void smtp_printf(stream, format, ...)
/* VSTREAM *stream;
/* const char *format;
/* .IP \f(bu
/* The stream is configured to enable exception handling.
/* .PP
-/* smtp_timeout_reset() clears the error flags and restarts
-/* the deadline timer for the named stream. This leaves the
-/* stream in a state that is suitable for the final "flush
-/* before close" operation, without depending on any other
-/* primitives provided by this module.
-/*
/* smtp_printf() formats its arguments and writes the result to
/* the named stream, followed by a CR LF pair. The stream is NOT flushed.
/* Long lines of text are not broken.
#include "smtp_stream.h"
-/* smtp_timeout_reset - reset per-stream error flags and read/write deadline */
+/* smtp_timeout_reset - reset per-stream error flags, restart deadline timer */
-void smtp_timeout_reset(VSTREAM *stream)
+static void smtp_timeout_reset(VSTREAM *stream)
{
vstream_clearerr(stream);
void smtp_fputs(const char *cp, ssize_t todo, VSTREAM *stream)
{
- ssize_t err;
+ ssize_t err;
if (todo < 0)
msg_panic("smtp_fputs: negative todo %ld", (long) todo);
void smtp_fwrite(const char *cp, ssize_t todo, VSTREAM *stream)
{
- ssize_t err;
+ ssize_t err;
if (todo < 0)
msg_panic("smtp_fwrite: negative todo %ld", (long) todo);
#define SMTP_ERR_NONE 4 /* non-error case */
extern void smtp_timeout_setup(VSTREAM *, int);
-extern void smtp_timeout_reset(VSTREAM *);
extern void PRINTFLIKE(2, 3) smtp_printf(VSTREAM *, const char *,...);
extern void smtp_flush(VSTREAM *);
extern int smtp_fgetc(VSTREAM *);
}
break;
}
- smtp_timeout_reset(state->client);
/*
* XXX The client connection count/rate control must be consistent in its
* delays (tarpit delays or DNS lookups for UCE restrictions).
*/
if (delay || time((time_t *) 0) - vstream_ftime(state->client) > 10)
- smtp_flush(state->client); /* fix 20110124 */
+ vstream_fflush(state->client);
/*
* Abort immediately if the connection is broken.
timeout = stream->timeout;
if ((n = stream->write_fn(stream->fd, data, len, timeout, stream->context)) <= 0) {
bp->flags |= VSTREAM_FLAG_ERR;
- if (errno == ETIMEDOUT)
+ if (errno == ETIMEDOUT) {
bp->flags |= VSTREAM_FLAG_TIMEOUT;
+ stream->time_limit.tv_sec = stream->time_limit.tv_usec = 0;
+ }
return (VSTREAM_EOF);
}
if (timeout)
switch (n = stream->read_fn(stream->fd, bp->data, bp->len, timeout, stream->context)) {
case -1:
bp->flags |= VSTREAM_FLAG_ERR;
- if (errno == ETIMEDOUT)
+ if (errno == ETIMEDOUT) {
bp->flags |= VSTREAM_FLAG_TIMEOUT;
+ stream->time_limit.tv_sec = stream->time_limit.tv_usec = 0;
+ }
return (VSTREAM_EOF);
case 0:
bp->flags |= VSTREAM_FLAG_EOF;