103 #define DELIVER_STAT_OK 0
104 #define DELIVER_STAT_DEFER 1
105 #define DELIVER_STAT_CRASH 2
109 static int qmgr_deliver_initial_reply(
VSTREAM *stream)
128 static int qmgr_deliver_final_reply(
VSTREAM *stream,
DSN_BUF *dsb)
163 for (recipient = list.
info; recipient < list.
info + list.
len; recipient++)
219 for (recipient = list.
info; recipient < list.
info + list.
len; recipient++)
235 static void qmgr_deliver_abort(
int unused_event,
void *context)
242 msg_fatal(
"%s: timeout receiving delivery status from transport: %s",
248 static void qmgr_deliver_update(
int unused_event,
void *context)
260 #define QMGR_DELIVER_RELEASE_AGENT(entry) do { \
261 event_disable_readwrite(vstream_fileno(entry->stream)); \
262 (void) vstream_fclose(entry->stream); \
264 qmgr_deliver_concurrency--; \
282 status = qmgr_deliver_final_reply(entry->
stream, dsb);
297 " mail transport error", (
char *) 0);
304 "unknown mail transport error"));
306 msg_warn(
"transport %s failure -- see a previous warning/fatal/panic logfile record for the problem description",
339 #define SUSPENDED "delivery temporarily suspended: "
391 if (stream == 0 || qmgr_deliver_initial_reply(stream) != 0) {
394 " mail transport unavailable", (
char *) 0);
401 "mail transport unavailable"));
427 if (qmgr_deliver_send_request(entry, stream) < 0) {
431 " mail transport unavailable", (
char *) 0);
438 "mail transport unavailable"));
452 qmgr_deliver_update, (
void *) entry);
void event_enable_read(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context)
DSN_BUF * dsb_create(void)
size_t dsn_valid(const char *text)
QMGR_ENTRY * qmgr_job_entry_select(QMGR_TRANSPORT *)
#define MAIL_ATTR_ENCODING
int msg_stats_print(ATTR_PRINT_MASTER_FN, VSTREAM *, int, void *)
int qmgr_deliver_concurrency
#define DSN_SIMPLE(dsn, _status, _reason)
void qmgr_deliver(QMGR_TRANSPORT *transport, VSTREAM *stream)
#define QMGR_DELIVER_RELEASE_AGENT(entry)
int valid_utf8_string(const char *, ssize_t)
#define SMTPUTF8_FLAG_SENDER
VSTRING * verp_sender(VSTRING *buf, const char *delimiters, const char *sender, const RECIPIENT *rcpt_info)
#define MAIL_ATTR_RWR_CONTEXT
#define RECV_ATTR_INT(name, val)
#define MAIL_ATTR_SASL_METHOD
int dsb_scan(ATTR_SCAN_MASTER_FN scan_fn, VSTREAM *fp, int flags, void *ptr)
#define MAIL_ATTR_LOG_HELO_NAME
#define MAIL_ATTR_LOG_PROTO_NAME
VSTRING * vstring_strcpy(VSTRING *vp, const char *src)
void qmgr_queue_unthrottle(QMGR_QUEUE *)
VSTRING * vstring_prepend(VSTRING *vp, const char *buf, ssize_t len)
#define DSN_FROM_DSN_BUF(dsb)
int vstream_fclose(VSTREAM *stream)
#define MAIL_ATTR_SMTPUTF8
#define MAIL_ATTR_SASL_SENDER
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
#define MAIL_ATTR_DSN_RET
void qmgr_queue_throttle(QMGR_QUEUE *, DSN *)
void qmgr_entry_unselect(QMGR_QUEUE *, QMGR_ENTRY *)
void qmgr_defer_transport(QMGR_TRANSPORT *, DSN *)
#define MAIL_ATTR_LOG_IDENT
#define MAIL_ATTR_DSN_ENVID
void qmgr_entry_done(QMGR_ENTRY *, int)
#define MAIL_ATTR_LOG_CLIENT_ADDR
#define SEND_ATTR_INT(name, val)
#define SEND_ATTR_LONG(name, val)
#define QMGR_MSG_STATS(stats, message)
NORETURN msg_fatal(const char *fmt,...)
void qmgr_transport_throttle(QMGR_TRANSPORT *, DSN *)
#define DELIVER_STAT_DEFER
#define MAIL_ATTR_NEXTHOP
QMGR_TRANSPORT * transport
int vstream_fflush(VSTREAM *stream)
void qmgr_transport_unthrottle(QMGR_TRANSPORT *)
void qmgr_defer_todo(QMGR_QUEUE *, DSN *)
char * concatenate(const char *arg0,...)
#define MAIL_ATTR_SASL_USERNAME
#define MAIL_ATTR_RCPT_COUNT
#define SEND_ATTR_FUNC(func, val)
#define MAIL_ATTR_LOG_CLIENT_NAME
VSTRING * vstring_free(VSTRING *vp)
time_t event_request_timer(EVENT_NOTIFY_TIME_FN callback, void *context, int delay)
#define vstream_fileno(vp)
#define SMTPUTF8_FLAG_RECIPIENT
#define RECV_ATTR_FUNC(func, val)
int rcpt_print(ATTR_PRINT_MASTER_FN print_fn, VSTREAM *fp, int flags, void *ptr)
#define MAIL_ATTR_QUEUEID
#define QMGR_QUEUE_READY(q)
#define DEL_REQ_FLAG_BOUNCE
int event_cancel_timer(EVENT_NOTIFY_TIME_FN callback, void *context)
#define SEND_ATTR_STR(name, val)
#define MAIL_ATTR_LOG_CLIENT_PORT
#define DEL_REQ_FLAG_DEFLT
#define QMGR_QUEUE_THROTTLED(q)
void msg_info(const char *fmt,...)
#define DELIVER_STAT_CRASH