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