160 lines
4.2 KiB
C
160 lines
4.2 KiB
C
/*++
|
|
/* NAME
|
|
/* qmgr_defer
|
|
/* SUMMARY
|
|
/* deal with mail that must be delivered later
|
|
/* SYNOPSIS
|
|
/* #include "qmgr.h"
|
|
/*
|
|
/* void qmgr_defer_recipient(message, address, reason)
|
|
/* QMGR_MESSAGE *message;
|
|
/* const char *address;
|
|
/* const char *reason;
|
|
/*
|
|
/* void qmgr_defer_todo(queue, reason)
|
|
/* QMGR_QUEUE *queue;
|
|
/* const char *reason;
|
|
/*
|
|
/* QMGR_QUEUE *qmgr_defer_transport(transport, reason)
|
|
/* QMGR_TRANSPORT *transport;
|
|
/* const char *reason;
|
|
/* DESCRIPTION
|
|
/* qmgr_defer_recipient() defers delivery of the named message to
|
|
/* the named recipient. It updates the message structure and writes
|
|
/* a log entry.
|
|
/*
|
|
/* qmgr_defer_todo() iterates over all "todo" deliveries queued for
|
|
/* the named site, and calls qmgr_defer_recipient() for each recipient
|
|
/* found. Side effects caused by qmgr_entry_done(), qmgr_queue_done(),
|
|
/* and by qmgr_active_done(): in-core queue entries will disappear,
|
|
/* in-core queues may disappear, in-core and on-disk messages may
|
|
/* disappear, bounces may be sent, new in-core queues, queue entries
|
|
/* and recipients may appear.
|
|
/*
|
|
/* qmgr_defer_transport() calls qmgr_defer_todo() for each queue
|
|
/* that depends on the named transport. See there for side effects.
|
|
/*
|
|
/* Arguments:
|
|
/* .IP recipient
|
|
/* A recipient address; used for logging purposes, and for updating
|
|
/* the message-specific \fIdefer\fR log.
|
|
/* .IP queue
|
|
/* Specifies a queue with delivery requests for a specific next-hop
|
|
/* host (or local user).
|
|
/* .IP transport
|
|
/* Specifies a message delivery transport.
|
|
/* .IP reason
|
|
/* Free-format text that describes why delivery is deferred; this
|
|
/* used for logging purposes, and for updating the message-specific
|
|
/* \fIdefer\fR log.
|
|
/* BUGS
|
|
/* The side effects of calling this routine are quite dramatic.
|
|
/* DIAGNOSTICS
|
|
/* Panic: consistency check failure. Fatal: out of memory.
|
|
/* LICENSE
|
|
/* .ad
|
|
/* .fi
|
|
/* The Secure Mailer license must be distributed with this software.
|
|
/* AUTHOR(S)
|
|
/* Wietse Venema
|
|
/* IBM T.J. Watson Research
|
|
/* P.O. Box 704
|
|
/* Yorktown Heights, NY 10598, USA
|
|
/*--*/
|
|
|
|
/* System library. */
|
|
|
|
#include <sys_defs.h>
|
|
|
|
/* Utility library. */
|
|
|
|
#include <msg.h>
|
|
#include <vstream.h>
|
|
|
|
/* Global library. */
|
|
|
|
#include <defer.h>
|
|
|
|
/* Application-specific. */
|
|
|
|
#include "qmgr.h"
|
|
|
|
/* qmgr_defer_transport - defer todo entries for named transport */
|
|
|
|
void qmgr_defer_transport(QMGR_TRANSPORT *transport, const char *reason)
|
|
{
|
|
char *myname = "qmgr_defer_transport";
|
|
QMGR_QUEUE *queue;
|
|
QMGR_QUEUE *next;
|
|
|
|
/*
|
|
* Sanity checks.
|
|
*/
|
|
if (reason == 0)
|
|
msg_panic("%s: null reason", myname);
|
|
if (msg_verbose)
|
|
msg_info("defer transport %s: %s", transport->name, reason);
|
|
|
|
/*
|
|
* Proceed carefully. Queues may disappear as a side effect.
|
|
*/
|
|
for (queue = transport->queue_list.next; queue; queue = next) {
|
|
next = queue->peers.next;
|
|
qmgr_defer_todo(queue, reason);
|
|
}
|
|
}
|
|
|
|
/* qmgr_defer_todo - defer all todo queue entries for specific site */
|
|
|
|
void qmgr_defer_todo(QMGR_QUEUE *queue, const char *reason)
|
|
{
|
|
char *myname = "qmgr_defer_todo";
|
|
QMGR_ENTRY *entry;
|
|
QMGR_ENTRY *next;
|
|
QMGR_MESSAGE *message;
|
|
QMGR_RCPT *recipient;
|
|
int nrcpt;
|
|
|
|
/*
|
|
* Sanity checks.
|
|
*/
|
|
if (reason == 0)
|
|
msg_panic("%s: null reason", myname);
|
|
if (msg_verbose)
|
|
msg_info("defer site %s: %s", queue->name, reason);
|
|
|
|
/*
|
|
* Proceed carefully. Queue entries will disappear as a side effect.
|
|
*/
|
|
for (entry = queue->todo.next; entry != 0; entry = next) {
|
|
next = entry->peers.next;
|
|
message = entry->message;
|
|
for (nrcpt = 0; nrcpt < entry->rcpt_list.len; nrcpt++) {
|
|
recipient = entry->rcpt_list.info + nrcpt;
|
|
qmgr_defer_recipient(message, recipient->address, reason);
|
|
}
|
|
qmgr_entry_done(entry, QMGR_QUEUE_TODO);
|
|
}
|
|
}
|
|
|
|
/* qmgr_defer_recipient - defer delivery of specific recipient */
|
|
|
|
void qmgr_defer_recipient(QMGR_MESSAGE *message, const char *address,
|
|
const char *reason)
|
|
{
|
|
char *myname = "qmgr_defer_recipient";
|
|
|
|
/*
|
|
* Sanity checks.
|
|
*/
|
|
if (reason == 0)
|
|
msg_panic("%s: reason 0", myname);
|
|
|
|
/*
|
|
* Update the message structure and log the message disposition.
|
|
*/
|
|
message->flags |= defer_append(BOUNCE_FLAG_KEEP, message->queue_id,
|
|
address, "none", message->arrival_time,
|
|
"%s", reason);
|
|
}
|