1 /*************************************************
2 * Exim - an Internet mail transport agent *
3 *************************************************/
5 /* Copyright (c) University of Cambridge 1995 - 2016 */
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 EXPERIMENTAL_QUEUEFILE
232 #include "transports/queuefile.h"
235 #ifdef TRANSPORT_SMTP
236 #include "transports/smtp.h"
240 /* Now set up the structures, terminated by an entry with a null name. */
242 router_info routers_available[] = {
246 accept_router_options,
247 &accept_router_options_count,
248 &accept_router_option_defaults,
249 sizeof(accept_router_options_block),
252 NULL, /* no tidyup entry */
256 #ifdef ROUTER_DNSLOOKUP
259 dnslookup_router_options,
260 &dnslookup_router_options_count,
261 &dnslookup_router_option_defaults,
262 sizeof(dnslookup_router_options_block),
263 dnslookup_router_init,
264 dnslookup_router_entry,
265 NULL, /* no tidyup entry */
269 #ifdef ROUTER_IPLITERAL
272 ipliteral_router_options,
273 &ipliteral_router_options_count,
274 &ipliteral_router_option_defaults,
275 sizeof(ipliteral_router_options_block),
276 ipliteral_router_init,
277 ipliteral_router_entry,
278 NULL, /* no tidyup entry */
282 #ifdef ROUTER_IPLOOKUP
285 iplookup_router_options,
286 &iplookup_router_options_count,
287 &iplookup_router_option_defaults,
288 sizeof(iplookup_router_options_block),
289 iplookup_router_init,
290 iplookup_router_entry,
291 NULL, /* no tidyup entry */
295 #ifdef ROUTER_MANUALROUTE
298 manualroute_router_options,
299 &manualroute_router_options_count,
300 &manualroute_router_option_defaults,
301 sizeof(manualroute_router_options_block),
302 manualroute_router_init,
303 manualroute_router_entry,
304 NULL, /* no tidyup entry */
308 #ifdef ROUTER_QUERYPROGRAM
311 queryprogram_router_options,
312 &queryprogram_router_options_count,
313 &queryprogram_router_option_defaults,
314 sizeof(queryprogram_router_options_block),
315 queryprogram_router_init,
316 queryprogram_router_entry,
317 NULL, /* no tidyup entry */
321 #ifdef ROUTER_REDIRECT
324 redirect_router_options,
325 &redirect_router_options_count,
326 &redirect_router_option_defaults,
327 sizeof(redirect_router_options_block),
328 redirect_router_init,
329 redirect_router_entry,
330 NULL, /* no tidyup entry */
334 { US"", NULL, NULL, NULL, 0, NULL, NULL, NULL, 0 }
339 transport_info transports_available[] = {
340 #ifdef TRANSPORT_APPENDFILE
342 US"appendfile", /* driver name */
343 appendfile_transport_options, /* local options table */
344 &appendfile_transport_options_count, /* number of entries */
345 &appendfile_transport_option_defaults, /* private options defaults */
346 sizeof(appendfile_transport_options_block), /* size of private block */
347 appendfile_transport_init, /* init entry point */
348 appendfile_transport_entry, /* main entry point */
349 NULL, /* no tidyup entry */
350 NULL, /* no closedown entry */
351 TRUE, /* local flag */
354 #ifdef TRANSPORT_AUTOREPLY
356 US"autoreply", /* driver name */
357 autoreply_transport_options, /* local options table */
358 &autoreply_transport_options_count, /* number of entries */
359 &autoreply_transport_option_defaults, /* private options defaults */
360 sizeof(autoreply_transport_options_block), /* size of private block */
361 autoreply_transport_init, /* init entry point */
362 autoreply_transport_entry, /* main entry point */
363 NULL, /* no tidyup entry */
364 NULL, /* no closedown entry */
365 TRUE /* local flag */
368 #ifdef TRANSPORT_LMTP
370 US"lmtp", /* driver name */
371 lmtp_transport_options, /* local options table */
372 &lmtp_transport_options_count, /* number of entries */
373 &lmtp_transport_option_defaults, /* private options defaults */
374 sizeof(lmtp_transport_options_block), /* size of private block */
375 lmtp_transport_init, /* init entry point */
376 lmtp_transport_entry, /* main entry point */
377 NULL, /* no tidyup entry */
378 NULL, /* no closedown entry */
379 TRUE /* local flag */
382 #ifdef TRANSPORT_PIPE
384 US"pipe", /* driver name */
385 pipe_transport_options, /* local options table */
386 &pipe_transport_options_count, /* number of entries */
387 &pipe_transport_option_defaults, /* private options defaults */
388 sizeof(pipe_transport_options_block), /* size of private block */
389 pipe_transport_init, /* init entry point */
390 pipe_transport_entry, /* main entry point */
391 NULL, /* no tidyup entry */
392 NULL, /* no closedown entry */
393 TRUE /* local flag */
396 #ifdef EXPERIMENTAL_QUEUEFILE
398 US"queuefile", /* driver name */
399 queuefile_transport_options, /* local options table */
400 &queuefile_transport_options_count, /* number of entries */
401 &queuefile_transport_option_defaults, /* private options defaults */
402 sizeof(queuefile_transport_options_block), /* size of private block */
403 queuefile_transport_init, /* init entry point */
404 queuefile_transport_entry, /* main entry point */
405 NULL, /* no tidyup entry */
406 NULL, /* no closedown entry */
407 TRUE /* local flag */
410 #ifdef TRANSPORT_SMTP
412 US"smtp", /* driver name */
413 smtp_transport_options, /* local options table */
414 &smtp_transport_options_count, /* number of entries */
415 &smtp_transport_option_defaults, /* private options defaults */
416 sizeof(smtp_transport_options_block), /* size of private block */
417 smtp_transport_init, /* init entry point */
418 smtp_transport_entry, /* main entry point */
419 NULL, /* no tidyup entry */
420 smtp_transport_closedown, /* close down passed channel */
421 FALSE /* local flag */
424 { US"", NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, FALSE }
427 struct lookupmodulestr
430 struct lookup_module_info *info;
431 struct lookupmodulestr *next;
434 static struct lookupmodulestr *lookupmodules = NULL;
437 addlookupmodule(void *dl, struct lookup_module_info *info)
439 struct lookupmodulestr *p = store_malloc(sizeof(struct lookupmodulestr));
443 p->next = lookupmodules;
445 lookup_list_count += info->lookupcount;
448 /* only valid after lookup_list and lookup_list_count are assigned */
450 add_lookup_to_list(lookup_info *info)
452 /* need to add the lookup to lookup_list, sorted */
455 /* strategy is to go through the list until we find
456 either an empty spot or a name that is higher.
457 this can't fail because we have enough space. */
459 while (lookup_list[pos] && (Ustrcmp(lookup_list[pos]->name, info->name) <= 0))
462 if (lookup_list[pos])
464 /* need to insert it, so move all the other items up
465 (last slot is still empty, of course) */
467 memmove(&lookup_list[pos+1],
469 sizeof(lookup_info *) * (lookup_list_count-pos-1));
471 lookup_list[pos] = info;
475 /* These need to be at file level for old versions of gcc (2.95.2 reported),
476 * which give parse errors on an extern in function scope. Each entry needs
477 * to also be invoked in init_lookup_list() below */
479 #if defined(LOOKUP_CDB) && LOOKUP_CDB!=2
480 extern lookup_module_info cdb_lookup_module_info;
482 #if defined(LOOKUP_DBM) && LOOKUP_DBM!=2
483 extern lookup_module_info dbmdb_lookup_module_info;
485 #if defined(LOOKUP_DNSDB) && LOOKUP_DNSDB!=2
486 extern lookup_module_info dnsdb_lookup_module_info;
488 #if defined(LOOKUP_DSEARCH) && LOOKUP_DSEARCH!=2
489 extern lookup_module_info dsearch_lookup_module_info;
491 #if defined(LOOKUP_IBASE) && LOOKUP_IBASE!=2
492 extern lookup_module_info ibase_lookup_module_info;
494 #if defined(LOOKUP_LDAP)
495 extern lookup_module_info ldap_lookup_module_info;
497 #if defined(LOOKUP_LSEARCH) && LOOKUP_LSEARCH!=2
498 extern lookup_module_info lsearch_lookup_module_info;
500 #if defined(LOOKUP_MYSQL) && LOOKUP_MYSQL!=2
501 extern lookup_module_info mysql_lookup_module_info;
503 #if defined(LOOKUP_NIS) && LOOKUP_NIS!=2
504 extern lookup_module_info nis_lookup_module_info;
506 #if defined(LOOKUP_NISPLUS) && LOOKUP_NISPLUS!=2
507 extern lookup_module_info nisplus_lookup_module_info;
509 #if defined(LOOKUP_ORACLE) && LOOKUP_ORACLE!=2
510 extern lookup_module_info oracle_lookup_module_info;
512 #if defined(LOOKUP_PASSWD) && LOOKUP_PASSWD!=2
513 extern lookup_module_info passwd_lookup_module_info;
515 #if defined(LOOKUP_PGSQL) && LOOKUP_PGSQL!=2
516 extern lookup_module_info pgsql_lookup_module_info;
518 #if defined(LOOKUP_REDIS) && LOOKUP_REDIS!=2
519 extern lookup_module_info redis_lookup_module_info;
521 #if defined(EXPERIMENTAL_LMDB)
522 extern lookup_module_info lmdb_lookup_module_info;
524 #if defined(EXPERIMENTAL_SPF)
525 extern lookup_module_info spf_lookup_module_info;
527 #if defined(LOOKUP_SQLITE) && LOOKUP_SQLITE!=2
528 extern lookup_module_info sqlite_lookup_module_info;
530 #if defined(LOOKUP_TESTDB) && LOOKUP_TESTDB!=2
531 extern lookup_module_info testdb_lookup_module_info;
533 #if defined(LOOKUP_WHOSON) && LOOKUP_WHOSON!=2
534 extern lookup_module_info whoson_lookup_module_info;
539 init_lookup_list(void)
541 #ifdef LOOKUP_MODULE_DIR
544 int countmodules = 0;
545 int moduleerrors = 0;
547 struct lookupmodulestr *p;
549 if (lookup_list_init_done)
551 lookup_list_init_done = 1;
553 #if defined(LOOKUP_CDB) && LOOKUP_CDB!=2
554 addlookupmodule(NULL, &cdb_lookup_module_info);
557 #if defined(LOOKUP_DBM) && LOOKUP_DBM!=2
558 addlookupmodule(NULL, &dbmdb_lookup_module_info);
561 #if defined(LOOKUP_DNSDB) && LOOKUP_DNSDB!=2
562 addlookupmodule(NULL, &dnsdb_lookup_module_info);
565 #if defined(LOOKUP_DSEARCH) && LOOKUP_DSEARCH!=2
566 addlookupmodule(NULL, &dsearch_lookup_module_info);
569 #if defined(LOOKUP_IBASE) && LOOKUP_IBASE!=2
570 addlookupmodule(NULL, &ibase_lookup_module_info);
574 addlookupmodule(NULL, &ldap_lookup_module_info);
577 #if defined(LOOKUP_LSEARCH) && LOOKUP_LSEARCH!=2
578 addlookupmodule(NULL, &lsearch_lookup_module_info);
581 #if defined(LOOKUP_MYSQL) && LOOKUP_MYSQL!=2
582 addlookupmodule(NULL, &mysql_lookup_module_info);
585 #if defined(LOOKUP_NIS) && LOOKUP_NIS!=2
586 addlookupmodule(NULL, &nis_lookup_module_info);
589 #if defined(LOOKUP_NISPLUS) && LOOKUP_NISPLUS!=2
590 addlookupmodule(NULL, &nisplus_lookup_module_info);
593 #if defined(LOOKUP_ORACLE) && LOOKUP_ORACLE!=2
594 addlookupmodule(NULL, &oracle_lookup_module_info);
597 #if defined(LOOKUP_PASSWD) && LOOKUP_PASSWD!=2
598 addlookupmodule(NULL, &passwd_lookup_module_info);
601 #if defined(LOOKUP_PGSQL) && LOOKUP_PGSQL!=2
602 addlookupmodule(NULL, &pgsql_lookup_module_info);
605 #if defined(LOOKUP_REDIS) && LOOKUP_REDIS!=2
606 addlookupmodule(NULL, &redis_lookup_module_info);
609 #ifdef EXPERIMENTAL_LMDB
610 addlookupmodule(NULL, &lmdb_lookup_module_info);
613 #ifdef EXPERIMENTAL_SPF
614 addlookupmodule(NULL, &spf_lookup_module_info);
617 #if defined(LOOKUP_SQLITE) && LOOKUP_SQLITE!=2
618 addlookupmodule(NULL, &sqlite_lookup_module_info);
621 #if defined(LOOKUP_TESTDB) && LOOKUP_TESTDB!=2
622 addlookupmodule(NULL, &testdb_lookup_module_info);
625 #if defined(LOOKUP_WHOSON) && LOOKUP_WHOSON!=2
626 addlookupmodule(NULL, &whoson_lookup_module_info);
629 #ifdef LOOKUP_MODULE_DIR
630 dd = opendir(LOOKUP_MODULE_DIR);
632 DEBUG(D_lookup) debug_printf("Couldn't open %s: not loading lookup modules\n", LOOKUP_MODULE_DIR);
633 log_write(0, LOG_MAIN, "Couldn't open %s: not loading lookup modules\n", LOOKUP_MODULE_DIR);
636 const pcre *regex_islookupmod = regex_must_compile(
637 US"\\." DYNLIB_FN_EXT "$", FALSE, TRUE);
639 DEBUG(D_lookup) debug_printf("Loading lookup modules from %s\n", LOOKUP_MODULE_DIR);
640 while ((ent = readdir(dd)) != NULL) {
641 char *name = ent->d_name;
642 int len = (int)strlen(name);
643 if (pcre_exec(regex_islookupmod, NULL, name, len, 0, PCRE_EOPT, NULL, 0) >= 0) {
644 int pathnamelen = len + (int)strlen(LOOKUP_MODULE_DIR) + 2;
646 struct lookup_module_info *info;
647 const char *errormsg;
649 /* SRH: am I being paranoid here or what? */
650 if (pathnamelen > big_buffer_size) {
651 fprintf(stderr, "Loading lookup modules: %s/%s: name too long\n", LOOKUP_MODULE_DIR, name);
652 log_write(0, LOG_MAIN|LOG_PANIC, "%s/%s: name too long\n", LOOKUP_MODULE_DIR, name);
656 /* SRH: snprintf here? */
657 sprintf(CS big_buffer, "%s/%s", LOOKUP_MODULE_DIR, name);
659 dl = dlopen(CS big_buffer, RTLD_NOW);// TJ was LAZY
661 fprintf(stderr, "Error loading %s: %s\n", name, dlerror());
663 log_write(0, LOG_MAIN|LOG_PANIC, "Error loading lookup module %s: %s\n", name, dlerror());
667 /* FreeBSD nsdispatch() can trigger dlerror() errors about
668 * _nss_cache_cycle_prevention_function; we need to clear the dlerror()
669 * state before calling dlsym(), so that any error afterwards only
670 * comes from dlsym().
672 errormsg = dlerror();
674 info = (struct lookup_module_info*) dlsym(dl, "_lookup_module_info");
675 if ((errormsg = dlerror()) != NULL) {
676 fprintf(stderr, "%s does not appear to be a lookup module (%s)\n", name, errormsg);
679 log_write(0, LOG_MAIN|LOG_PANIC, "%s does not appear to be a lookup module (%s)\n", name, errormsg);
682 if (info->magic != LOOKUP_MODULE_INFO_MAGIC) {
683 fprintf(stderr, "Lookup module %s is not compatible with this version of Exim\n", name);
686 log_write(0, LOG_MAIN|LOG_PANIC, "Lookup module %s is not compatible with this version of Exim\n", name);
690 addlookupmodule(dl, info);
691 DEBUG(D_lookup) debug_printf("Loaded \"%s\" (%d lookup types)\n", name, info->lookupcount);
695 store_free((void*)regex_islookupmod);
699 DEBUG(D_lookup) debug_printf("Loaded %d lookup modules\n", countmodules);
702 DEBUG(D_lookup) debug_printf("Total %d lookups\n", lookup_list_count);
704 lookup_list = store_malloc(sizeof(lookup_info *) * lookup_list_count);
705 memset(lookup_list, 0, sizeof(lookup_info *) * lookup_list_count);
707 /* now add all lookups to the real list */
711 struct lookupmodulestr *pnext;
713 for (j = 0; j < p->info->lookupcount; j++)
714 add_lookup_to_list(p->info->lookups[j]);
720 /* just to be sure */
721 lookupmodules = NULL;
724 /* End of drtables.c */