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