[Buzilla 376] Preliminary DKIM support
[exim.git] / src / src / drtables.c
1 /* $Cambridge: exim/src/src/drtables.c,v 1.9 2007/09/28 12:21:57 tom Exp $ */
2
3 /*************************************************
4 * Exim - an Internet mail transport agent *
5 *************************************************/
6
7 /* Copyright (c) University of Cambridge 1995 - 2007 */
8 /* See the file NOTICE for conditions of use and distribution. */
9
10
11 #include "exim.h"
12
13
14 /* This module contains tables that define the lookup methods and drivers
15 that are actually included in the binary. Its contents are controlled by
16 various macros in config.h that ultimately come from Local/Makefile. They are
17 all described in src/EDITME. */
18
19
20 /* The OSF1 (Digital Unix) linker puts out a worrying warning if any sections
21 contain no executable code. It says
22
23 Warning: Linking some objects which contain exception information sections
24 and some which do not. This may cause fatal runtime exception handling
25 problems.
26
27 As this may cause people to worry needlessly, include a dummy function here
28 to stop the message from appearing. Make it call itself to stop picky compilers
29 compilers complaining that it is unused, and put in a dummy argument to stop
30 even pickier compilers complaining about infinite loops. */
31
32 static void dummy(int x) { dummy(x-1); }
33
34
35 /* Table of information about all possible lookup methods. The entries are
36 always present, but the "open" and "find" functions are set to NULL for those
37 that are not compiled into the binary. The "check" and "close" functions can
38 be NULL for methods that don't need them. */
39
40 #ifdef LOOKUP_CDB
41 #include "lookups/cdb.h"
42 #endif
43
44 #ifdef LOOKUP_DBM
45 #include "lookups/dbmdb.h"
46 #endif
47
48 #ifdef LOOKUP_DNSDB
49 #include "lookups/dnsdb.h"
50 #endif
51
52 #ifdef LOOKUP_DSEARCH
53 #include "lookups/dsearch.h"
54 #endif
55
56 #ifdef LOOKUP_IBASE
57 #include "lookups/ibase.h"
58 #endif
59
60 #ifdef LOOKUP_LDAP
61 #include "lookups/ldap.h"
62 #endif
63
64 #ifdef LOOKUP_LSEARCH
65 #include "lookups/lsearch.h"
66 #endif
67
68 #ifdef LOOKUP_MYSQL
69 #include "lookups/mysql.h"
70 #endif
71
72 #ifdef LOOKUP_NIS
73 #include "lookups/nis.h"
74 #endif
75
76 #ifdef LOOKUP_NISPLUS
77 #include "lookups/nisplus.h"
78 #endif
79
80 #ifdef LOOKUP_ORACLE
81 #include "lookups/oracle.h"
82 #endif
83
84 #ifdef LOOKUP_PASSWD
85 #include "lookups/passwd.h"
86 #endif
87
88 #ifdef LOOKUP_PGSQL
89 #include "lookups/pgsql.h"
90 #endif
91
92 #ifdef EXPERIMENTAL_SPF
93 #include "lookups/spf.h"
94 #endif
95
96 #ifdef LOOKUP_SQLITE
97 #include "lookups/sqlite.h"
98 #endif
99
100 #ifdef LOOKUP_TESTDB
101 #include "lookups/testdb.h"
102 #endif
103
104 #ifdef LOOKUP_WHOSON
105 #include "lookups/whoson.h"
106 #endif
107
108 #ifdef EXPERIMENTAL_DKIM
109 #include "lookups/dkim.h"
110 #endif
111
112
113 /* The second field in each item below is a set of bit flags:
114
115 lookup_querystyle => this is a query-style lookup,
116 else single-key (+ file) style
117 lookup_absfile => an absolute file name is required,
118 (for single-key style only)
119
120 This list must be in alphabetical order of lookup name because it is
121 searched by binary chop, having got rather large for the original linear
122 searching. */
123
124 lookup_info lookup_list[] = {
125
126 /* cdb lookup in single file */
127
128 {
129 US"cdb", /* lookup name */
130 lookup_absfile, /* uses absolute file name */
131 #ifdef LOOKUP_CDB
132 cdb_open, /* open function */
133 cdb_check, /* check function */
134 cdb_find, /* find function */
135 cdb_close, /* close function */
136 NULL, /* no tidy function */
137 NULL /* no quoting function */
138 #else
139 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
140 #endif
141 },
142
143 /* DBM file lookup; called "dbm" because that is the name in Exim,
144 but the code is called dbmdb to avoid name clashes. */
145
146 {
147 US"dbm", /* lookup name */
148 lookup_absfile, /* uses absolute file name */
149 #ifdef LOOKUP_DBM
150 dbmdb_open, /* open function */
151 dbmdb_check, /* check function */
152 dbmdb_find, /* find function */
153 dbmdb_close, /* close function */
154 NULL, /* no tidy function */
155 NULL /* no quoting function */
156 #else
157 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
158 #endif
159 },
160
161 /* This variant of DBM does not include the binary zero on the end
162 of the key strings. */
163
164 {
165 US"dbmnz", /* lookup name */
166 lookup_absfile, /* uses absolute file name */
167 #ifdef LOOKUP_DBM
168 dbmdb_open, /* sic */ /* open function */
169 dbmdb_check, /* sic */ /* check function */
170 dbmnz_find, /* find function */
171 dbmdb_close, /* sic */ /* close function */
172 NULL, /* no tidy function */
173 NULL /* no quoting function */
174 #else
175 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
176 #endif
177 },
178
179 /* DKIM lookups */
180
181 {
182 US"dkim", /* lookup name */
183 lookup_querystyle, /* query style */
184 #ifdef EXPERIMENTAL_DKIM
185 dkim_open, /* open function */
186 NULL, /* check function */
187 dkim_find, /* find function */
188 NULL, /* no close function */
189 NULL, /* no tidy function */
190 NULL /* no quoting function */
191 #else
192 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
193 #endif
194 },
195
196 /* Using DNS TXT records as a database */
197
198 {
199 US"dnsdb", /* lookup name */
200 lookup_querystyle, /* query style */
201 #ifdef LOOKUP_DNSDB
202 dnsdb_open, /* open function */
203 NULL, /* check function */
204 dnsdb_find, /* find function */
205 NULL, /* no close function */
206 NULL, /* no tidy function */
207 NULL /* no quoting function */
208 #else
209 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
210 #endif
211 },
212
213 /* Search of files in a directory */
214
215 {
216 US"dsearch", /* lookup name */
217 lookup_absfile, /* uses absolute file name */
218 #ifdef LOOKUP_DSEARCH
219 dsearch_open, /* open function */
220 dsearch_check, /* check function */
221 dsearch_find, /* find function */
222 dsearch_close, /* close function */
223 NULL, /* no tidy function */
224 NULL /* no quoting function */
225 #else
226 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
227 #endif
228 },
229
230 /* Interbase lookup */
231
232 {
233 US"ibase", /* lookup name */
234 lookup_querystyle, /* query-style lookup */
235 #ifdef LOOKUP_IBASE
236 ibase_open, /* open function */
237 NULL, /* no check function */
238 ibase_find, /* find function */
239 NULL, /* no close function */
240 ibase_tidy, /* tidy function */
241 ibase_quote /* quoting function */
242 #else
243 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
244 #endif
245 },
246
247 /* Linear search of single file with ip-addresses and networks; shares many
248 functions with lsearch. */
249
250 {
251 US"iplsearch", /* lookup name */
252 lookup_absfile, /* uses absolute file name */
253 #ifdef LOOKUP_LSEARCH
254 lsearch_open, /* open function */
255 lsearch_check, /* check function */
256 iplsearch_find, /* find function */
257 lsearch_close, /* close function */
258 NULL, /* no tidy function */
259 NULL /* no quoting function */
260 #else
261 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
262 #endif
263 },
264
265 /* LDAP lookup, allowing data from only one entry to be returned */
266
267 {
268 US"ldap", /* lookup name */
269 lookup_querystyle, /* query-style lookup */
270 #ifdef LOOKUP_LDAP
271 eldap_open, /* open function */
272 NULL, /* check function */
273 eldap_find, /* find function */
274 NULL, /* no close function */
275 eldap_tidy, /* tidy function */
276 eldap_quote /* quoting function */
277 #else
278 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
279 #endif
280 },
281
282 /* LDAP lookup, allowing the DN from more one entry to be returned */
283
284 {
285 US"ldapdn", /* lookup name */
286 lookup_querystyle, /* query-style lookup */
287 #ifdef LOOKUP_LDAP
288 eldap_open, /* sic */ /* open function */
289 NULL, /* check function */
290 eldapdn_find, /* find function */
291 NULL, /* no close function */
292 eldap_tidy, /* sic */ /* tidy function */
293 eldap_quote /* sic */ /* quoting function */
294 #else
295 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
296 #endif
297 },
298
299 /* LDAP lookup, allowing data from more than one entry to be returned */
300
301 {
302 US"ldapm", /* lookup name */
303 lookup_querystyle, /* query-style lookup */
304 #ifdef LOOKUP_LDAP
305 eldap_open, /* sic */ /* open function */
306 NULL, /* check function */
307 eldapm_find, /* find function */
308 NULL, /* no close function */
309 eldap_tidy, /* sic */ /* tidy function */
310 eldap_quote /* sic */ /* quoting function */
311 #else
312 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
313 #endif
314 },
315
316 /* Linear search of single file */
317
318 {
319 US"lsearch", /* lookup name */
320 lookup_absfile, /* uses absolute file name */
321 #ifdef LOOKUP_LSEARCH
322 lsearch_open, /* open function */
323 lsearch_check, /* check function */
324 lsearch_find, /* find function */
325 lsearch_close, /* close function */
326 NULL, /* no tidy function */
327 NULL /* no quoting function */
328 #else
329 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
330 #endif
331 },
332
333 /* MYSQL lookup */
334
335 {
336 US"mysql", /* lookup name */
337 lookup_querystyle, /* query-style lookup */
338 #ifdef LOOKUP_MYSQL
339 mysql_open, /* open function */
340 NULL, /* no check function */
341 mysql_find, /* find function */
342 NULL, /* no close function */
343 mysql_tidy, /* tidy function */
344 mysql_quote /* quoting function */
345 #else
346 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
347 #endif
348 },
349
350 /* NIS lookup, excluding trailing 0 from key */
351
352 {
353 US"nis", /* lookup name */
354 0, /* not abs file, not query style*/
355 #ifdef LOOKUP_NIS
356 nis_open, /* open function */
357 NULL, /* check function */
358 nis_find, /* find function */
359 NULL, /* no close function */
360 NULL, /* no tidy function */
361 NULL /* no quoting function */
362 #else
363 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
364 #endif
365 },
366
367 /* NIS lookup, including trailing 0 in key */
368
369 {
370 US"nis0", /* lookup name */
371 0, /* not absfile, not query style */
372 #ifdef LOOKUP_NIS
373 nis_open, /* sic */ /* open function */
374 NULL, /* check function */
375 nis0_find, /* find function */
376 NULL, /* no close function */
377 NULL, /* no tidy function */
378 NULL /* no quoting function */
379 #else
380 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
381 #endif
382 },
383
384 /* NIS+ lookup */
385
386 {
387 US"nisplus", /* lookup name */
388 lookup_querystyle, /* query-style lookup */
389 #ifdef LOOKUP_NISPLUS
390 nisplus_open, /* open function */
391 NULL, /* check function */
392 nisplus_find, /* find function */
393 NULL, /* no close function */
394 NULL, /* no tidy function */
395 nisplus_quote /* quoting function */
396 #else
397 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
398 #endif
399 },
400
401 /* Linear search of single file, with wildcarding but no pattern expansion.
402 Shares many functions with lsearch. */
403
404 {
405 US"nwildlsearch", /* lookup name */
406 lookup_absfile, /* uses absolute file name */
407 #ifdef LOOKUP_LSEARCH
408 lsearch_open, /* open function */
409 lsearch_check, /* check function */
410 nwildlsearch_find, /* find function */
411 lsearch_close, /* close function */
412 NULL, /* no tidy function */
413 NULL /* no quoting function */
414 #else
415 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
416 #endif
417 },
418
419 /* Oracle lookup */
420
421 {
422 US"oracle", /* lookup name */
423 lookup_querystyle, /* query-style lookup */
424 #ifdef LOOKUP_ORACLE
425 oracle_open, /* open function */
426 NULL, /* check function */
427 oracle_find, /* find function */
428 NULL, /* no close function */
429 oracle_tidy, /* tidy function */
430 oracle_quote /* quoting function */
431 #else
432 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
433 #endif
434 },
435
436 /* passwd lookup */
437
438 {
439 US"passwd", /* lookup name */
440 lookup_querystyle, /* query-style lookup */
441 #ifdef LOOKUP_PASSWD
442 passwd_open, /* open function */
443 NULL, /* no check function */
444 passwd_find, /* find function */
445 NULL, /* no close function */
446 NULL, /* no tidy function */
447 NULL /* no quoting function */
448 #else
449 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
450 #endif
451 },
452
453 /* PGSQL lookup */
454
455 {
456 US"pgsql", /* lookup name */
457 lookup_querystyle, /* query-style lookup */
458 #ifdef LOOKUP_PGSQL
459 pgsql_open, /* open function */
460 NULL, /* no check function */
461 pgsql_find, /* find function */
462 NULL, /* no close function */
463 pgsql_tidy, /* tidy function */
464 pgsql_quote /* quoting function */
465 #else
466 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
467 #endif
468 },
469
470 /* SPF lookup */
471
472 {
473 US"spf", /* lookup name */
474 0, /* not absfile, not query style */
475 #ifdef EXPERIMENTAL_SPF
476 spf_open, /* open function */
477 NULL, /* no check function */
478 spf_find, /* find function */
479 spf_close, /* close function */
480 NULL, /* no tidy function */
481 NULL /* no quoting function */
482 #else
483 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
484 #endif
485 },
486
487 /* sqlite lookup */
488
489 {
490 US"sqlite", /* lookup name */
491 lookup_absfilequery, /* query-style lookup, starts with file name */
492 #ifdef LOOKUP_SQLITE
493 sqlite_open, /* open function */
494 NULL, /* no check function */
495 sqlite_find, /* find function */
496 sqlite_close, /* close function */
497 NULL, /* no tidy function */
498 sqlite_quote /* quoting function */
499 #else
500 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
501 #endif
502 },
503
504 /* Testdb lookup is for testing Exim, not useful for normal running.
505 For that reason, we omit the entry entirely when not building it into
506 the binary, so that attempts to use it give "unknown lookup type" instead
507 of "lookup type not available". */
508
509 #ifdef LOOKUP_TESTDB
510 {
511 US"testdb", /* lookup name */
512 lookup_querystyle, /* query-style lookup */
513 testdb_open, /* open function */
514 NULL, /* check function */
515 testdb_find, /* find function */
516 NULL, /* no close function */
517 NULL, /* no tidy function */
518 NULL /* no quoting function */
519 },
520 #endif
521
522 /* "Whoson" lookup */
523
524 {
525 US"whoson", /* lookup name */
526 lookup_querystyle, /* query-style lookup */
527 #ifdef LOOKUP_WHOSON
528 whoson_open, /* open function */
529 NULL, /* check function */
530 whoson_find, /* find function */
531 NULL, /* no close function */
532 NULL, /* no tidy function */
533 NULL /* no quoting function */
534 #else
535 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
536 #endif
537 },
538
539 /* Linear search of single file, with wildcarding and pattern expansion. Shares
540 many functions with lsearch. */
541
542 {
543 US"wildlsearch", /* lookup name */
544 lookup_absfile, /* uses absolute file name */
545 #ifdef LOOKUP_LSEARCH
546 lsearch_open, /* open function */
547 lsearch_check, /* check function */
548 wildlsearch_find, /* find function */
549 lsearch_close, /* close function */
550 NULL, /* no tidy function */
551 NULL /* no quoting function */
552 #else
553 NULL, NULL, NULL, NULL, NULL, NULL /* lookup not present */
554 #endif
555 }
556 };
557
558 /* Number of entries in the list */
559
560 int lookup_list_count = sizeof(lookup_list)/sizeof(lookup_info);
561
562
563
564 /* Table of information about all possible authentication mechamisms. All
565 entries are always present if any mechanism is declared, but the functions are
566 set to NULL for those that are not compiled into the binary. */
567
568 #ifdef AUTH_CRAM_MD5
569 #include "auths/cram_md5.h"
570 #endif
571
572 #ifdef AUTH_CYRUS_SASL
573 #include "auths/cyrus_sasl.h"
574 #endif
575
576 #ifdef AUTH_DOVECOT
577 #include "auths/dovecot.h"
578 #endif
579
580 #ifdef AUTH_PLAINTEXT
581 #include "auths/plaintext.h"
582 #endif
583
584 #ifdef AUTH_SPA
585 #include "auths/spa.h"
586 #endif
587
588 auth_info auths_available[] = {
589
590 /* Checking by an expansion condition on plain text */
591
592 #ifdef AUTH_CRAM_MD5
593 {
594 US"cram_md5", /* lookup name */
595 auth_cram_md5_options,
596 &auth_cram_md5_options_count,
597 &auth_cram_md5_option_defaults,
598 sizeof(auth_cram_md5_options_block),
599 auth_cram_md5_init, /* init function */
600 auth_cram_md5_server, /* server function */
601 auth_cram_md5_client /* client function */
602 },
603 #endif
604
605 #ifdef AUTH_CYRUS_SASL
606 {
607 US"cyrus_sasl", /* lookup name */
608 auth_cyrus_sasl_options,
609 &auth_cyrus_sasl_options_count,
610 &auth_cyrus_sasl_option_defaults,
611 sizeof(auth_cyrus_sasl_options_block),
612 auth_cyrus_sasl_init, /* init function */
613 auth_cyrus_sasl_server, /* server function */
614 NULL /* client function */
615 },
616 #endif
617
618 #ifdef AUTH_DOVECOT
619 {
620 US"dovecot", /* lookup name */
621 auth_dovecot_options,
622 &auth_dovecot_options_count,
623 &auth_dovecot_option_defaults,
624 sizeof(auth_dovecot_options_block),
625 auth_dovecot_init, /* init function */
626 auth_dovecot_server, /* server function */
627 NULL /* client function */
628 },
629 #endif
630
631 #ifdef AUTH_PLAINTEXT
632 {
633 US"plaintext", /* lookup name */
634 auth_plaintext_options,
635 &auth_plaintext_options_count,
636 &auth_plaintext_option_defaults,
637 sizeof(auth_plaintext_options_block),
638 auth_plaintext_init, /* init function */
639 auth_plaintext_server, /* server function */
640 auth_plaintext_client /* client function */
641 },
642 #endif
643
644 #ifdef AUTH_SPA
645 {
646 US"spa", /* lookup name */
647 auth_spa_options,
648 &auth_spa_options_count,
649 &auth_spa_option_defaults,
650 sizeof(auth_spa_options_block),
651 auth_spa_init, /* init function */
652 auth_spa_server, /* server function */
653 auth_spa_client /* client function */
654 },
655 #endif
656
657 { US"", NULL, NULL, NULL, 0, NULL, NULL, NULL }
658 };
659
660
661 /* Tables of information about which routers and transports are included in the
662 exim binary. */
663
664 /* Pull in the necessary header files */
665
666 #include "routers/rf_functions.h"
667
668 #ifdef ROUTER_ACCEPT
669 #include "routers/accept.h"
670 #endif
671
672 #ifdef ROUTER_DNSLOOKUP
673 #include "routers/dnslookup.h"
674 #endif
675
676 #ifdef ROUTER_MANUALROUTE
677 #include "routers/manualroute.h"
678 #endif
679
680 #ifdef ROUTER_IPLITERAL
681 #include "routers/ipliteral.h"
682 #endif
683
684 #ifdef ROUTER_IPLOOKUP
685 #include "routers/iplookup.h"
686 #endif
687
688 #ifdef ROUTER_QUERYPROGRAM
689 #include "routers/queryprogram.h"
690 #endif
691
692 #ifdef ROUTER_REDIRECT
693 #include "routers/redirect.h"
694 #endif
695
696 #ifdef TRANSPORT_APPENDFILE
697 #include "transports/appendfile.h"
698 #endif
699
700 #ifdef TRANSPORT_AUTOREPLY
701 #include "transports/autoreply.h"
702 #endif
703
704 #ifdef TRANSPORT_LMTP
705 #include "transports/lmtp.h"
706 #endif
707
708 #ifdef TRANSPORT_PIPE
709 #include "transports/pipe.h"
710 #endif
711
712 #ifdef TRANSPORT_SMTP
713 #include "transports/smtp.h"
714 #endif
715
716
717 /* Now set up the structures, terminated by an entry with a null name. */
718
719 router_info routers_available[] = {
720 #ifdef ROUTER_ACCEPT
721 {
722 US"accept",
723 accept_router_options,
724 &accept_router_options_count,
725 &accept_router_option_defaults,
726 sizeof(accept_router_options_block),
727 accept_router_init,
728 accept_router_entry,
729 NULL, /* no tidyup entry */
730 ri_yestransport
731 },
732 #endif
733 #ifdef ROUTER_DNSLOOKUP
734 {
735 US"dnslookup",
736 dnslookup_router_options,
737 &dnslookup_router_options_count,
738 &dnslookup_router_option_defaults,
739 sizeof(dnslookup_router_options_block),
740 dnslookup_router_init,
741 dnslookup_router_entry,
742 NULL, /* no tidyup entry */
743 ri_yestransport
744 },
745 #endif
746 #ifdef ROUTER_IPLITERAL
747 {
748 US"ipliteral",
749 ipliteral_router_options,
750 &ipliteral_router_options_count,
751 &ipliteral_router_option_defaults,
752 sizeof(ipliteral_router_options_block),
753 ipliteral_router_init,
754 ipliteral_router_entry,
755 NULL, /* no tidyup entry */
756 ri_yestransport
757 },
758 #endif
759 #ifdef ROUTER_IPLOOKUP
760 {
761 US"iplookup",
762 iplookup_router_options,
763 &iplookup_router_options_count,
764 &iplookup_router_option_defaults,
765 sizeof(iplookup_router_options_block),
766 iplookup_router_init,
767 iplookup_router_entry,
768 NULL, /* no tidyup entry */
769 ri_notransport
770 },
771 #endif
772 #ifdef ROUTER_MANUALROUTE
773 {
774 US"manualroute",
775 manualroute_router_options,
776 &manualroute_router_options_count,
777 &manualroute_router_option_defaults,
778 sizeof(manualroute_router_options_block),
779 manualroute_router_init,
780 manualroute_router_entry,
781 NULL, /* no tidyup entry */
782 0
783 },
784 #endif
785 #ifdef ROUTER_QUERYPROGRAM
786 {
787 US"queryprogram",
788 queryprogram_router_options,
789 &queryprogram_router_options_count,
790 &queryprogram_router_option_defaults,
791 sizeof(queryprogram_router_options_block),
792 queryprogram_router_init,
793 queryprogram_router_entry,
794 NULL, /* no tidyup entry */
795 0
796 },
797 #endif
798 #ifdef ROUTER_REDIRECT
799 {
800 US"redirect",
801 redirect_router_options,
802 &redirect_router_options_count,
803 &redirect_router_option_defaults,
804 sizeof(redirect_router_options_block),
805 redirect_router_init,
806 redirect_router_entry,
807 NULL, /* no tidyup entry */
808 ri_notransport
809 },
810 #endif
811 { US"", NULL, NULL, NULL, 0, NULL, NULL, NULL, 0 }
812 };
813
814
815
816 transport_info transports_available[] = {
817 #ifdef TRANSPORT_APPENDFILE
818 {
819 US"appendfile", /* driver name */
820 appendfile_transport_options, /* local options table */
821 &appendfile_transport_options_count, /* number of entries */
822 &appendfile_transport_option_defaults, /* private options defaults */
823 sizeof(appendfile_transport_options_block), /* size of private block */
824 appendfile_transport_init, /* init entry point */
825 appendfile_transport_entry, /* main entry point */
826 NULL, /* no tidyup entry */
827 NULL, /* no closedown entry */
828 TRUE, /* local flag */
829 },
830 #endif
831 #ifdef TRANSPORT_AUTOREPLY
832 {
833 US"autoreply", /* driver name */
834 autoreply_transport_options, /* local options table */
835 &autoreply_transport_options_count, /* number of entries */
836 &autoreply_transport_option_defaults, /* private options defaults */
837 sizeof(autoreply_transport_options_block), /* size of private block */
838 autoreply_transport_init, /* init entry point */
839 autoreply_transport_entry, /* main entry point */
840 NULL, /* no tidyup entry */
841 NULL, /* no closedown entry */
842 TRUE /* local flag */
843 },
844 #endif
845 #ifdef TRANSPORT_LMTP
846 {
847 US"lmtp", /* driver name */
848 lmtp_transport_options, /* local options table */
849 &lmtp_transport_options_count, /* number of entries */
850 &lmtp_transport_option_defaults, /* private options defaults */
851 sizeof(lmtp_transport_options_block), /* size of private block */
852 lmtp_transport_init, /* init entry point */
853 lmtp_transport_entry, /* main entry point */
854 NULL, /* no tidyup entry */
855 NULL, /* no closedown entry */
856 TRUE /* local flag */
857 },
858 #endif
859 #ifdef TRANSPORT_PIPE
860 {
861 US"pipe", /* driver name */
862 pipe_transport_options, /* local options table */
863 &pipe_transport_options_count, /* number of entries */
864 &pipe_transport_option_defaults, /* private options defaults */
865 sizeof(pipe_transport_options_block), /* size of private block */
866 pipe_transport_init, /* init entry point */
867 pipe_transport_entry, /* main entry point */
868 NULL, /* no tidyup entry */
869 NULL, /* no closedown entry */
870 TRUE /* local flag */
871 },
872 #endif
873 #ifdef TRANSPORT_SMTP
874 {
875 US"smtp", /* driver name */
876 smtp_transport_options, /* local options table */
877 &smtp_transport_options_count, /* number of entries */
878 &smtp_transport_option_defaults, /* private options defaults */
879 sizeof(smtp_transport_options_block), /* size of private block */
880 smtp_transport_init, /* init entry point */
881 smtp_transport_entry, /* main entry point */
882 NULL, /* no tidyup entry */
883 smtp_transport_closedown, /* close down passed channel */
884 FALSE /* local flag */
885 },
886 #endif
887 { US"", NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, FALSE }
888 };
889
890 /* End of drtables.c */