/************************************************* * Exim - an Internet mail transport agent * *************************************************/ /* Copyright (c) Jeremy Harris 2017 */ /* See the file NOTICE for conditions of use and distribution. */ /* Create a static data structure with the predefined macros, to be included in the main Exim build */ #include "exim.h" #include "macro_predef.h" unsigned mp_index = 0; /* Global dummy variables */ void fn_smtp_receive_timeout(const uschar * name, const uschar * str) {} uschar * syslog_facility_str; /******************************************************************************/ void builtin_macro_create_var(const uschar * name, const uschar * val) { printf ("static macro_item p%d = { ", mp_index); if (mp_index == 0) printf(".next=NULL,"); else printf(".next=&p%d,", mp_index-1); printf(" .command_line=FALSE, .namelen=%d, .replen=%d," " .name=US\"%s\", .replacement=US\"%s\" };\n", Ustrlen(name), Ustrlen(val), CS name, CS val); mp_index++; } void builtin_macro_create(const uschar * name) { builtin_macro_create_var(name, US"y"); } void spf(uschar * buf, int len, const uschar * fmt, ...) { va_list ap; va_start(ap, fmt); while (*fmt && len > 1) if (*fmt == '%' && fmt[1] == 'T') { uschar * s = va_arg(ap, uschar *); while (*s && len-- > 1) *buf++ = toupper(*s++); fmt += 2; } else { *buf++ = *fmt++; len--; } *buf = '\0'; va_end(ap); } void options_from_list(optionlist * opts, unsigned nopt, const uschar * section, uschar * group) { int i; const uschar * s; uschar buf[64]; /* The 'previously-defined-substring' rule for macros in config file lines is done thus for these builtin macros: we know that the table we source from is in strict alpha order, hence the builtins portion of the macros list is in reverse-alpha (we prepend them) - so longer macros that have substrings are always discovered first during expansion. */ for (i = 0; i < nopt; i++) if (*(s = US opts[i].name) && *s != '*') { if (group) spf(buf, sizeof(buf), CUS"_OPT_%T_%T_%T", section, group, s); else spf(buf, sizeof(buf), CUS"_OPT_%T_%T", section, s); builtin_macro_create(buf); } } /******************************************************************************/ /* Create compile-time feature macros */ static void features(void) { /* Probably we could work out a static initialiser for wherever macros are stored, but this will do for now. Some names are awkward due to conflicts with other common macros. */ #ifdef SUPPORT_CRYPTEQ builtin_macro_create(US"_HAVE_CRYPTEQ"); #endif #if HAVE_ICONV builtin_macro_create(US"_HAVE_ICONV"); #endif #if HAVE_IPV6 builtin_macro_create(US"_HAVE_IPV6"); #endif #ifdef HAVE_SETCLASSRESOURCES builtin_macro_create(US"_HAVE_SETCLASSRESOURCES"); #endif #ifdef SUPPORT_PAM builtin_macro_create(US"_HAVE_PAM"); #endif #ifdef EXIM_PERL builtin_macro_create(US"_HAVE_PERL"); #endif #ifdef EXPAND_DLFUNC builtin_macro_create(US"_HAVE_DLFUNC"); #endif #ifdef USE_TCP_WRAPPERS builtin_macro_create(US"_HAVE_TCPWRAPPERS"); #endif #ifdef SUPPORT_TLS builtin_macro_create(US"_HAVE_TLS"); # ifdef USE_GNUTLS builtin_macro_create(US"_HAVE_GNUTLS"); # else builtin_macro_create(US"_HAVE_OPENSSL"); # endif #endif #ifdef SUPPORT_TRANSLATE_IP_ADDRESS builtin_macro_create(US"_HAVE_TRANSLATE_IP_ADDRESS"); #endif #ifdef SUPPORT_MOVE_FROZEN_MESSAGES builtin_macro_create(US"_HAVE_MOVE_FROZEN_MESSAGES"); #endif #ifdef WITH_CONTENT_SCAN builtin_macro_create(US"_HAVE_CONTENT_SCANNING"); #endif #ifndef DISABLE_DKIM builtin_macro_create(US"_HAVE_DKIM"); #endif #ifndef DISABLE_DNSSEC builtin_macro_create(US"_HAVE_DNSSEC"); #endif #ifndef DISABLE_EVENT builtin_macro_create(US"_HAVE_EVENT"); #endif #ifdef SUPPORT_I18N builtin_macro_create(US"_HAVE_I18N"); #endif #ifndef DISABLE_OCSP builtin_macro_create(US"_HAVE_OCSP"); #endif #ifndef DISABLE_PRDR builtin_macro_create(US"_HAVE_PRDR"); #endif #ifdef SUPPORT_PROXY builtin_macro_create(US"_HAVE_PROXY"); #endif #ifdef SUPPORT_SOCKS builtin_macro_create(US"_HAVE_SOCKS"); #endif #ifdef TCP_FASTOPEN builtin_macro_create(US"_HAVE_TCP_FASTOPEN"); #endif #ifdef EXPERIMENTAL_LMDB builtin_macro_create(US"_HAVE_LMDB"); #endif #ifdef EXPERIMENTAL_SPF builtin_macro_create(US"_HAVE_SPF"); #endif #ifdef EXPERIMENTAL_SRS builtin_macro_create(US"_HAVE_SRS"); #endif #ifdef EXPERIMENTAL_BRIGHTMAIL builtin_macro_create(US"_HAVE_BRIGHTMAIL"); #endif #ifdef EXPERIMENTAL_DANE builtin_macro_create(US"_HAVE_DANE"); #endif #ifdef EXPERIMENTAL_DCC builtin_macro_create(US"_HAVE_DCC"); #endif #ifdef EXPERIMENTAL_DMARC builtin_macro_create(US"_HAVE_DMARC"); #endif #ifdef EXPERIMENTAL_DSN_INFO builtin_macro_create(US"_HAVE_DSN_INFO"); #endif #ifdef LOOKUP_LSEARCH builtin_macro_create(US"_HAVE_LOOKUP_LSEARCH"); #endif #ifdef LOOKUP_CDB builtin_macro_create(US"_HAVE_LOOKUP_CDB"); #endif #ifdef LOOKUP_DBM builtin_macro_create(US"_HAVE_LOOKUP_DBM"); #endif #ifdef LOOKUP_DNSDB builtin_macro_create(US"_HAVE_LOOKUP_DNSDB"); #endif #ifdef LOOKUP_DSEARCH builtin_macro_create(US"_HAVE_LOOKUP_DSEARCH"); #endif #ifdef LOOKUP_IBASE builtin_macro_create(US"_HAVE_LOOKUP_IBASE"); #endif #ifdef LOOKUP_LDAP builtin_macro_create(US"_HAVE_LOOKUP_LDAP"); #endif #ifdef EXPERIMENTAL_LMDB builtin_macro_create(US"_HAVE_LOOKUP_LMDB"); #endif #ifdef LOOKUP_MYSQL builtin_macro_create(US"_HAVE_LOOKUP_MYSQL"); #endif #ifdef LOOKUP_NIS builtin_macro_create(US"_HAVE_LOOKUP_NIS"); #endif #ifdef LOOKUP_NISPLUS builtin_macro_create(US"_HAVE_LOOKUP_NISPLUS"); #endif #ifdef LOOKUP_ORACLE builtin_macro_create(US"_HAVE_LOOKUP_ORACLE"); #endif #ifdef LOOKUP_PASSWD builtin_macro_create(US"_HAVE_LOOKUP_PASSWD"); #endif #ifdef LOOKUP_PGSQL builtin_macro_create(US"_HAVE_LOOKUP_PGSQL"); #endif #ifdef LOOKUP_REDIS builtin_macro_create(US"_HAVE_LOOKUP_REDIS"); #endif #ifdef LOOKUP_SQLITE builtin_macro_create(US"_HAVE_LOOKUP_SQLITE"); #endif #ifdef LOOKUP_TESTDB builtin_macro_create(US"_HAVE_LOOKUP_TESTDB"); #endif #ifdef LOOKUP_WHOSON builtin_macro_create(US"_HAVE_LOOKUP_WHOSON"); #endif #ifdef TRANSPORT_APPENDFILE # ifdef SUPPORT_MAILDIR builtin_macro_create(US"_HAVE_TRANSPORT_APPEND_MAILDIR"); # endif # ifdef SUPPORT_MAILSTORE builtin_macro_create(US"_HAVE_TRANSPORT_APPEND_MAILSTORE"); # endif # ifdef SUPPORT_MBX builtin_macro_create(US"_HAVE_TRANSPORT_APPEND_MBX"); # endif #endif } static void options(void) { options_main(); options_routers(); options_transports(); options_auths(); } static void params(void) { #ifndef DISABLE_DKIM dkim_params(); #endif } int main(void) { printf("#include \"exim.h\"\n"); features(); options(); params(); printf("macro_item * macros = &p%d;\n", mp_index-1); printf("macro_item * mlast = &p0;\n"); exit(0); }