Squashed commit of PIPE_CONNECT
[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 int i;
74 const uschar * s;
75 uschar buf[64];
76
77 /* The 'previously-defined-substring' rule for macros in config file
78 lines is done thus for these builtin macros: we know that the table
79 we source from is in strict alpha order, hence the builtins portion
80 of the macros list is in reverse-alpha (we prepend them) - so longer
81 macros that have substrings are always discovered first during
82 expansion. */
83
84 for (i = 0; i < nopt; i++) if (*(s = US opts[i].name) && *s != '*')
85 {
86 if (group)
87 spf(buf, sizeof(buf), CUS"_OPT_%T_%T_%T", section, group, s);
88 else
89 spf(buf, sizeof(buf), CUS"_OPT_%T_%T", section, s);
90 builtin_macro_create(buf);
91 }
92 }
93
94
95 /******************************************************************************/
96
97
98 /* Create compile-time feature macros */
99 static void
100 features(void)
101 {
102 /* Probably we could work out a static initialiser for wherever
103 macros are stored, but this will do for now. Some names are awkward
104 due to conflicts with other common macros. */
105
106 #ifdef SUPPORT_CRYPTEQ
107 builtin_macro_create(US"_HAVE_CRYPTEQ");
108 #endif
109 #if HAVE_ICONV
110 builtin_macro_create(US"_HAVE_ICONV");
111 #endif
112 #if HAVE_IPV6
113 builtin_macro_create(US"_HAVE_IPV6");
114 #endif
115 #ifdef HAVE_SETCLASSRESOURCES
116 builtin_macro_create(US"_HAVE_SETCLASSRESOURCES");
117 #endif
118 #ifdef SUPPORT_PAM
119 builtin_macro_create(US"_HAVE_PAM");
120 #endif
121 #ifdef EXIM_PERL
122 builtin_macro_create(US"_HAVE_PERL");
123 #endif
124 #ifdef EXPAND_DLFUNC
125 builtin_macro_create(US"_HAVE_DLFUNC");
126 #endif
127 #ifdef USE_TCP_WRAPPERS
128 builtin_macro_create(US"_HAVE_TCPWRAPPERS");
129 #endif
130 #ifdef SUPPORT_TLS
131 builtin_macro_create(US"_HAVE_TLS");
132 # ifdef USE_GNUTLS
133 builtin_macro_create(US"_HAVE_GNUTLS");
134 # else
135 builtin_macro_create(US"_HAVE_OPENSSL");
136 # endif
137 #endif
138 #ifdef SUPPORT_TRANSLATE_IP_ADDRESS
139 builtin_macro_create(US"_HAVE_TRANSLATE_IP_ADDRESS");
140 #endif
141 #ifdef SUPPORT_MOVE_FROZEN_MESSAGES
142 builtin_macro_create(US"_HAVE_MOVE_FROZEN_MESSAGES");
143 #endif
144 #ifdef WITH_CONTENT_SCAN
145 builtin_macro_create(US"_HAVE_CONTENT_SCANNING");
146 #endif
147 #ifndef DISABLE_DKIM
148 builtin_macro_create(US"_HAVE_DKIM");
149 #endif
150 #ifndef DISABLE_DNSSEC
151 builtin_macro_create(US"_HAVE_DNSSEC");
152 #endif
153 #ifndef DISABLE_EVENT
154 builtin_macro_create(US"_HAVE_EVENT");
155 #endif
156 #ifdef SUPPORT_I18N
157 builtin_macro_create(US"_HAVE_I18N");
158 #endif
159 #ifndef DISABLE_OCSP
160 builtin_macro_create(US"_HAVE_OCSP");
161 #endif
162 #ifndef DISABLE_PRDR
163 builtin_macro_create(US"_HAVE_PRDR");
164 #endif
165 #ifdef SUPPORT_PROXY
166 builtin_macro_create(US"_HAVE_PROXY");
167 #endif
168 #ifdef SUPPORT_SOCKS
169 builtin_macro_create(US"_HAVE_SOCKS");
170 #endif
171 #ifdef TCP_FASTOPEN
172 builtin_macro_create(US"_HAVE_TCP_FASTOPEN");
173 #endif
174 #ifdef EXPERIMENTAL_LMDB
175 builtin_macro_create(US"_HAVE_LMDB");
176 #endif
177 #ifdef SUPPORT_SPF
178 builtin_macro_create(US"_HAVE_SPF");
179 #endif
180 #ifdef EXPERIMENTAL_SRS
181 builtin_macro_create(US"_HAVE_SRS");
182 #endif
183 #ifdef EXPERIMENTAL_ARC
184 builtin_macro_create(US"_HAVE_ARC");
185 #endif
186 #ifdef EXPERIMENTAL_BRIGHTMAIL
187 builtin_macro_create(US"_HAVE_BRIGHTMAIL");
188 #endif
189 #ifdef SUPPORT_DANE
190 builtin_macro_create(US"_HAVE_DANE");
191 #endif
192 #ifdef EXPERIMENTAL_DCC
193 builtin_macro_create(US"_HAVE_DCC");
194 #endif
195 #ifdef EXPERIMENTAL_DMARC
196 builtin_macro_create(US"_HAVE_DMARC");
197 #endif
198 #ifdef EXPERIMENTAL_DSN_INFO
199 builtin_macro_create(US"_HAVE_DSN_INFO");
200 #endif
201 #ifdef EXPERIMENTAL_REQUIRETLS
202 builtin_macro_create(US"_HAVE_REQTLS");
203 #endif
204 #ifdef EXPERIMENTAL_PIPE_CONNECT
205 builtin_macro_create(US"_HAVE_PIPE_CONNECT");
206 #endif
207
208 #ifdef LOOKUP_LSEARCH
209 builtin_macro_create(US"_HAVE_LOOKUP_LSEARCH");
210 #endif
211 #ifdef LOOKUP_CDB
212 builtin_macro_create(US"_HAVE_LOOKUP_CDB");
213 #endif
214 #ifdef LOOKUP_DBM
215 builtin_macro_create(US"_HAVE_LOOKUP_DBM");
216 #endif
217 #ifdef LOOKUP_DNSDB
218 builtin_macro_create(US"_HAVE_LOOKUP_DNSDB");
219 #endif
220 #ifdef LOOKUP_DSEARCH
221 builtin_macro_create(US"_HAVE_LOOKUP_DSEARCH");
222 #endif
223 #ifdef LOOKUP_IBASE
224 builtin_macro_create(US"_HAVE_LOOKUP_IBASE");
225 #endif
226 #ifdef LOOKUP_LDAP
227 builtin_macro_create(US"_HAVE_LOOKUP_LDAP");
228 #endif
229 #ifdef EXPERIMENTAL_LMDB
230 builtin_macro_create(US"_HAVE_LOOKUP_LMDB");
231 #endif
232 #ifdef LOOKUP_MYSQL
233 builtin_macro_create(US"_HAVE_LOOKUP_MYSQL");
234 #endif
235 #ifdef LOOKUP_NIS
236 builtin_macro_create(US"_HAVE_LOOKUP_NIS");
237 #endif
238 #ifdef LOOKUP_NISPLUS
239 builtin_macro_create(US"_HAVE_LOOKUP_NISPLUS");
240 #endif
241 #ifdef LOOKUP_ORACLE
242 builtin_macro_create(US"_HAVE_LOOKUP_ORACLE");
243 #endif
244 #ifdef LOOKUP_PASSWD
245 builtin_macro_create(US"_HAVE_LOOKUP_PASSWD");
246 #endif
247 #ifdef LOOKUP_PGSQL
248 builtin_macro_create(US"_HAVE_LOOKUP_PGSQL");
249 #endif
250 #ifdef LOOKUP_REDIS
251 builtin_macro_create(US"_HAVE_LOOKUP_REDIS");
252 #endif
253 #ifdef LOOKUP_SQLITE
254 builtin_macro_create(US"_HAVE_LOOKUP_SQLITE");
255 #endif
256 #ifdef LOOKUP_TESTDB
257 builtin_macro_create(US"_HAVE_LOOKUP_TESTDB");
258 #endif
259 #ifdef LOOKUP_WHOSON
260 builtin_macro_create(US"_HAVE_LOOKUP_WHOSON");
261 #endif
262
263 #ifdef TRANSPORT_APPENDFILE
264 # ifdef SUPPORT_MAILDIR
265 builtin_macro_create(US"_HAVE_TRANSPORT_APPEND_MAILDIR");
266 # endif
267 # ifdef SUPPORT_MAILSTORE
268 builtin_macro_create(US"_HAVE_TRANSPORT_APPEND_MAILSTORE");
269 # endif
270 # ifdef SUPPORT_MBX
271 builtin_macro_create(US"_HAVE_TRANSPORT_APPEND_MBX");
272 # endif
273 #endif
274
275 #ifdef WITH_CONTENT_SCAN
276 features_malware();
277 #endif
278
279 features_crypto();
280 }
281
282
283 static void
284 options(void)
285 {
286 options_main();
287 options_routers();
288 options_transports();
289 options_auths();
290 options_logging();
291 #if defined(SUPPORT_TLS) && !defined(USE_GNUTLS)
292 options_tls();
293 #endif
294 }
295
296 static void
297 params(void)
298 {
299 #ifndef DISABLE_DKIM
300 params_dkim();
301 #endif
302 }
303
304
305 int
306 main(void)
307 {
308 printf("#include \"exim.h\"\n");
309 features();
310 options();
311 params();
312
313 printf("macro_item * macros = &p%d;\n", mp_index-1);
314 printf("macro_item * mlast = &p0;\n");
315 exit(0);
316 }