1/*	$NetBSD$	*/
2
3/*++
4/* NAME
5/*	qmgr_error 3
6/* SUMMARY
7/*	look up/create error/retry queue
8/* SYNOPSIS
9/*	#include "qmgr.h"
10/*
11/*	QMGR_TRANSPORT *qmgr_error_transport(service)
12/*	const char *service;
13/*
14/*	QMGR_QUEUE *qmgr_error_queue(service, dsn)
15/*	const char *service;
16/*	DSN	*dsn;
17/*
18/*	char	*qmgr_error_nexthop(dsn)
19/*	DSN	*dsn;
20/* DESCRIPTION
21/*	qmgr_error_transport() looks up the error transport for the
22/*	specified service. The result is null if the transport is
23/*	not available.
24/*
25/*	qmgr_error_queue() looks up an error queue for the specified
26/*	service and problem. The result is null if the queue is not
27/*	availabe.
28/*
29/*	qmgr_error_nexthop() computes the next-hop information for
30/*	the specified problem. The result must be passed to myfree().
31/*
32/*	Arguments:
33/* .IP dsn
34/*	See dsn(3).
35/* .IP service
36/*	One of MAIL_SERVICE_ERROR or MAIL_SERVICE_RETRY.
37/* DIAGNOSTICS
38/*	Panic: consistency check failure. Fatal: out of memory.
39/* LICENSE
40/* .ad
41/* .fi
42/*	The Secure Mailer license must be distributed with this software.
43/* AUTHOR(S)
44/*	Wietse Venema
45/*	IBM T.J. Watson Research
46/*	P.O. Box 704
47/*	Yorktown Heights, NY 10598, USA
48/*--*/
49
50/* System library. */
51
52#include <sys_defs.h>
53
54/* Utility library. */
55
56#include <mymalloc.h>
57#include <stringops.h>
58
59/* Global library. */
60
61/* Application-specific. */
62
63#include "qmgr.h"
64
65/* qmgr_error_transport - look up error transport for specified service */
66
67QMGR_TRANSPORT *qmgr_error_transport(const char *service)
68{
69    QMGR_TRANSPORT *transport;
70
71    /*
72     * Find or create retry transport.
73     */
74    if ((transport = qmgr_transport_find(service)) == 0)
75	transport = qmgr_transport_create(service);
76    if (QMGR_TRANSPORT_THROTTLED(transport))
77	return (0);
78
79    /*
80     * Done.
81     */
82    return (transport);
83}
84
85/* qmgr_error_queue - look up error queue for specified service and problem */
86
87QMGR_QUEUE *qmgr_error_queue(const char *service, DSN *dsn)
88{
89    QMGR_TRANSPORT *transport;
90    QMGR_QUEUE *queue;
91    char   *nexthop;
92
93    /*
94     * Find or create transport.
95     */
96    if ((transport = qmgr_error_transport(service)) == 0)
97	return (0);
98
99    /*
100     * Find or create queue.
101     */
102    nexthop = qmgr_error_nexthop(dsn);
103    if ((queue = qmgr_queue_find(transport, nexthop)) == 0)
104	queue = qmgr_queue_create(transport, nexthop, nexthop);
105    myfree(nexthop);
106    if (QMGR_QUEUE_THROTTLED(queue))
107	return (0);
108
109    /*
110     * Done.
111     */
112    return (queue);
113}
114
115/* qmgr_error_nexthop - compute next-hop information from problem description */
116
117char   *qmgr_error_nexthop(DSN *dsn)
118{
119    char   *nexthop;
120
121    nexthop = concatenate(dsn->status, " ", dsn->reason, (char *) 0);
122    return (nexthop);
123}
124