1/*	$NetBSD$	*/
2
3/*++
4/* NAME
5/*	qmgr_enable
6/* SUMMARY
7/*	enable dead transports or sites
8/* SYNOPSIS
9/*	#include "qmgr.h"
10/*
11/*	void	qmgr_enable_queue(queue)
12/*	QMGR_QUEUE *queue;
13/*
14/*	QMGR_QUEUE *qmgr_enable_transport(transport)
15/*	QMGR_TRANSPORT *transport;
16/*
17/*	void	qmgr_enable_all(void)
18/* DESCRIPTION
19/*	This module purges dead in-core state information, effectively
20/*	re-enabling delivery.
21/*
22/*	qmgr_enable_queue() enables deliveries to the named dead site.
23/*	Empty queues are destroyed. The existed solely to indicate that
24/*	a site is dead.
25/*
26/*	qmgr_enable_transport() enables deliveries via the specified
27/*	transport, and calls qmgr_enable_queue() for each destination
28/*	on that transport.  Empty queues are destroyed.
29/*
30/*	qmgr_enable_all() enables all transports and queues.
31/*	See above for the side effects caused by doing this.
32/* BUGS
33/*	The side effects of calling this module can be quite dramatic.
34/* DIAGNOSTICS
35/*	Panic: consistency check failure. Fatal: out of memory.
36/* LICENSE
37/* .ad
38/* .fi
39/*	The Secure Mailer license must be distributed with this software.
40/* AUTHOR(S)
41/*	Wietse Venema
42/*	IBM T.J. Watson Research
43/*	P.O. Box 704
44/*	Yorktown Heights, NY 10598, USA
45/*--*/
46
47/* System library. */
48
49#include <sys_defs.h>
50
51/* Utility library. */
52
53#include <msg.h>
54#include <vstream.h>
55
56/* Application-specific. */
57
58#include "qmgr.h"
59
60/* qmgr_enable_all - enable transports and queues */
61
62void    qmgr_enable_all(void)
63{
64    QMGR_TRANSPORT *xport;
65
66    if (msg_verbose)
67	msg_info("qmgr_enable_all");
68
69    /*
70     * The number of transports does not change as a side effect, so this can
71     * be a straightforward loop.
72     */
73    for (xport = qmgr_transport_list.next; xport; xport = xport->peers.next)
74	qmgr_enable_transport(xport);
75}
76
77/* qmgr_enable_transport - defer todo entries for named transport */
78
79void    qmgr_enable_transport(QMGR_TRANSPORT *transport)
80{
81    QMGR_QUEUE *queue;
82    QMGR_QUEUE *next;
83
84    /*
85     * Proceed carefully. Queues may disappear as a side effect.
86     */
87    if (transport->flags & QMGR_TRANSPORT_STAT_DEAD) {
88	if (msg_verbose)
89	    msg_info("enable transport %s", transport->name);
90	qmgr_transport_unthrottle(transport);
91    }
92    for (queue = transport->queue_list.next; queue; queue = next) {
93	next = queue->peers.next;
94	qmgr_enable_queue(queue);
95    }
96}
97
98/* qmgr_enable_queue - enable and possibly delete queue */
99
100void    qmgr_enable_queue(QMGR_QUEUE *queue)
101{
102    if (QMGR_QUEUE_THROTTLED(queue)) {
103	if (msg_verbose)
104	    msg_info("enable site %s/%s", queue->transport->name, queue->name);
105	qmgr_queue_unthrottle(queue);
106    }
107    if (QMGR_QUEUE_READY(queue) && queue->todo.next == 0 && queue->busy.next == 0)
108	qmgr_queue_done(queue);
109}
110