98 #define DELIVER_STAT_OK 0
99 #define DELIVER_STAT_DEFER 1
100 #define DELIVER_STAT_CRASH 2
104 static int qmgr_deliver_initial_reply(
VSTREAM *stream)
123 static int qmgr_deliver_final_reply(
VSTREAM *stream,
DSN_BUF *dsb)
158 for (recipient = list.
info; recipient < list.
info + list.
len; recipient++)
214 for (recipient = list.
info; recipient < list.
info + list.
len; recipient++)
230 static void qmgr_deliver_abort(
int unused_event,
void *context)
237 msg_fatal(
"%s: timeout receiving delivery status from transport: %s",
243 static void qmgr_deliver_update(
int unused_event,
void *context)
255 #define QMGR_DELIVER_RELEASE_AGENT(entry) do { \
256 event_disable_readwrite(vstream_fileno(entry->stream)); \
257 (void) vstream_fclose(entry->stream); \
259 qmgr_deliver_concurrency--; \
277 status = qmgr_deliver_final_reply(entry->
stream, dsb);
292 " mail transport error", (
char *) 0);
299 "unknown mail transport error"));
301 msg_warn(
"transport %s failure -- see a previous warning/fatal/panic logfile record for the problem description",
334 #define SUSPENDED "delivery temporarily suspended: "
387 if (stream == 0 || qmgr_deliver_initial_reply(stream) != 0) {
390 " mail transport unavailable", (
char *) 0);
397 "mail transport unavailable"));
424 if (qmgr_deliver_send_request(entry, stream) < 0) {
428 " mail transport unavailable", (
char *) 0);
435 "mail transport unavailable"));
449 qmgr_deliver_update, (
void *) entry);
void event_enable_read(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context)
#define QMGR_DELIVER_RELEASE_AGENT(entry)
DSN_BUF * dsb_create(void)
size_t dsn_valid(const char *text)
#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)
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
QMGR_QUEUE * qmgr_queue_select(QMGR_TRANSPORT *)
#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 *)
QMGR_ENTRY * qmgr_entry_select(QMGR_QUEUE *)
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 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 DELIVER_STAT_DEFER
#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 DELIVER_STAT_CRASH
#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,...)