Original Author: Simon J. Mudd
postfix-2.9-20110130-multiline-greeting.patch
postfix-2.9-20110130-multiline-greeting.patch (296)
diff -C1 -r postfix-2.9-20110130/src/smtpd/smtpd.c postfix-2.9-20110130.patched/src/smtpd/smtpd.c
*** postfix-2.9-20110130/src/smtpd/smtpd.c Wed Jan 26 01:30:14 2011
--- postfix-2.9-20110130.patched/src/smtpd/smtpd.c Mon Jan 31 13:35:51 2011
***************
*** 4529,4531 ****
} else {
! smtpd_chat_reply(state, "220 %s", var_smtpd_banner);
}
--- 4529,4531 ----
} else {
! smtpd_chat_reply_multiline(state, 220, var_smtpd_banner);
}
diff -C1 -r postfix-2.9-20110130/src/smtpd/smtpd_chat.c postfix-2.9-20110130.patched/src/smtpd/smtpd_chat.c
*** postfix-2.9-20110130/src/smtpd/smtpd_chat.c Tue Jan 25 21:53:32 2011
--- postfix-2.9-20110130.patched/src/smtpd/smtpd_chat.c Mon Jan 31 13:35:51 2011
***************
*** 64,65 ****
--- 64,66 ----
#include <stdarg.h>
+ #include <ctype.h>
***************
*** 217,218 ****
--- 218,274 ----
state->flags |= SMTPD_FLAG_HANGUP;
+ }
+
+ /* trim_line - remove trailing whitespace and return a pointer to the first */
+ /* non-space char in the string. Based on TRIM() in ../util/dict.c */
+ /* WARNING: this function is DESTRUCTIVE. */
+
+ static char *trim_line( char *line ) {
+ char *p;
+
+ for (p=line + strlen(line); p > line && ISSPACE(p[-1]); p--);
+ *p = 0;
+
+ while ( ISSPACE(*line) )
+ ++line;
+
+ return ( line );
+ }
+
+ /* smtpd_chat_reply_multiline - convert multline string into seperate */
+ /* lines, sending each one to smtpd_chat_reply() */
+
+ #define LINE_SEPARATOR "\n"
+
+ void smtpd_chat_reply_multiline(SMTPD_STATE *state, int smtp_reply_code, char *format,...)
+ {
+ va_list ap;
+ char *line, *line2; /* one line (of the multiline) reply */
+ size_t size; /* size of a single line */
+ static VSTRING *temp_line; /* SMTP reply before unescapeing */
+ static VSTRING *multiline; /* SMTP reply after unescaping */
+
+ /* First-time intialization. */
+ if (!temp_line)
+ temp_line = vstring_alloc(512);
+ if (!multiline)
+ multiline = vstring_alloc(512);
+
+ va_start(ap, format);
+ vstring_vsprintf(temp_line, format, ap);
+ va_end(ap);
+
+ /* unescape lines with "\\n", converting them to "\n" */
+ unescape( multiline, STR(temp_line) );
+
+ line = STR(multiline);
+ while ( (size = strcspn(line, LINE_SEPARATOR)) < strlen(line) ) {
+ *(line + size) = 0;
+
+ line2 = trim_line(line);
+ smtpd_chat_reply(state, "%03d-%s", smtp_reply_code, line2);
+
+ line += size + 1;
+ }
+ line2 = trim_line(line);
+ smtpd_chat_reply(state, "%03d %s", smtp_reply_code, line2);
}
diff -C1 -r postfix-2.9-20110130/src/smtpd/smtpd_chat.h postfix-2.9-20110130.patched/src/smtpd/smtpd_chat.h
*** postfix-2.9-20110130/src/smtpd/smtpd_chat.h Tue Apr 25 01:48:28 2006
--- postfix-2.9-20110130.patched/src/smtpd/smtpd_chat.h Mon Jan 31 13:35:51 2011
***************
*** 17,18 ****
--- 17,19 ----
extern void PRINTFLIKE(2, 3) smtpd_chat_reply(SMTPD_STATE *, const char *, ...);
+ extern void smtpd_chat_reply_multiline(SMTPD_STATE *, int, char *, ...);
extern void smtpd_chat_notify(SMTPD_STATE *);