Postfix3.3.1
qmgr_error.c
[詳解]
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 
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 
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 
116 {
117  char *nexthop;
118 
119  nexthop = concatenate(dsn->status, " ", dsn->reason, (char *) 0);
120  return (nexthop);
121 }
void myfree(void *ptr)
Definition: mymalloc.c:207
const char * reason
Definition: dsn.h:20
QMGR_TRANSPORT * qmgr_transport_create(const char *)
char * qmgr_error_nexthop(DSN *dsn)
Definition: qmgr_error.c:115
#define QMGR_TRANSPORT_THROTTLED(t)
Definition: qmgr.h:181
QMGR_QUEUE * qmgr_queue_create(QMGR_TRANSPORT *, const char *, const char *)
Definition: qmgr_queue.c:407
QMGR_QUEUE * qmgr_error_queue(const char *service, DSN *dsn)
Definition: qmgr_error.c:85
QMGR_TRANSPORT * qmgr_error_transport(const char *service)
Definition: qmgr_error.c:65
QMGR_TRANSPORT * qmgr_transport_find(const char *)
QMGR_QUEUE * qmgr_queue_find(QMGR_TRANSPORT *, const char *)
Definition: qmgr_queue.c:439
const char * status
Definition: dsn.h:18
char * concatenate(const char *arg0,...)
Definition: concatenate.c:42
Definition: dsn.h:17
#define QMGR_QUEUE_THROTTLED(q)
Definition: qmgr.h:245