e20ae89fe305c9de4c75f365114a657a65f7a51b
[users/jgh/exim.git] / src / src / macro_predef.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) Jeremy Harris 1995 - 2018 */
6 /* See the file NOTICE for conditions of use and distribution. */
7
8 /* Create a static data structure with the predefined macros, to be
9 included in the main Exim build */
10
11 #include "exim.h"
12 #include "macro_predef.h"
13
14 unsigned mp_index = 0;
15
16 /* Global dummy variables */
17
18 void fn_smtp_receive_timeout(const uschar * name, const uschar * str) {}
19 uschar * syslog_facility_str;
20
21 /******************************************************************************/
22
23 void
24 builtin_macro_create_var(const uschar * name, const uschar * val)
25 {
26 printf ("static macro_item p%d = { ", mp_index);
27 if (mp_index == 0)
28   printf(".next=NULL,");
29 else
30   printf(".next=&p%d,", mp_index-1);
31
32 printf(" .command_line=FALSE, .namelen=%d, .replen=%d,"
33         " .name=US\"%s\", .replacement=US\"%s\" };\n",
34         Ustrlen(name), Ustrlen(val), CS name, CS val);
35 mp_index++;
36 }
37
38
39 void
40 builtin_macro_create(const uschar * name)
41 {
42 builtin_macro_create_var(name, US"y");
43 }
44
45
46 /* restricted snprintf */
47 void
48 spf(uschar * buf, int len, const uschar * fmt, ...)
49 {
50 va_list ap;
51 va_start(ap, fmt);
52
53 while (*fmt && len > 1)
54   if (*fmt == '%' && fmt[1] == 'T')
55     {
56     uschar * s = va_arg(ap, uschar *);
57     while (*s && len-- > 1)
58       *buf++ = toupper(*s++);
59     fmt += 2;
60     }
61   else
62     {
63     *buf++ = *fmt++; len--;
64     }
65 *buf = '\0';
66 va_end(ap);
67 }
68
69 void
70 options_from_list(optionlist * opts, unsigned nopt,
71   const uschar * section, uschar * group)
72 {
73 const uschar * s;
74 uschar buf[64];
75
76 /* The 'previously-defined-substring' rule for macros in config file
77 lines is done thus for these builtin macros: we know that the table
78 we source from is in strict alpha order, hence the builtins portion
79 of the macros list is in reverse-alpha (we prepend them) - so longer
80 macros that have substrings are always discovered first during
81 expansion. */
82
83 for (int i = 0; i < nopt; i++)  if (*(s = US opts[i].name) && *s != '*')
84   {
85   if (group)
86     spf(buf, sizeof(buf), CUS"_OPT_%T_%T_%T", section, group, s);
87   else
88     spf(buf, sizeof(buf), CUS"_OPT_%T_%T", section, s);
89   builtin_macro_create(buf);
90   }
91 }
92
93
94 /******************************************************************************/
95
96
97 /* Create compile-time feature macros */
98 static void
99 features(void)
100 {
101 /* Probably we could work out a static initialiser for wherever
102 macros are stored, but this will do for now. Some names are awkward
103 due to conflicts with other common macros. */
104
105 #ifdef SUPPORT_CRYPTEQ
106   builtin_macro_create(US"_HAVE_CRYPTEQ");
107 #endif
108 #if HAVE_ICONV
109   builtin_macro_create(US"_HAVE_ICONV");
110 #endif
111 #if HAVE_IPV6
112   builtin_macro_create(US"_HAVE_IPV6");
113 #endif
114 #ifdef HAVE_SETCLASSRESOURCES
115   builtin_macro_create(US"_HAVE_SETCLASSRESOURCES");
116 #endif
117 #ifdef SUPPORT_PAM
118   builtin_macro_create(US"_HAVE_PAM");
119 #endif
120 #ifdef EXIM_PERL
121   builtin_macro_create(US"_HAVE_PERL");
122 #endif
123 #ifdef EXPAND_DLFUNC
124   builtin_macro_create(US"_HAVE_DLFUNC");
125 #endif
126 #ifdef USE_TCP_WRAPPERS
127   builtin_macro_create(US"_HAVE_TCPWRAPPERS");
128 #endif
129 #ifndef DISABLE_TLS
130   builtin_macro_create(US"_HAVE_TLS");
131 # ifdef USE_GNUTLS
132   builtin_macro_create(US"_HAVE_GNUTLS");
133 # else
134   builtin_macro_create(US"_HAVE_OPENSSL");
135 # endif
136 #endif
137 #ifdef SUPPORT_TRANSLATE_IP_ADDRESS
138   builtin_macro_create(US"_HAVE_TRANSLATE_IP_ADDRESS");
139 #endif
140 #ifdef SUPPORT_MOVE_FROZEN_MESSAGES
141   builtin_macro_create(US"_HAVE_MOVE_FROZEN_MESSAGES");
142 #endif
143 #ifdef WITH_CONTENT_SCAN
144   builtin_macro_create(US"_HAVE_CONTENT_SCANNING");
145 #endif
146 #ifndef DISABLE_DKIM
147   builtin_macro_create(US"_HAVE_DKIM");
148 #endif
149 #ifdef SUPPORT_DMARC
150   builtin_macro_create(US"_HAVE_DMARC");
151 #endif
152 #ifndef DISABLE_DNSSEC
153   builtin_macro_create(US"_HAVE_DNSSEC");
154 #endif
155 #ifndef DISABLE_EVENT
156   builtin_macro_create(US"_HAVE_EVENT");
157 #endif
158 #ifdef SUPPORT_I18N
159   builtin_macro_create(US"_HAVE_I18N");
160 #endif
161 #ifndef DISABLE_OCSP
162   builtin_macro_create(US"_HAVE_OCSP");
163 #endif
164 #ifdef SUPPORT_PIPE_CONNECT
165   builtin_macro_create(US"_HAVE_PIPE_CONNECT");
166 #endif
167 #ifndef DISABLE_PRDR
168   builtin_macro_create(US"_HAVE_PRDR");
169 #endif
170 #ifdef SUPPORT_PROXY
171   builtin_macro_create(US"_HAVE_PROXY");
172 #endif
173 #ifdef SUPPORT_SOCKS
174   builtin_macro_create(US"_HAVE_SOCKS");
175 #endif
176 #ifdef TCP_FASTOPEN
177   builtin_macro_create(US"_HAVE_TCP_FASTOPEN");
178 #endif
179 #ifdef EXPERIMENTAL_LMDB
180   builtin_macro_create(US"_HAVE_LMDB");
181 #endif
182 #ifdef SUPPORT_SPF
183   builtin_macro_create(US"_HAVE_SPF");
184 #endif
185 #if defined(EXPERIMENTAL_SRS) || defined(EXPERIMENTAL_SRS_NATIVE)
186   builtin_macro_create(US"_HAVE_SRS");
187 #endif
188 #if defined(EXPERIMENTAL_SRS_NATIVE)
189   builtin_macro_create(US"_HAVE_NATIVE_SRS");   /* beware clash with _HAVE_SRS */
190 #endif
191 #ifdef EXPERIMENTAL_ARC
192   builtin_macro_create(US"_HAVE_ARC");
193 #endif
194 #ifdef EXPERIMENTAL_BRIGHTMAIL
195   builtin_macro_create(US"_HAVE_BRIGHTMAIL");
196 #endif
197 #ifdef SUPPORT_DANE
198   builtin_macro_create(US"_HAVE_DANE");
199 #endif
200 #ifdef EXPERIMENTAL_DCC
201   builtin_macro_create(US"_HAVE_DCC");
202 #endif
203 #ifdef EXPERIMENTAL_DSN_INFO
204   builtin_macro_create(US"_HAVE_DSN_INFO");
205 #endif
206 #ifdef EXPERIMENTAL_TLS_RESUME
207   builtin_macro_create(US"_HAVE_TLS_RESUME");
208 #endif
209
210 #ifdef LOOKUP_LSEARCH
211   builtin_macro_create(US"_HAVE_LOOKUP_LSEARCH");
212 #endif
213 #ifdef LOOKUP_CDB
214   builtin_macro_create(US"_HAVE_LOOKUP_CDB");
215 #endif
216 #ifdef LOOKUP_DBM
217   builtin_macro_create(US"_HAVE_LOOKUP_DBM");
218 #endif
219 #ifdef LOOKUP_DNSDB
220   builtin_macro_create(US"_HAVE_LOOKUP_DNSDB");
221 #endif
222 #ifdef LOOKUP_DSEARCH
223   builtin_macro_create(US"_HAVE_LOOKUP_DSEARCH");
224 #endif
225 #ifdef LOOKUP_IBASE
226   builtin_macro_create(US"_HAVE_LOOKUP_IBASE");
227 #endif
228 #ifdef LOOKUP_LDAP
229   builtin_macro_create(US"_HAVE_LOOKUP_JSON");
230 #endif
231 #ifdef LOOKUP_LDAP
232   builtin_macro_create(US"_HAVE_LOOKUP_LDAP");
233 #endif
234 #ifdef EXPERIMENTAL_LMDB
235   builtin_macro_create(US"_HAVE_LOOKUP_LMDB");
236 #endif
237 #ifdef LOOKUP_MYSQL
238   builtin_macro_create(US"_HAVE_LOOKUP_MYSQL");
239 #endif
240 #ifdef LOOKUP_NIS
241   builtin_macro_create(US"_HAVE_LOOKUP_NIS");
242 #endif
243 #ifdef LOOKUP_NISPLUS
244   builtin_macro_create(US"_HAVE_LOOKUP_NISPLUS");
245 #endif
246 #ifdef LOOKUP_ORACLE
247   builtin_macro_create(US"_HAVE_LOOKUP_ORACLE");
248 #endif
249 #ifdef LOOKUP_PASSWD
250   builtin_macro_create(US"_HAVE_LOOKUP_PASSWD");
251 #endif
252 #ifdef LOOKUP_PGSQL
253   builtin_macro_create(US"_HAVE_LOOKUP_PGSQL");
254 #endif
255 #ifdef LOOKUP_REDIS
256   builtin_macro_create(US"_HAVE_LOOKUP_REDIS");
257 #endif
258 #ifdef LOOKUP_SQLITE
259   builtin_macro_create(US"_HAVE_LOOKUP_SQLITE");
260 #endif
261 #ifdef LOOKUP_TESTDB
262   builtin_macro_create(US"_HAVE_LOOKUP_TESTDB");
263 #endif
264 #ifdef LOOKUP_WHOSON
265   builtin_macro_create(US"_HAVE_LOOKUP_WHOSON");
266 #endif
267
268 #ifdef TRANSPORT_APPENDFILE
269 # ifdef SUPPORT_MAILDIR
270   builtin_macro_create(US"_HAVE_TRANSPORT_APPEND_MAILDIR");
271 # endif
272 # ifdef SUPPORT_MAILSTORE
273   builtin_macro_create(US"_HAVE_TRANSPORT_APPEND_MAILSTORE");
274 # endif
275 # ifdef SUPPORT_MBX
276   builtin_macro_create(US"_HAVE_TRANSPORT_APPEND_MBX");
277 # endif
278 #endif
279
280 #ifdef WITH_CONTENT_SCAN
281 features_malware();
282 #endif
283
284 features_crypto();
285 }
286
287
288 static void
289 options(void)
290 {
291 options_main();
292 options_routers();
293 options_transports();
294 options_auths();
295 options_logging();
296 #ifndef DISABLE_TLS
297 options_tls();
298 #endif
299 }
300
301 static void
302 params(void)
303 {
304 #ifndef DISABLE_DKIM
305 params_dkim();
306 #endif
307 }
308
309
310 int
311 main(void)
312 {
313 printf("#include \"exim.h\"\n");
314 features();
315 options();
316 params();
317
318 printf("macro_item * macros = &p%d;\n", mp_index-1);
319 printf("macro_item * mlast = &p0;\n");
320 exit(0);
321 }