1 /*************************************************
2 * Exim - an Internet mail transport agent *
3 *************************************************/
5 /* Copyright (c) University of Cambridge 1995 - 2015 */
6 /* See the file NOTICE for conditions of use and distribution. */
13 /* This module contains tables that define the lookup methods and drivers
14 that are actually included in the binary. Its contents are controlled by
15 various macros in config.h that ultimately come from Local/Makefile. They are
16 all described in src/EDITME. */
19 lookup_info **lookup_list;
20 int lookup_list_count = 0;
22 static int lookup_list_init_done = 0;
24 /* Table of information about all possible authentication mechamisms. All
25 entries are always present if any mechanism is declared, but the functions are
26 set to NULL for those that are not compiled into the binary. */
29 #include "auths/cram_md5.h"
32 #ifdef AUTH_CYRUS_SASL
33 #include "auths/cyrus_sasl.h"
37 #include "auths/dovecot.h"
41 #include "auths/gsasl_exim.h"
44 #ifdef AUTH_HEIMDAL_GSSAPI
45 #include "auths/heimdal_gssapi.h"
49 #include "auths/plaintext.h"
53 #include "auths/spa.h"
57 #include "auths/tls.h"
60 auth_info auths_available[] = {
62 /* Checking by an expansion condition on plain text */
66 US"cram_md5", /* lookup name */
67 auth_cram_md5_options,
68 &auth_cram_md5_options_count,
69 &auth_cram_md5_option_defaults,
70 sizeof(auth_cram_md5_options_block),
71 auth_cram_md5_init, /* init function */
72 auth_cram_md5_server, /* server function */
73 auth_cram_md5_client, /* client function */
74 NULL /* diagnostic function */
78 #ifdef AUTH_CYRUS_SASL
80 US"cyrus_sasl", /* lookup name */
81 auth_cyrus_sasl_options,
82 &auth_cyrus_sasl_options_count,
83 &auth_cyrus_sasl_option_defaults,
84 sizeof(auth_cyrus_sasl_options_block),
85 auth_cyrus_sasl_init, /* init function */
86 auth_cyrus_sasl_server, /* server function */
87 NULL, /* client function */
88 auth_cyrus_sasl_version_report /* diagnostic function */
94 US"dovecot", /* lookup name */
96 &auth_dovecot_options_count,
97 &auth_dovecot_option_defaults,
98 sizeof(auth_dovecot_options_block),
99 auth_dovecot_init, /* init function */
100 auth_dovecot_server, /* server function */
101 NULL, /* client function */
102 NULL /* diagnostic function */
108 US"gsasl", /* lookup name */
110 &auth_gsasl_options_count,
111 &auth_gsasl_option_defaults,
112 sizeof(auth_gsasl_options_block),
113 auth_gsasl_init, /* init function */
114 auth_gsasl_server, /* server function */
115 NULL, /* client function */
116 auth_gsasl_version_report /* diagnostic function */
120 #ifdef AUTH_HEIMDAL_GSSAPI
122 US"heimdal_gssapi", /* lookup name */
123 auth_heimdal_gssapi_options,
124 &auth_heimdal_gssapi_options_count,
125 &auth_heimdal_gssapi_option_defaults,
126 sizeof(auth_heimdal_gssapi_options_block),
127 auth_heimdal_gssapi_init, /* init function */
128 auth_heimdal_gssapi_server, /* server function */
129 NULL, /* client function */
130 auth_heimdal_gssapi_version_report /* diagnostic function */
134 #ifdef AUTH_PLAINTEXT
136 US"plaintext", /* lookup name */
137 auth_plaintext_options,
138 &auth_plaintext_options_count,
139 &auth_plaintext_option_defaults,
140 sizeof(auth_plaintext_options_block),
141 auth_plaintext_init, /* init function */
142 auth_plaintext_server, /* server function */
143 auth_plaintext_client, /* client function */
144 NULL /* diagnostic function */
150 US"spa", /* lookup name */
152 &auth_spa_options_count,
153 &auth_spa_option_defaults,
154 sizeof(auth_spa_options_block),
155 auth_spa_init, /* init function */
156 auth_spa_server, /* server function */
157 auth_spa_client, /* client function */
158 NULL /* diagnostic function */
164 US"tls", /* lookup name */
166 &auth_tls_options_count,
167 &auth_tls_option_defaults,
168 sizeof(auth_tls_options_block),
169 auth_tls_init, /* init function */
170 auth_tls_server, /* server function */
171 NULL, /* client function */
172 NULL /* diagnostic function */
176 { US"", NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL }
180 /* Tables of information about which routers and transports are included in the
183 /* Pull in the necessary header files */
185 #include "routers/rf_functions.h"
188 #include "routers/accept.h"
191 #ifdef ROUTER_DNSLOOKUP
192 #include "routers/dnslookup.h"
195 #ifdef ROUTER_MANUALROUTE
196 #include "routers/manualroute.h"
199 #ifdef ROUTER_IPLITERAL
200 #include "routers/ipliteral.h"
203 #ifdef ROUTER_IPLOOKUP
204 #include "routers/iplookup.h"
207 #ifdef ROUTER_QUERYPROGRAM
208 #include "routers/queryprogram.h"
211 #ifdef ROUTER_REDIRECT
212 #include "routers/redirect.h"
215 #ifdef TRANSPORT_APPENDFILE
216 #include "transports/appendfile.h"
219 #ifdef TRANSPORT_AUTOREPLY
220 #include "transports/autoreply.h"
223 #ifdef TRANSPORT_LMTP
224 #include "transports/lmtp.h"
227 #ifdef TRANSPORT_PIPE
228 #include "transports/pipe.h"
231 #ifdef TRANSPORT_SMTP
232 #include "transports/smtp.h"
236 /* Now set up the structures, terminated by an entry with a null name. */
238 router_info routers_available[] = {
242 accept_router_options,
243 &accept_router_options_count,
244 &accept_router_option_defaults,
245 sizeof(accept_router_options_block),
248 NULL, /* no tidyup entry */
252 #ifdef ROUTER_DNSLOOKUP
255 dnslookup_router_options,
256 &dnslookup_router_options_count,
257 &dnslookup_router_option_defaults,
258 sizeof(dnslookup_router_options_block),
259 dnslookup_router_init,
260 dnslookup_router_entry,
261 NULL, /* no tidyup entry */
265 #ifdef ROUTER_IPLITERAL
268 ipliteral_router_options,
269 &ipliteral_router_options_count,
270 &ipliteral_router_option_defaults,
271 sizeof(ipliteral_router_options_block),
272 ipliteral_router_init,
273 ipliteral_router_entry,
274 NULL, /* no tidyup entry */
278 #ifdef ROUTER_IPLOOKUP
281 iplookup_router_options,
282 &iplookup_router_options_count,
283 &iplookup_router_option_defaults,
284 sizeof(iplookup_router_options_block),
285 iplookup_router_init,
286 iplookup_router_entry,
287 NULL, /* no tidyup entry */
291 #ifdef ROUTER_MANUALROUTE
294 manualroute_router_options,
295 &manualroute_router_options_count,
296 &manualroute_router_option_defaults,
297 sizeof(manualroute_router_options_block),
298 manualroute_router_init,
299 manualroute_router_entry,
300 NULL, /* no tidyup entry */
304 #ifdef ROUTER_QUERYPROGRAM
307 queryprogram_router_options,
308 &queryprogram_router_options_count,
309 &queryprogram_router_option_defaults,
310 sizeof(queryprogram_router_options_block),
311 queryprogram_router_init,
312 queryprogram_router_entry,
313 NULL, /* no tidyup entry */
317 #ifdef ROUTER_REDIRECT
320 redirect_router_options,
321 &redirect_router_options_count,
322 &redirect_router_option_defaults,
323 sizeof(redirect_router_options_block),
324 redirect_router_init,
325 redirect_router_entry,
326 NULL, /* no tidyup entry */
330 { US"", NULL, NULL, NULL, 0, NULL, NULL, NULL, 0 }
335 transport_info transports_available[] = {
336 #ifdef TRANSPORT_APPENDFILE
338 US"appendfile", /* driver name */
339 appendfile_transport_options, /* local options table */
340 &appendfile_transport_options_count, /* number of entries */
341 &appendfile_transport_option_defaults, /* private options defaults */
342 sizeof(appendfile_transport_options_block), /* size of private block */
343 appendfile_transport_init, /* init entry point */
344 appendfile_transport_entry, /* main entry point */
345 NULL, /* no tidyup entry */
346 NULL, /* no closedown entry */
347 TRUE, /* local flag */
350 #ifdef TRANSPORT_AUTOREPLY
352 US"autoreply", /* driver name */
353 autoreply_transport_options, /* local options table */
354 &autoreply_transport_options_count, /* number of entries */
355 &autoreply_transport_option_defaults, /* private options defaults */
356 sizeof(autoreply_transport_options_block), /* size of private block */
357 autoreply_transport_init, /* init entry point */
358 autoreply_transport_entry, /* main entry point */
359 NULL, /* no tidyup entry */
360 NULL, /* no closedown entry */
361 TRUE /* local flag */
364 #ifdef TRANSPORT_LMTP
366 US"lmtp", /* driver name */
367 lmtp_transport_options, /* local options table */
368 &lmtp_transport_options_count, /* number of entries */
369 &lmtp_transport_option_defaults, /* private options defaults */
370 sizeof(lmtp_transport_options_block), /* size of private block */
371 lmtp_transport_init, /* init entry point */
372 lmtp_transport_entry, /* main entry point */
373 NULL, /* no tidyup entry */
374 NULL, /* no closedown entry */
375 TRUE /* local flag */
378 #ifdef TRANSPORT_PIPE
380 US"pipe", /* driver name */
381 pipe_transport_options, /* local options table */
382 &pipe_transport_options_count, /* number of entries */
383 &pipe_transport_option_defaults, /* private options defaults */
384 sizeof(pipe_transport_options_block), /* size of private block */
385 pipe_transport_init, /* init entry point */
386 pipe_transport_entry, /* main entry point */
387 NULL, /* no tidyup entry */
388 NULL, /* no closedown entry */
389 TRUE /* local flag */
392 #ifdef TRANSPORT_SMTP
394 US"smtp", /* driver name */
395 smtp_transport_options, /* local options table */
396 &smtp_transport_options_count, /* number of entries */
397 &smtp_transport_option_defaults, /* private options defaults */
398 sizeof(smtp_transport_options_block), /* size of private block */
399 smtp_transport_init, /* init entry point */
400 smtp_transport_entry, /* main entry point */
401 NULL, /* no tidyup entry */
402 smtp_transport_closedown, /* close down passed channel */
403 FALSE /* local flag */
406 { US"", NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, FALSE }
409 struct lookupmodulestr
412 struct lookup_module_info *info;
413 struct lookupmodulestr *next;
416 static struct lookupmodulestr *lookupmodules = NULL;
418 static void addlookupmodule(void *dl, struct lookup_module_info *info)
420 struct lookupmodulestr *p = store_malloc(sizeof(struct lookupmodulestr));
423 p->next = lookupmodules;
425 lookup_list_count += info->lookupcount;
428 /* only valid after lookup_list and lookup_list_count are assigned */
429 static void add_lookup_to_list(lookup_info *info)
431 /* need to add the lookup to lookup_list, sorted */
434 /* strategy is to go through the list until we find
435 * either an empty spot or a name that is higher.
436 * this can't fail because we have enough space. */
437 while (lookup_list[pos]
438 && (Ustrcmp(lookup_list[pos]->name, info->name) <= 0)) {
441 if (lookup_list[pos]) {
442 /* need to insert it, so move all the other items up
443 * (last slot is still empty, of course) */
444 memmove(&lookup_list[pos+1],
446 sizeof(lookup_info **) * (lookup_list_count-pos-1));
448 lookup_list[pos] = info;
452 /* These need to be at file level for old versions of gcc (2.95.2 reported),
453 * which give parse errors on an extern in function scope. Each entry needs
454 * to also be invoked in init_lookup_list() below */
456 #if defined(LOOKUP_WHOSON) && LOOKUP_WHOSON!=2
457 extern lookup_module_info whoson_lookup_module_info;
459 #if defined(LOOKUP_TESTDB) && LOOKUP_TESTDB!=2
460 extern lookup_module_info testdb_lookup_module_info;
462 #if defined(LOOKUP_SQLITE) && LOOKUP_SQLITE!=2
463 extern lookup_module_info sqlite_lookup_module_info;
465 #ifdef EXPERIMENTAL_SPF
466 extern lookup_module_info spf_lookup_module_info;
468 #if defined(LOOKUP_PGSQL) && LOOKUP_PGSQL!=2
469 extern lookup_module_info pgsql_lookup_module_info;
471 #if defined(LOOKUP_PASSWD) && LOOKUP_PASSWD!=2
472 extern lookup_module_info passwd_lookup_module_info;
474 #if defined(LOOKUP_REDIS) && LOOKUP_REDIS!=2
475 extern lookup_module_info redis_lookup_module_info;
477 #if defined(LOOKUP_ORACLE) && LOOKUP_ORACLE!=2
478 extern lookup_module_info oracle_lookup_module_info;
480 #if defined(LOOKUP_NISPLUS) && LOOKUP_NISPLUS!=2
481 extern lookup_module_info nisplus_lookup_module_info;
483 #if defined(LOOKUP_NIS) && LOOKUP_NIS!=2
484 extern lookup_module_info nis_lookup_module_info;
486 #if defined(LOOKUP_MYSQL) && LOOKUP_MYSQL!=2
487 extern lookup_module_info mysql_lookup_module_info;
489 #if defined(LOOKUP_LSEARCH) && LOOKUP_LSEARCH!=2
490 extern lookup_module_info lsearch_lookup_module_info;
493 extern lookup_module_info ldap_lookup_module_info;
495 #if defined(LOOKUP_IBASE) && LOOKUP_IBASE!=2
496 extern lookup_module_info ibase_lookup_module_info;
498 #if defined(LOOKUP_DSEARCH) && LOOKUP_DSEARCH!=2
499 extern lookup_module_info dsearch_lookup_module_info;
501 #if defined(LOOKUP_DNSDB) && LOOKUP_DNSDB!=2
502 extern lookup_module_info dnsdb_lookup_module_info;
504 #if defined(LOOKUP_DBM) && LOOKUP_DBM!=2
505 extern lookup_module_info dbmdb_lookup_module_info;
507 #if defined(LOOKUP_CDB) && LOOKUP_CDB!=2
508 extern lookup_module_info cdb_lookup_module_info;
511 void init_lookup_list(void)
513 #ifdef LOOKUP_MODULE_DIR
516 int countmodules = 0;
517 int moduleerrors = 0;
519 struct lookupmodulestr *p;
521 if (lookup_list_init_done)
523 lookup_list_init_done = 1;
525 #if defined(LOOKUP_CDB) && LOOKUP_CDB!=2
526 addlookupmodule(NULL, &cdb_lookup_module_info);
529 #if defined(LOOKUP_DBM) && LOOKUP_DBM!=2
530 addlookupmodule(NULL, &dbmdb_lookup_module_info);
533 #if defined(LOOKUP_DNSDB) && LOOKUP_DNSDB!=2
534 addlookupmodule(NULL, &dnsdb_lookup_module_info);
537 #if defined(LOOKUP_DSEARCH) && LOOKUP_DSEARCH!=2
538 addlookupmodule(NULL, &dsearch_lookup_module_info);
541 #if defined(LOOKUP_IBASE) && LOOKUP_IBASE!=2
542 addlookupmodule(NULL, &ibase_lookup_module_info);
546 addlookupmodule(NULL, &ldap_lookup_module_info);
549 #if defined(LOOKUP_LSEARCH) && LOOKUP_LSEARCH!=2
550 addlookupmodule(NULL, &lsearch_lookup_module_info);
553 #if defined(LOOKUP_MYSQL) && LOOKUP_MYSQL!=2
554 addlookupmodule(NULL, &mysql_lookup_module_info);
557 #if defined(LOOKUP_NIS) && LOOKUP_NIS!=2
558 addlookupmodule(NULL, &nis_lookup_module_info);
561 #if defined(LOOKUP_NISPLUS) && LOOKUP_NISPLUS!=2
562 addlookupmodule(NULL, &nisplus_lookup_module_info);
565 #if defined(LOOKUP_ORACLE) && LOOKUP_ORACLE!=2
566 addlookupmodule(NULL, &oracle_lookup_module_info);
569 #if defined(LOOKUP_PASSWD) && LOOKUP_PASSWD!=2
570 addlookupmodule(NULL, &passwd_lookup_module_info);
573 #if defined(LOOKUP_PGSQL) && LOOKUP_PGSQL!=2
574 addlookupmodule(NULL, &pgsql_lookup_module_info);
577 #if defined(LOOKUP_REDIS) && LOOKUP_REDIS!=2
578 addlookupmodule(NULL, &redis_lookup_module_info);
581 #ifdef EXPERIMENTAL_SPF
582 addlookupmodule(NULL, &spf_lookup_module_info);
585 #if defined(LOOKUP_SQLITE) && LOOKUP_SQLITE!=2
586 addlookupmodule(NULL, &sqlite_lookup_module_info);
589 #if defined(LOOKUP_TESTDB) && LOOKUP_TESTDB!=2
590 addlookupmodule(NULL, &testdb_lookup_module_info);
593 #if defined(LOOKUP_WHOSON) && LOOKUP_WHOSON!=2
594 addlookupmodule(NULL, &whoson_lookup_module_info);
597 #ifdef LOOKUP_MODULE_DIR
598 dd = opendir(LOOKUP_MODULE_DIR);
600 DEBUG(D_lookup) debug_printf("Couldn't open %s: not loading lookup modules\n", LOOKUP_MODULE_DIR);
601 log_write(0, LOG_MAIN, "Couldn't open %s: not loading lookup modules\n", LOOKUP_MODULE_DIR);
604 const pcre *regex_islookupmod = regex_must_compile(
605 US"\\." DYNLIB_FN_EXT "$", FALSE, TRUE);
607 DEBUG(D_lookup) debug_printf("Loading lookup modules from %s\n", LOOKUP_MODULE_DIR);
608 while ((ent = readdir(dd)) != NULL) {
609 char *name = ent->d_name;
610 int len = (int)strlen(name);
611 if (pcre_exec(regex_islookupmod, NULL, name, len, 0, PCRE_EOPT, NULL, 0) >= 0) {
612 int pathnamelen = len + (int)strlen(LOOKUP_MODULE_DIR) + 2;
614 struct lookup_module_info *info;
615 const char *errormsg;
617 /* SRH: am I being paranoid here or what? */
618 if (pathnamelen > big_buffer_size) {
619 fprintf(stderr, "Loading lookup modules: %s/%s: name too long\n", LOOKUP_MODULE_DIR, name);
620 log_write(0, LOG_MAIN|LOG_PANIC, "%s/%s: name too long\n", LOOKUP_MODULE_DIR, name);
624 /* SRH: snprintf here? */
625 sprintf(CS big_buffer, "%s/%s", LOOKUP_MODULE_DIR, name);
627 dl = dlopen(CS big_buffer, RTLD_NOW);// TJ was LAZY
629 fprintf(stderr, "Error loading %s: %s\n", name, dlerror());
631 log_write(0, LOG_MAIN|LOG_PANIC, "Error loading lookup module %s: %s\n", name, dlerror());
635 /* FreeBSD nsdispatch() can trigger dlerror() errors about
636 * _nss_cache_cycle_prevention_function; we need to clear the dlerror()
637 * state before calling dlsym(), so that any error afterwards only
638 * comes from dlsym().
640 errormsg = dlerror();
642 info = (struct lookup_module_info*) dlsym(dl, "_lookup_module_info");
643 if ((errormsg = dlerror()) != NULL) {
644 fprintf(stderr, "%s does not appear to be a lookup module (%s)\n", name, errormsg);
647 log_write(0, LOG_MAIN|LOG_PANIC, "%s does not appear to be a lookup module (%s)\n", name, errormsg);
650 if (info->magic != LOOKUP_MODULE_INFO_MAGIC) {
651 fprintf(stderr, "Lookup module %s is not compatible with this version of Exim\n", name);
654 log_write(0, LOG_MAIN|LOG_PANIC, "Lookup module %s is not compatible with this version of Exim\n", name);
658 addlookupmodule(dl, info);
659 DEBUG(D_lookup) debug_printf("Loaded \"%s\" (%d lookup types)\n", name, info->lookupcount);
663 store_free((void*)regex_islookupmod);
667 DEBUG(D_lookup) debug_printf("Loaded %d lookup modules\n", countmodules);
670 DEBUG(D_lookup) debug_printf("Total %d lookups\n", lookup_list_count);
672 lookup_list = store_malloc(sizeof(lookup_info *) * lookup_list_count);
673 memset(lookup_list, 0, sizeof(lookup_info *) * lookup_list_count);
675 /* now add all lookups to the real list */
679 struct lookupmodulestr *pnext;
681 for (j = 0; j < p->info->lookupcount; j++)
682 add_lookup_to_list(p->info->lookups[j]);
688 /* just to be sure */
689 lookupmodules = NULL;
692 /* End of drtables.c */