Postfix3.3.1
全て データ構造 ファイル 関数 変数 型定義 マクロ定義
qmgr.h
[詳解]
1 /*++
2 /* NAME
3 /* qmgr 3h
4 /* SUMMARY
5 /* queue manager data structures
6 /* SYNOPSIS
7 /* #include "qmgr.h"
8 /* DESCRIPTION
9 /* .nf
10 
11  /*
12  * System library.
13  */
14 #include <sys/time.h>
15 #include <time.h>
16 
17  /*
18  * Utility library.
19  */
20 #include <vstream.h>
21 #include <scan_dir.h>
22 
23  /*
24  * Global library.
25  */
26 #include <recipient_list.h>
27 #include <dsn.h>
28 
29  /*
30  * The queue manager is built around lots of mutually-referring structures.
31  * These typedefs save some typing.
32  */
34 typedef struct QMGR_QUEUE QMGR_QUEUE;
35 typedef struct QMGR_ENTRY QMGR_ENTRY;
36 typedef struct QMGR_MESSAGE QMGR_MESSAGE;
40 typedef struct QMGR_SCAN QMGR_SCAN;
42 
43  /*
44  * Hairy macros to update doubly-linked lists.
45  */
46 #define QMGR_LIST_ROTATE(head, object) { \
47  head.next->peers.prev = head.prev; \
48  head.prev->peers.next = head.next; \
49  head.next = object->peers.next; \
50  if (object->peers.next) \
51  head.next->peers.prev = 0; \
52  head.prev = object; \
53  object->peers.next = 0; \
54 }
55 
56 #define QMGR_LIST_UNLINK(head, type, object) { \
57  type next = object->peers.next; \
58  type prev = object->peers.prev; \
59  if (prev) prev->peers.next = next; \
60  else head.next = next; \
61  if (next) next->peers.prev = prev; \
62  else head.prev = prev; \
63  object->peers.next = object->peers.prev = 0; \
64 }
65 
66 #define QMGR_LIST_APPEND(head, object) { \
67  object->peers.next = head.next; \
68  object->peers.prev = 0; \
69  if (head.next) { \
70  head.next->peers.prev = object; \
71  } else { \
72  head.prev = object; \
73  } \
74  head.next = object; \
75 }
76 
77 #define QMGR_LIST_PREPEND(head, object) { \
78  object->peers.prev = head.prev; \
79  object->peers.next = 0; \
80  if (head.prev) { \
81  head.prev->peers.next = object; \
82  } else { \
83  head.next = object; \
84  } \
85  head.prev = object; \
86 }
87 
88 #define QMGR_LIST_INIT(head) { \
89  head.prev = 0; \
90  head.next = 0; \
91 }
92 
93  /*
94  * Transports are looked up by name (when we have resolved a message), or
95  * round-robin wise (when we want to distribute resources fairly).
96  */
100 };
101 
102 extern struct HTABLE *qmgr_transport_byname; /* transport by name */
103 extern QMGR_TRANSPORT_LIST qmgr_transport_list; /* transports, round robin */
104 
105  /*
106  * Delivery agents provide feedback, as hints that Postfix should expend
107  * more or fewer resources on a specific destination domain. The main.cf
108  * file specifies how feedback affects delivery concurrency: add/subtract a
109  * constant, a ratio of constants, or a constant divided by the delivery
110  * concurrency; and it specifies how much feedback must accumulate between
111  * concurrency updates.
112  */
114  int hysteresis; /* to pass, need to be this tall */
115  double base; /* pre-computed from main.cf */
116  int index; /* none, window, sqrt(window) */
117 };
118 
119 #define QMGR_FEEDBACK_IDX_NONE 0 /* no window dependence */
120 #define QMGR_FEEDBACK_IDX_WIN 1 /* 1/window dependence */
121 #if 0
122 #define QMGR_FEEDBACK_IDX_SQRT_WIN 2 /* 1/sqrt(window) dependence */
123 #endif
124 
125 #ifdef QMGR_FEEDBACK_IDX_SQRT_WIN
126 #include <math.h>
127 #endif
128 
129 extern void qmgr_feedback_init(QMGR_FEEDBACK *, const char *, const char *, const char *, const char *);
130 
131 #ifndef QMGR_FEEDBACK_IDX_SQRT_WIN
132 #define QMGR_FEEDBACK_VAL(fb, win) \
133  ((fb).index == QMGR_FEEDBACK_IDX_NONE ? (fb).base : (fb).base / (win))
134 #else
135 #define QMGR_FEEDBACK_VAL(fb, win) \
136  ((fb).index == QMGR_FEEDBACK_IDX_NONE ? (fb).base : \
137  (fb).index == QMGR_FEEDBACK_IDX_WIN ? (fb).base / (win) : \
138  (fb).base / sqrt(win))
139 #endif
140 
141  /*
142  * Each transport (local, smtp-out, bounce) can have one queue per next hop
143  * name. Queues are looked up by next hop name (when we have resolved a
144  * message destination), or round-robin wise (when we want to deliver
145  * messages fairly).
146  */
150 };
151 
153  int flags; /* blocked, etc. */
154  int pending; /* incomplete DA connections */
155  char *name; /* transport name */
156  int dest_concurrency_limit; /* concurrency per domain */
157  int init_dest_concurrency; /* init. per-domain concurrency */
158  int recipient_limit; /* recipients per transaction */
159  struct HTABLE *queue_byname; /* queues indexed by domain */
160  QMGR_QUEUE_LIST queue_list; /* queues, round robin order */
161  QMGR_TRANSPORT_LIST peers; /* linkage */
162  DSN *dsn; /* why unavailable */
163  QMGR_FEEDBACK pos_feedback; /* positive feedback control */
164  QMGR_FEEDBACK neg_feedback; /* negative feedback control */
165  int fail_cohort_limit; /* flow shutdown control */
166  int xport_rate_delay; /* suspend per delivery */
167  int rate_delay; /* suspend per delivery */
168 };
169 
170 #define QMGR_TRANSPORT_STAT_DEAD (1<<1)
171 #define QMGR_TRANSPORT_STAT_RATE_LOCK (1<<2)
172 
176 extern void qmgr_transport_throttle(QMGR_TRANSPORT *, DSN *);
178 extern QMGR_TRANSPORT *qmgr_transport_create(const char *);
179 extern QMGR_TRANSPORT *qmgr_transport_find(const char *);
180 
181 #define QMGR_TRANSPORT_THROTTLED(t) ((t)->flags & QMGR_TRANSPORT_STAT_DEAD)
182 
183  /*
184  * Each next hop (e.g., a domain name) has its own queue of pending message
185  * transactions. The "todo" queue contains messages that are to be delivered
186  * to this next hop. When a message is elected for transmission, it is moved
187  * from the "todo" queue to the "busy" queue. Messages are taken from the
188  * "todo" queue in sequence. An initial destination delivery concurrency > 1
189  * ensures that one problematic message will not block all other traffic to
190  * that next hop.
191  */
195 };
196 
197 struct QMGR_QUEUE {
198  int dflags; /* delivery request options */
199  time_t last_done; /* last delivery completion */
200  char *name; /* domain name or address */
201  char *nexthop; /* domain name */
202  int todo_refcount; /* queue entries (todo list) */
203  int busy_refcount; /* queue entries (busy list) */
204  int window; /* slow open algorithm */
205  double success; /* accumulated positive feedback */
206  double failure; /* accumulated negative feedback */
207  double fail_cohorts; /* pseudo-cohort failure count */
208  QMGR_TRANSPORT *transport; /* transport linkage */
209  QMGR_ENTRY_LIST todo; /* todo queue entries */
210  QMGR_ENTRY_LIST busy; /* messages on the wire */
211  QMGR_QUEUE_LIST peers; /* neighbor queues */
212  DSN *dsn; /* why unavailable */
213  time_t clog_time_to_warn; /* time of next warning */
214 };
215 
216 #define QMGR_QUEUE_TODO 1 /* waiting for service */
217 #define QMGR_QUEUE_BUSY 2 /* recipients on the wire */
218 
219 extern int qmgr_queue_count;
220 
221 extern QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *, const char *, const char *);
223 extern void qmgr_queue_done(QMGR_QUEUE *);
224 extern void qmgr_queue_throttle(QMGR_QUEUE *, DSN *);
225 extern void qmgr_queue_unthrottle(QMGR_QUEUE *);
226 extern QMGR_QUEUE *qmgr_queue_find(QMGR_TRANSPORT *, const char *);
227 extern void qmgr_queue_suspend(QMGR_QUEUE *, int);
228 
229  /*
230  * Exclusive queue states. Originally there were only two: "throttled" and
231  * "not throttled". It was natural to encode these in the queue window size.
232  * After 10 years it's not practical to rip out all the working code and
233  * change representations, so we just clean up the names a little.
234  *
235  * Note: only the "ready" state can reach every state (including itself);
236  * non-ready states can reach only the "ready" state. Other transitions are
237  * forbidden, because they would result in dangling event handlers.
238  */
239 #define QMGR_QUEUE_STAT_THROTTLED 0 /* back-off timer */
240 #define QMGR_QUEUE_STAT_SUSPENDED -1 /* voluntary delay timer */
241 #define QMGR_QUEUE_STAT_SAVED -2 /* delayed cleanup timer */
242 #define QMGR_QUEUE_STAT_BAD -3 /* can't happen */
243 
244 #define QMGR_QUEUE_READY(q) ((q)->window > 0)
245 #define QMGR_QUEUE_THROTTLED(q) ((q)->window == QMGR_QUEUE_STAT_THROTTLED)
246 #define QMGR_QUEUE_SUSPENDED(q) ((q)->window == QMGR_QUEUE_STAT_SUSPENDED)
247 #define QMGR_QUEUE_SAVED(q) ((q)->window == QMGR_QUEUE_STAT_SAVED)
248 #define QMGR_QUEUE_BAD(q) ((q)->window <= QMGR_QUEUE_STAT_BAD)
249 
250 #define QMGR_QUEUE_STATUS(q) ( \
251  QMGR_QUEUE_READY(q) ? "ready" : \
252  QMGR_QUEUE_THROTTLED(q) ? "throttled" : \
253  QMGR_QUEUE_SUSPENDED(q) ? "suspended" : \
254  QMGR_QUEUE_SAVED(q) ? "saved" : \
255  "invalid queue status" \
256  )
257 
258  /*
259  * Structure of one next-hop queue entry. In order to save some copying
260  * effort we allow multiple recipients per transaction.
261  */
262 struct QMGR_ENTRY {
263  VSTREAM *stream; /* delivery process */
264  QMGR_MESSAGE *message; /* message info */
265  RECIPIENT_LIST rcpt_list; /* as many as it takes */
266  QMGR_QUEUE *queue; /* parent linkage */
267  QMGR_ENTRY_LIST peers; /* neighbor entries */
268 };
269 
271 extern void qmgr_entry_unselect(QMGR_QUEUE *, QMGR_ENTRY *);
272 extern void qmgr_entry_move_todo(QMGR_QUEUE *, QMGR_ENTRY *);
273 extern void qmgr_entry_done(QMGR_ENTRY *, int);
275 
276  /*
277  * All common in-core information about a message is kept here. When all
278  * recipients have been tried the message file is linked to the "deferred"
279  * queue (some hosts not reachable), to the "bounce" queue (some recipients
280  * were rejected), and is then removed from the "active" queue.
281  */
282 struct QMGR_MESSAGE {
283  int flags; /* delivery problems */
284  int qflags; /* queuing flags */
285  int tflags; /* tracing flags */
286  long tflags_offset; /* offset for killing */
287  int rflags; /* queue file read flags */
288  VSTREAM *fp; /* open queue file or null */
289  int refcount; /* queue entries */
290  int single_rcpt; /* send one rcpt at a time */
291  struct timeval arrival_time; /* start of receive transaction */
292  time_t create_time; /* queue file create time */
293  struct timeval active_time; /* time of entry into active queue */
294  long warn_offset; /* warning bounce flag offset */
295  time_t warn_time; /* time next warning to be sent */
296  long data_offset; /* data seek offset */
297  char *queue_name; /* queue name */
298  char *queue_id; /* queue file */
299  char *encoding; /* content encoding */
300  char *sender; /* complete address */
301  char *dsn_envid; /* DSN envelope ID */
302  int dsn_ret; /* DSN headers/full */
303  int smtputf8; /* requires unicode */
304  char *verp_delims; /* VERP delimiters */
305  char *filter_xport; /* filtering transport */
306  char *inspect_xport; /* inspecting transport */
307  char *redirect_addr; /* info@spammer.tld */
308  long data_size; /* data segment size */
309  long cont_length; /* message content length */
310  long rcpt_offset; /* more recipients here */
311  char *client_name; /* client hostname */
312  char *client_addr; /* client address */
313  char *client_port; /* client port */
314  char *client_proto; /* client protocol */
315  char *client_helo; /* helo parameter */
316  char *sasl_method; /* SASL method */
317  char *sasl_username; /* SASL user name */
318  char *sasl_sender; /* SASL sender */
319  char *log_ident; /* up-stream queue ID */
320  char *rewrite_context; /* address qualification */
321  RECIPIENT_LIST rcpt_list; /* complete addresses */
322 };
323 
324  /*
325  * Flags 0-15 are reserved for qmgr_user.h.
326  */
327 #define QMGR_READ_FLAG_SEEN_ALL_NON_RCPT (1<<16)
328 
329 #define QMGR_MESSAGE_LOCKED ((QMGR_MESSAGE *) 1)
330 
331 extern int qmgr_message_count;
332 extern int qmgr_recipient_count;
333 extern int qmgr_vrfy_pend_count;
334 
335 extern void qmgr_message_free(QMGR_MESSAGE *);
337 extern void qmgr_message_kill_record(QMGR_MESSAGE *, long);
338 extern QMGR_MESSAGE *qmgr_message_alloc(const char *, const char *, int, mode_t);
340 
341 #define QMGR_MSG_STATS(stats, message) \
342  MSG_STATS_INIT2(stats, \
343  incoming_arrival, message->arrival_time, \
344  active_arrival, message->active_time)
345 
346  /*
347  * qmgr_defer.c
348  */
349 extern void qmgr_defer_transport(QMGR_TRANSPORT *, DSN *);
350 extern void qmgr_defer_todo(QMGR_QUEUE *, DSN *);
351 extern void qmgr_defer_recipient(QMGR_MESSAGE *, RECIPIENT *, DSN *);
352 
353  /*
354  * qmgr_bounce.c
355  */
356 extern void qmgr_bounce_recipient(QMGR_MESSAGE *, RECIPIENT *, DSN *);
357 
358  /*
359  * qmgr_deliver.c
360  */
361 extern int qmgr_deliver_concurrency;
362 extern void qmgr_deliver(QMGR_TRANSPORT *, VSTREAM *);
363 
364  /*
365  * qmgr_active.c
366  */
367 extern int qmgr_active_feed(QMGR_SCAN *, const char *);
368 extern void qmgr_active_drain(void);
369 extern void qmgr_active_done(QMGR_MESSAGE *);
370 
371  /*
372  * qmgr_move.c
373  */
374 extern void qmgr_move(const char *, const char *, time_t);
375 
376  /*
377  * qmgr_enable.c
378  */
379 extern void qmgr_enable_all(void);
381 extern void qmgr_enable_queue(QMGR_QUEUE *);
382 
383  /*
384  * Queue scan context.
385  */
386 struct QMGR_SCAN {
387  char *queue; /* queue name */
388  int flags; /* private, this run */
389  int nflags; /* private, next run */
390  struct SCAN_DIR *handle; /* scan */
391 };
392 
393  /*
394  * Flags that control queue scans or destination selection. These are
395  * similar to the QMGR_REQ_XXX request codes.
396  */
397 #define QMGR_SCAN_START (1<<0) /* start now/restart when done */
398 #define QMGR_SCAN_ALL (1<<1) /* all queue file time stamps */
399 #define QMGR_FLUSH_ONCE (1<<2) /* unthrottle once */
400 #define QMGR_FLUSH_DFXP (1<<3) /* override defer_transports */
401 #define QMGR_FLUSH_EACH (1<<4) /* unthrottle per message */
402 
403  /*
404  * qmgr_scan.c
405  */
406 extern QMGR_SCAN *qmgr_scan_create(const char *);
407 extern void qmgr_scan_request(QMGR_SCAN *, int);
408 extern char *qmgr_scan_next(QMGR_SCAN *);
409 
410  /*
411  * qmgr_error.c
412  */
413 extern QMGR_TRANSPORT *qmgr_error_transport(const char *);
414 extern QMGR_QUEUE *qmgr_error_queue(const char *, DSN *);
415 extern char *qmgr_error_nexthop(DSN *);
416 
417 /* LICENSE
418 /* .ad
419 /* .fi
420 /* The Secure Mailer license must be distributed with this software.
421 /* AUTHOR(S)
422 /* Wietse Venema
423 /* IBM T.J. Watson Research
424 /* P.O. Box 704
425 /* Yorktown Heights, NY 10598, USA
426 /*
427 /* Wietse Venema
428 /* Google, Inc.
429 /* 111 8th Avenue
430 /* New York, NY 10011, USA
431 /*--*/
int qmgr_active_feed(QMGR_SCAN *, const char *)
Definition: qmgr_active.c:171
double success
Definition: qmgr.h:205
QMGR_TRANSPORT * next
Definition: qmgr.h:98
QMGR_QUEUE * qmgr_error_queue(const char *, DSN *)
Definition: qmgr_error.c:85
void qmgr_message_free(QMGR_MESSAGE *)
int dest_concurrency_limit
Definition: qmgr.h:156
QMGR_ENTRY * next
Definition: qmgr.h:193
QMGR_ENTRY_LIST busy
Definition: qmgr.h:210
int pending
Definition: qmgr.h:154
time_t last_done
Definition: qmgr.h:199
char * queue_id
Definition: qmgr.h:298
int smtputf8
Definition: qmgr.h:303
int fail_cohort_limit
Definition: qmgr.h:165
void qmgr_message_kill_record(QMGR_MESSAGE *, long)
Definition: qmgr_message.c:868
char * client_addr
Definition: qmgr.h:312
QMGR_QUEUE * queue
Definition: qmgr.h:266
char * client_helo
Definition: qmgr.h:315
long data_size
Definition: qmgr.h:308
QMGR_TRANSPORT * qmgr_transport_create(const char *)
struct timeval active_time
Definition: qmgr.h:293
char * sasl_sender
Definition: qmgr.h:318
QMGR_ENTRY * prev
Definition: qmgr.h:194
QMGR_TRANSPORT * qmgr_error_transport(const char *)
Definition: qmgr_error.c:65
char * redirect_addr
Definition: qmgr.h:307
QMGR_QUEUE * qmgr_queue_select(QMGR_TRANSPORT *)
Definition: qmgr_queue.c:353
void qmgr_queue_suspend(QMGR_QUEUE *, int)
Definition: qmgr_queue.c:160
QMGR_FEEDBACK neg_feedback
Definition: qmgr.h:164
double fail_cohorts
Definition: qmgr.h:207
void qmgr_entry_move_todo(QMGR_QUEUE *, QMGR_ENTRY *)
Definition: qmgr_entry.c:180
QMGR_QUEUE * qmgr_queue_create(QMGR_TRANSPORT *, const char *, const char *)
Definition: qmgr_queue.c:407
void qmgr_bounce_recipient(QMGR_MESSAGE *, RECIPIENT *, DSN *)
Definition: qmgr_bounce.c:57
char * log_ident
Definition: qmgr.h:319
int xport_rate_delay
Definition: qmgr.h:166
Definition: htable.h:25
int init_dest_concurrency
Definition: qmgr.h:157
char * client_port
Definition: qmgr.h:313
QMGR_QUEUE * next
Definition: qmgr.h:148
void qmgr_message_update_warn(QMGR_MESSAGE *)
Definition: qmgr_message.c:850
QMGR_SCAN * qmgr_scan_create(const char *)
Definition: qmgr_scan.c:176
long cont_length
Definition: qmgr.h:309
long warn_offset
Definition: qmgr.h:294
int rflags
Definition: qmgr.h:287
void qmgr_queue_unthrottle(QMGR_QUEUE *)
Definition: qmgr_queue.c:198
long tflags_offset
Definition: qmgr.h:286
int flags
Definition: qmgr.h:283
int busy_refcount
Definition: qmgr.h:203
QMGR_QUEUE_LIST peers
Definition: qmgr.h:211
QMGR_MESSAGE * qmgr_message_alloc(const char *, const char *, int, mode_t)
struct timeval arrival_time
Definition: qmgr.h:291
struct HTABLE * queue_byname
Definition: qmgr.h:159
char * queue_name
Definition: qmgr.h:297
QMGR_TRANSPORT * qmgr_transport_find(const char *)
QMGR_MESSAGE * qmgr_message_realloc(QMGR_MESSAGE *)
int flags
Definition: qmgr.h:153
void qmgr_active_drain(void)
Definition: qmgr_active.c:574
char * name
Definition: qmgr.h:200
void qmgr_scan_request(QMGR_SCAN *, int)
Definition: qmgr_scan.c:112
char * rewrite_context
Definition: qmgr.h:320
QMGR_ENTRY_LIST todo
Definition: qmgr.h:209
QMGR_QUEUE * qmgr_queue_find(QMGR_TRANSPORT *, const char *)
Definition: qmgr_queue.c:439
QMGR_ENTRY * qmgr_entry_create(QMGR_QUEUE *, QMGR_MESSAGE *)
Definition: qmgr_entry.c:304
void qmgr_enable_queue(QMGR_QUEUE *)
Definition: qmgr_enable.c:98
char * sender
Definition: qmgr.h:300
void qmgr_queue_done(QMGR_QUEUE *)
Definition: qmgr_queue.c:374
void qmgr_queue_throttle(QMGR_QUEUE *, DSN *)
Definition: qmgr_queue.c:278
int qmgr_vrfy_pend_count
Definition: qmgr_message.c:152
int recipient_limit
Definition: qmgr.h:158
int dflags
Definition: qmgr.h:198
void qmgr_active_done(QMGR_MESSAGE *)
Definition: qmgr_active.c:258
QMGR_TRANSPORT * prev
Definition: qmgr.h:99
time_t warn_time
Definition: qmgr.h:295
void qmgr_entry_unselect(QMGR_QUEUE *, QMGR_ENTRY *)
Definition: qmgr_entry.c:170
long rcpt_offset
Definition: qmgr.h:310
QMGR_QUEUE * prev
Definition: qmgr.h:149
QMGR_TRANSPORT_LIST peers
Definition: qmgr.h:161
QMGR_ENTRY * qmgr_entry_select(QMGR_QUEUE *)
Definition: qmgr_entry.c:102
QMGR_ENTRY_LIST peers
Definition: qmgr.h:267
void qmgr_defer_transport(QMGR_TRANSPORT *, DSN *)
Definition: qmgr_defer.c:83
void qmgr_entry_done(QMGR_ENTRY *, int)
Definition: qmgr_entry.c:212
int qmgr_deliver_concurrency
Definition: qmgr_deliver.c:93
time_t clog_time_to_warn
Definition: qmgr.h:213
char * name
Definition: qmgr.h:155
RECIPIENT_LIST rcpt_list
Definition: qmgr.h:321
void qmgr_deliver(QMGR_TRANSPORT *, VSTREAM *)
Definition: qmgr_deliver.c:374
int qflags
Definition: qmgr.h:284
char * dsn_envid
Definition: qmgr.h:301
char * sasl_username
Definition: qmgr.h:317
void qmgr_transport_throttle(QMGR_TRANSPORT *, DSN *)
QMGR_MESSAGE * message
Definition: qmgr.h:264
void qmgr_enable_all(void)
Definition: qmgr_enable.c:60
int flags
Definition: qmgr.h:388
void qmgr_defer_recipient(QMGR_MESSAGE *, RECIPIENT *, DSN *)
Definition: qmgr_defer.c:147
int todo_refcount
Definition: qmgr.h:202
QMGR_TRANSPORT * transport
Definition: qmgr.h:208
void qmgr_transport_unthrottle(QMGR_TRANSPORT *)
void qmgr_enable_transport(QMGR_TRANSPORT *)
Definition: qmgr_enable.c:77
void qmgr_defer_todo(QMGR_QUEUE *, DSN *)
Definition: qmgr_defer.c:103
double base
Definition: qmgr.h:115
char * queue
Definition: qmgr.h:387
int hysteresis
Definition: qmgr.h:114
DSN * dsn
Definition: qmgr.h:162
void qmgr_transport_alloc(QMGR_TRANSPORT *, QMGR_TRANSPORT_ALLOC_NOTIFY)
int index
Definition: qmgr.h:116
char * sasl_method
Definition: qmgr.h:316
QMGR_QUEUE_LIST queue_list
Definition: qmgr.h:160
void qmgr_feedback_init(QMGR_FEEDBACK *, const char *, const char *, const char *, const char *)
QMGR_TRANSPORT * qmgr_transport_select(void)
int qmgr_recipient_count
Definition: qmgr_message.c:151
char * client_proto
Definition: qmgr.h:314
int qmgr_queue_count
Definition: qmgr_queue.c:112
long data_offset
Definition: qmgr.h:296
Definition: dsn.h:17
struct SCAN_DIR * handle
Definition: qmgr.h:390
time_t create_time
Definition: qmgr.h:292
char * filter_xport
Definition: qmgr.h:305
char * client_name
Definition: qmgr.h:311
int single_rcpt
Definition: qmgr.h:290
char * qmgr_error_nexthop(DSN *)
Definition: qmgr_error.c:115
char * inspect_xport
Definition: qmgr.h:306
VSTREAM * fp
Definition: qmgr.h:288
VSTREAM * stream
Definition: qmgr.h:263
RECIPIENT_LIST rcpt_list
Definition: qmgr.h:265
int tflags
Definition: qmgr.h:285
void qmgr_move(const char *, const char *, time_t)
Definition: qmgr_move.c:57
int window
Definition: qmgr.h:204
int rate_delay
Definition: qmgr.h:167
QMGR_FEEDBACK pos_feedback
Definition: qmgr.h:163
char * nexthop
Definition: qmgr.h:201
char * verp_delims
Definition: qmgr.h:304
QMGR_TRANSPORT_LIST qmgr_transport_list
struct HTABLE * qmgr_transport_byname
char * qmgr_scan_next(QMGR_SCAN *)
Definition: qmgr_scan.c:154
int qmgr_message_count
Definition: qmgr_message.c:150
DSN * dsn
Definition: qmgr.h:212
void(* QMGR_TRANSPORT_ALLOC_NOTIFY)(QMGR_TRANSPORT *, VSTREAM *)
Definition: qmgr.h:173
double failure
Definition: qmgr.h:206
int dsn_ret
Definition: qmgr.h:302
int refcount
Definition: qmgr.h:289
char * encoding
Definition: qmgr.h:299
int nflags
Definition: qmgr.h:389