118 static void qmgr_active_done_2_bounce_flush(
int,
void *);
120 static void qmgr_active_done_25_trace_flush(
int,
void *);
121 static void qmgr_active_done_25_generic(
QMGR_MESSAGE *);
122 static void qmgr_active_done_3_defer_flush(
int,
void *);
123 static void qmgr_active_done_3_defer_warn(
int,
void *);
128 static void qmgr_active_corrupt(
const char *queue_id)
130 const char *myname =
"qmgr_active_corrupt";
134 msg_fatal(
"%s: save corrupt file queue %s id %s: %m",
137 msg_warn(
"saving corrupt file \"%s\" from queue \"%s\" to queue \"%s\"",
144 static void qmgr_active_defer(
const char *queue_name,
const char *queue_id,
145 const char *dest_queue,
int delay)
147 const char *myname =
"qmgr_active_defer";
152 msg_info(
"wakeup %s after %ld secs", queue_id, (
long) delay);
154 tbuf.actime = tbuf.modtime =
event_time() + delay;
156 if (utime(path, &tbuf) < 0 && errno != ENOENT)
157 msg_fatal(
"%s: update %s time stamps: %m", myname, path);
160 msg_fatal(
"%s: rename %s from %s to %s: %m", myname,
161 queue_id, queue_name, dest_queue);
162 msg_warn(
"%s: rename %s from %s to %s: %m", myname,
163 queue_id, queue_name, dest_queue);
165 msg_info(
"%s: defer %s", myname, queue_id);
173 const char *myname =
"qmgr_active_feed";
197 && st.st_mtime > time((time_t *) 0) + 1) {
199 msg_info(
"%s: skip %s (%ld seconds)", myname, queue_id,
209 msg_fatal(
"%s: %s: rename from %s to %s: %m", myname,
211 msg_warn(
"%s: %s: rename from %s to %s: %m", myname,
230 #define QMGR_FLUSH_AFTER (QMGR_FLUSH_EACH | QMGR_FLUSH_DFXP)
239 qmgr_active_corrupt(queue_id);
260 const char *myname =
"qmgr_active_done";
287 if (st.st_size == 0) {
303 qmgr_active_done_2_bounce_flush,
315 qmgr_active_done_2_bounce_flush,
324 qmgr_active_done_2_generic(message);
329 static void qmgr_active_done_2_bounce_flush(
int status,
void *context)
336 message->
flags |= status;
337 qmgr_active_done_2_generic(message);
342 static void qmgr_active_done_2_generic(
QMGR_MESSAGE *message)
353 qmgr_active_corrupt(message->
queue_id);
368 qmgr_active_corrupt(message->
queue_id);
399 qmgr_active_done_25_trace_flush,
407 qmgr_active_done_25_generic(message);
412 static void qmgr_active_done_25_trace_flush(
int status,
void *context)
421 message->
flags |= status;
422 qmgr_active_done_25_generic(message);
427 static void qmgr_active_done_25_generic(
QMGR_MESSAGE *message)
429 const char *myname =
"qmgr_active_done_25_generic";
438 if (message->
flags) {
441 msg_info(
"%s: from=<%s>, status=expired, returned to sender",
452 qmgr_active_done_3_defer_flush,
464 qmgr_active_done_3_defer_flush,
479 qmgr_active_done_3_defer_warn,
488 qmgr_active_done_3_generic(message);
493 static void qmgr_active_done_3_defer_warn(
int status,
void *context)
502 qmgr_active_done_3_generic(message);
507 static void qmgr_active_done_3_defer_flush(
int status,
void *context)
514 message->
flags = status;
515 qmgr_active_done_3_generic(message);
520 static void qmgr_active_done_3_generic(
QMGR_MESSAGE *message)
522 const char *myname =
"qmgr_active_done_3_generic";
536 if (message->
flags) {
556 msg_fatal(
"%s: remove %s from %s: %m", myname,
558 msg_warn(
"%s: remove %s from %s: %m", myname,
584 msg_info(
"qmgr_active_drain: allocate %s", transport->
name);
void abounce_flush_verp(int flags, const char *queue, const char *id, const char *encoding, int smtputf8, const char *sender, const char *dsn_envid, int dsn_ret, const char *verp, ABOUNCE_FN callback, void *context)
void abounce_flush(int flags, const char *queue, const char *id, const char *encoding, int smtputf8, const char *sender, const char *dsn_envid, int dsn_ret, ABOUNCE_FN callback, void *context)
void qmgr_message_free(QMGR_MESSAGE *)
#define QMGR_READ_FLAG_NOTIFY_SUCCESS
#define MAIL_QUEUE_BOUNCE
void qmgr_message_kill_record(QMGR_MESSAGE *, long)
NORETURN msg_panic(const char *fmt,...)
#define MAIL_QUEUE_ACTIVE
void atrace_flush(int flags, const char *queue, const char *id, const char *encoding, int smtputf8, const char *sender, const char *dsn_envid, int dsn_ret, ABOUNCE_FN callback, void *context)
#define DEL_REQ_FLAG_USR_VRFY
#define MAIL_QUEUE_STAT_UNTHROTTLE
void qmgr_message_update_warn(QMGR_MESSAGE *)
const char * mail_queue_path(VSTRING *buf, const char *queue_name, const char *queue_id)
QMGR_MESSAGE * qmgr_message_alloc(const char *, const char *, int, mode_t)
QMGR_MESSAGE * qmgr_message_realloc(QMGR_MESSAGE *)
void qmgr_active_done(QMGR_MESSAGE *message)
void qmgr_active_drain(void)
int qmgr_active_feed(QMGR_SCAN *scan_info, const char *queue_id)
int mail_queue_rename(const char *queue_id, const char *old_queue, const char *new_queue)
#define MAIL_QUEUE_INCOMING
int mail_open_ok(const char *queue_name, const char *queue_id, struct stat *statp, const char **path)
void msg_warn(const char *fmt,...)
void qmgr_deliver(QMGR_TRANSPORT *, VSTREAM *)
NORETURN msg_fatal(const char *fmt,...)
#define MAIL_QUEUE_DEFERRED
int mail_queue_remove(const char *queue_name, const char *queue_id)
void adefer_flush(int flags, const char *queue, const char *id, const char *encoding, int smtputf8, const char *sender, const char *dsn_envid, int dsn_ret, ABOUNCE_FN callback, void *context)
void qmgr_transport_alloc(QMGR_TRANSPORT *, QMGR_TRANSPORT_ALLOC_NOTIFY)
QMGR_TRANSPORT * qmgr_transport_select(void)
#define MAIL_QUEUE_CORRUPT
void adefer_flush_verp(int flags, const char *queue, const char *id, const char *encoding, int smtputf8, const char *sender, const char *dsn_envid, int dsn_ret, const char *verp, ABOUNCE_FN callback, void *context)
#define QMGR_MESSAGE_LOCKED
#define DEL_REQ_FLAG_REC_DLY_SENT
void adefer_warn(int flags, const char *queue, const char *id, const char *encoding, int smtputf8, const char *sender, const char *dsn_envid, int dsn_ret, ABOUNCE_FN callback, void *context)
#define DEL_REQ_FLAG_RECORD
void msg_info(const char *fmt,...)