167 static void smtp_chat_append(
SMTP_SESSION *session,
const char *direction,
191 smtp_chat_append(session,
"Out: ",
STR(session->
buffer));
242 const char *new_reply;
243 int chat_append_flag;
244 int chat_append_skipped = 0;
268 if (last_char !=
'\n')
269 msg_warn(
"%s: response longer than %d: %.30s...",
279 if (chat_append_flag)
280 smtp_chat_append(session,
"In: ",
STR(session->
buffer));
282 if (chat_append_skipped == 0)
283 msg_warn(
"%s: multi-line response longer than %d %.30s...",
285 if (chat_append_skipped < INT_MAX)
286 chat_append_skipped++;
293 if (smtp_chat_resp_filter != 0) {
295 if (new_reply != 0) {
296 msg_info(
"%s: replacing server reply \"%s\" with \"%s\"",
299 if (chat_append_flag) {
300 smtp_chat_append(session,
"Replaced-by: ",
"");
301 smtp_chat_append(session,
" ", new_reply);
303 }
else if (smtp_chat_resp_filter->
error != 0) {
304 msg_warn(
"%s: table %s:%s lookup error for %s",
306 smtp_chat_resp_filter->
type,
307 smtp_chat_resp_filter->
name,
312 if (chat_append_flag) {
323 if ((three_digs = (cp -
STR(session->
buffer) == 3)) != 0) {
326 if (*cp ==
' ' || *cp == 0)
360 msg_warn(
"%s: non-%s response from %s: %.100s",
365 msg_warn(
"to prevent loss of mail, turn off command pipelining "
366 "for %s with the %s parameter",
402 if (three_digs != 0) {
404 if (strchr(
"245",
STR(session->
buffer)[0]) != 0) {
405 for (cp =
STR(session->
buffer) + 4; *cp ==
' '; cp++)
424 static void print_line(
const char *str,
int len,
int indent,
void *context)
435 const char *myname =
"smtp_chat_notify";
443 msg_panic(
"%s: no conversation history", myname);
445 msg_info(
"%s: notify postmaster", myname);
454 #define NULL_TRACE_FLAGS 0
455 #define NO_QUEUE_ID ((VSTRING *) 0)
int post_mail_fprintf(VSTREAM *cleanup, const char *format,...)
size_t dsn_valid(const char *text)
ARGV * argv_free(ARGV *argvp)
#define SMTPUTF8_FLAG_NONE
void line_wrap(const char *str, int len, int indent, LINE_WRAP_FN output_fn, void *context)
NORETURN msg_panic(const char *fmt,...)
DELIVER_REQUEST * request
const char * mail_addr_mail_daemon(void)
#define vstream_longjmp(stream, val)
#define MAIL_SRC_MASK_NOTIFY
void argv_add(ARGV *argvp,...)
int smtp_get(VSTRING *vp, VSTREAM *stream, ssize_t bound, int flags)
ARGV * argv_alloc(ssize_t len)
#define vstream_ftime(vp)
VSTRING * vstring_strcpy(VSTRING *vp, const char *src)
#define VSTRING_TERMINATE(vp)
#define VSTRING_ADDCH(vp, ch)
VSTRING * vstring_vsprintf(VSTRING *vp, const char *format, va_list ap)
VSTREAM * post_mail_fopen_nowait(const char *sender, const char *recipient, int source_class, int trace_flags, int utf8_flags, VSTRING *queue_id)
#define dict_get(dp, key)
#define vstream_ftimeout(vp)
#define VSTRING_RESET(vp)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
void smtp_fputs(const char *cp, ssize_t todo, VSTREAM *stream)
int post_mail_fclose(VSTREAM *cleanup)
#define SMTP_FEATURE_PIPELINING
int vstream_fflush(VSTREAM *stream)
int post_mail_fputs(VSTREAM *cleanup, const char *str)
char * concatenate(const char *arg0,...)
const char * mail_addr_double_bounce(void)
void smtp_chat_reset(SMTP_SESSION *session)
void smtp_chat_init(SMTP_SESSION *session)
#define MAIL_ERROR_PROTOCOL
void smtp_chat_cmd(SMTP_SESSION *session, const char *fmt,...)
void smtp_chat_notify(SMTP_SESSION *session)
#define SMTP_GET_FLAG_SKIP
char * printable(char *string, int replacement)
#define vstream_ferror(vp)
VSTRING * vstring_strncpy(VSTRING *vp, const char *src, ssize_t len)
VSTRING * vstring_strcat(VSTRING *vp, const char *src)
void argv_terminate(ARGV *argvp)
DICT * smtp_chat_resp_filter
void msg_info(const char *fmt,...)
SMTP_RESP * smtp_chat_resp(SMTP_SESSION *session)