Commit | Line | Data |
---|---|---|
059ec3d9 PH |
1 | /************************************************* |
2 | * Exim - an Internet mail transport agent * | |
3 | *************************************************/ | |
4 | ||
f9ba5e22 | 5 | /* Copyright (c) University of Cambridge 1995 - 2018 */ |
059ec3d9 PH |
6 | /* See the file NOTICE for conditions of use and distribution. */ |
7 | ||
8 | ||
9 | /* Source files for exim all #include this header, which drags in everything | |
10 | that is needed. They don't all need everything, of course, but it's far too | |
11 | messy to have each one importing its own list, and anyway, most of them need | |
12 | most of these includes. */ | |
13 | ||
cb224393 JH |
14 | #ifndef EXIM_H |
15 | #define EXIM_H | |
16 | ||
059ec3d9 PH |
17 | /* Assume most systems have statfs() unless os.h undefines this macro */ |
18 | ||
19 | #define HAVE_STATFS | |
20 | ||
0eb8eedd NM |
21 | /* Similarly, assume most systems have srandom() unless os.h undefines it. |
22 | This call dates back at least as far as SUSv2. */ | |
23 | ||
24 | #define HAVE_SRANDOM | |
25 | ||
b87a6e0e | 26 | /* This is primarily for the Gnu C library; we define it before os.h so that |
57eb9e91 PP |
27 | os.h has a chance to hurriedly undef it, Just In Case. We need C99 for some |
28 | 64-bit math support, and defining _ISOC99_SOURCE breaks <resolv.h> and friends. | |
29 | */ | |
b87a6e0e | 30 | |
57eb9e91 | 31 | #define _GNU_SOURCE 1 |
b87a6e0e | 32 | |
059ec3d9 PH |
33 | /* First of all include the os-specific header, which might set things that |
34 | are needed by any of the other headers, including system headers. */ | |
35 | ||
36 | #include "os.h" | |
37 | ||
38 | /* If it didn't define os_find_running_interfaces, use the common function. */ | |
39 | ||
40 | #ifndef os_find_running_interfaces | |
c007c974 | 41 | # define os_find_running_interfaces os_common_find_running_interfaces |
059ec3d9 PH |
42 | #endif |
43 | ||
44 | /* If it didn't define the base for "base 62" numbers, we really do use 62. | |
45 | This is the case for all real Unix and Unix-like OS. It's only Cygwin and | |
46 | Darwin, with their case-insensitive file systems, that can't use base 62 for | |
47 | making unique names. */ | |
48 | ||
49 | #ifndef BASE_62 | |
c007c974 | 50 | # define BASE_62 62 |
059ec3d9 PH |
51 | #endif |
52 | ||
53 | /* The maximum value of localhost_number depends on the base being used */ | |
54 | ||
55 | #if BASE_62 == 62 | |
c007c974 | 56 | # define LOCALHOST_MAX 16 |
059ec3d9 | 57 | #else |
c007c974 | 58 | # define LOCALHOST_MAX 10 |
059ec3d9 PH |
59 | #endif |
60 | ||
4789da3a | 61 | /* If not overridden by os.h, dynamic libraries have filenames ending .so */ |
e12f8c32 PP |
62 | #ifndef DYNLIB_FN_EXT |
63 | # define DYNLIB_FN_EXT "so" | |
64 | #endif | |
65 | ||
059ec3d9 PH |
66 | /* ANSI C standard includes */ |
67 | ||
68 | #include <ctype.h> | |
69 | #include <locale.h> | |
870f6ba8 | 70 | #include <math.h> |
059ec3d9 PH |
71 | #include <signal.h> |
72 | #include <stdarg.h> | |
73 | #include <stddef.h> | |
74 | #include <stdio.h> | |
75 | #include <stdlib.h> | |
76 | #include <string.h> | |
77 | #include <time.h> | |
78 | ||
79 | /* Unix includes */ | |
80 | ||
81 | #include <errno.h> | |
1a46a8c5 | 82 | #if defined(__svr4__) && defined(__sparc) && ! defined(__EXTENSIONS__) |
c007c974 JH |
83 | # define __EXTENSIONS__ /* so that SunOS 5 gets NGROUPS_MAX */ |
84 | # include <limits.h> | |
85 | # undef __EXTENSIONS__ | |
059ec3d9 | 86 | #else |
c007c974 | 87 | # include <limits.h> |
059ec3d9 PH |
88 | #endif |
89 | ||
17c76198 PP |
90 | /* C99 integer types, figure out how to undo this if needed for older systems */ |
91 | ||
92 | #include <inttypes.h> | |
93 | ||
059ec3d9 PH |
94 | /* Just in case some aged system doesn't define them... */ |
95 | ||
96 | #ifndef INT_MAX | |
c007c974 | 97 | # define INT_MAX 2147483647 |
059ec3d9 PH |
98 | #endif |
99 | ||
4362ff0d | 100 | #ifndef INT_MIN |
c007c974 | 101 | # define INT_MIN (-INT_MAX - 1) |
4362ff0d PH |
102 | #endif |
103 | ||
104 | #ifndef SHRT_MAX | |
c007c974 | 105 | # define SHRT_MAX 32767 |
4362ff0d PH |
106 | #endif |
107 | ||
059ec3d9 | 108 | #ifndef UCHAR_MAX |
c007c974 | 109 | # define UCHAR_MAX 255 |
059ec3d9 PH |
110 | #endif |
111 | ||
4328fd3c JH |
112 | |
113 | /* To match int_eximarith_t. Define in OS/os.h-<your-system> to override. */ | |
114 | #ifndef EXIM_ARITH_MAX | |
115 | # define EXIM_ARITH_MAX ((int_eximarith_t)9223372036854775807LL) | |
116 | #endif | |
117 | #ifndef EXIM_ARITH_MIN | |
118 | # define EXIM_ARITH_MIN (-EXIM_ARITH_MAX - 1) | |
119 | #endif | |
120 | ||
059ec3d9 PH |
121 | /* Some systems have PATH_MAX and some have MAX_PATH_LEN. */ |
122 | ||
123 | #ifndef PATH_MAX | |
c007c974 JH |
124 | # ifdef MAX_PATH_LEN |
125 | # define PATH_MAX MAX_PATH_LEN | |
126 | # else | |
127 | # define PATH_MAX 1024 | |
128 | # endif | |
059ec3d9 PH |
129 | #endif |
130 | ||
131 | #include <sys/types.h> | |
132 | #include <sys/file.h> | |
133 | #include <dirent.h> | |
134 | #include <netdb.h> | |
f452e07e | 135 | #ifndef NO_POLL_H |
c007c974 | 136 | # include <poll.h> |
f452e07e | 137 | #endif |
059ec3d9 PH |
138 | #include <pwd.h> |
139 | #include <grp.h> | |
140 | #include <syslog.h> | |
141 | ||
142 | /* Not all systems have flock() available. Those that do must define LOCK_SH | |
143 | in sys/file.h. */ | |
144 | ||
145 | #ifndef LOCK_SH | |
c007c974 | 146 | # define NO_FLOCK |
059ec3d9 PH |
147 | #endif |
148 | ||
149 | #ifndef NO_SYSEXITS /* some OS don't have this */ | |
c007c974 | 150 | # include <sysexits.h> |
059ec3d9 PH |
151 | #endif |
152 | ||
36a3b041 PH |
153 | /* A few OS don't have socklen_t; their os.h files define EXIM_SOCKLEN_T to |
154 | be size_t or whatever. We used to use SOCKLEN_T, but then it was discovered | |
155 | that this is used by the AIX include files. */ | |
059ec3d9 | 156 | |
36a3b041 | 157 | #ifndef EXIM_SOCKLEN_T |
c007c974 | 158 | # define EXIM_SOCKLEN_T socklen_t |
059ec3d9 PH |
159 | #endif |
160 | ||
161 | /* Ensure that the sysexits we reference are defined */ | |
162 | ||
163 | #ifndef EX_UNAVAILABLE | |
c007c974 | 164 | # define EX_UNAVAILABLE 69 /* service unavailable; used for execv fail */ |
059ec3d9 PH |
165 | #endif |
166 | #ifndef EX_CANTCREAT | |
c007c974 | 167 | # define EX_CANTCREAT 73 /* can't create file: treat as temporary */ |
059ec3d9 PH |
168 | #endif |
169 | #ifndef EX_TEMPFAIL | |
c007c974 | 170 | # define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */ |
059ec3d9 PH |
171 | #endif |
172 | #ifndef EX_CONFIG | |
c007c974 | 173 | # define EX_CONFIG 78 /* configuration error */ |
059ec3d9 PH |
174 | #endif |
175 | ||
176 | /* This one is not in any sysexits file that I've come across */ | |
177 | ||
178 | #define EX_EXECFAILED 127 /* execve() failed */ | |
179 | ||
180 | ||
181 | #include <sys/time.h> | |
182 | #include <sys/param.h> | |
183 | ||
184 | #ifndef NO_SYS_RESOURCE_H /* QNX doesn't have this */ | |
c007c974 | 185 | # include <sys/resource.h> |
059ec3d9 PH |
186 | #endif |
187 | ||
188 | #include <sys/socket.h> | |
189 | ||
190 | /* If we are on an IPv6 system, the macro AF_INET6 will have been defined in | |
191 | the sys/socket.h header. It is helpful to have this defined on an IPv4 system | |
192 | so that it can appear in the code, even if it is never actually used when | |
193 | the code is run. It saves some #ifdef occurrences. */ | |
194 | ||
195 | #ifndef AF_INET6 | |
c007c974 | 196 | # define AF_INET6 24 |
059ec3d9 PH |
197 | #endif |
198 | ||
199 | #include <sys/ioctl.h> | |
200 | ||
201 | /* The new standard is statvfs; some OS have statfs. For statvfs the block | |
202 | counts must be multiplied by the "fragment size" f_frsize to get the actual | |
203 | size. In other cases the value seems to be f_bsize (which is sometimes the only | |
204 | block size), so we use a macro to get that instead. | |
205 | ||
206 | Also arrange to be able to cut it out altogether for way-out OS that don't have | |
207 | anything. I've indented a bit here to try to make the mess a bit more | |
208 | intelligible. Note that simply defining one name to be another when | |
209 | HAVE_SYS_STATVFS_H is not set will not work if the system has a statvfs macro | |
210 | or a macro with entries f_frsize and f_bsize. */ | |
211 | ||
212 | #ifdef HAVE_STATFS | |
213 | #ifdef HAVE_SYS_STATVFS_H | |
214 | #include <sys/statvfs.h> | |
215 | #define STATVFS statvfs | |
216 | #define F_FRSIZE f_frsize | |
217 | #else | |
218 | #define STATVFS statfs | |
219 | #define F_FRSIZE f_bsize | |
220 | #ifdef HAVE_SYS_VFS_H | |
221 | #include <sys/vfs.h> | |
222 | #ifdef HAVE_SYS_STATFS_H | |
223 | #include <sys/statfs.h> | |
224 | #endif | |
225 | #endif | |
226 | #ifdef HAVE_SYS_MOUNT_H | |
227 | #include <sys/mount.h> | |
228 | #endif | |
229 | #endif | |
230 | ||
231 | /* Macros for the fields for the available space for non-superusers; define | |
232 | these only if the OS header has not. Not all OS have f_favail; those that | |
233 | are known to have it define F_FAVAIL as f_favail. The default is to use | |
234 | f_free. */ | |
235 | ||
236 | #ifndef F_BAVAIL | |
c007c974 | 237 | # define F_BAVAIL f_bavail |
059ec3d9 PH |
238 | #endif |
239 | ||
240 | #ifndef F_FAVAIL | |
c007c974 | 241 | # define F_FAVAIL f_ffree |
059ec3d9 PH |
242 | #endif |
243 | ||
244 | /* All the systems I've been able to look at seem to have F_FILES */ | |
245 | ||
246 | #ifndef F_FILES | |
c007c974 | 247 | # define F_FILES f_files |
059ec3d9 PH |
248 | #endif |
249 | ||
250 | #endif | |
251 | ||
252 | ||
1a46a8c5 | 253 | #ifndef SIOCGIFCONF /* HACK for SunOS 5 */ |
c007c974 | 254 | # include <sys/sockio.h> |
059ec3d9 PH |
255 | #endif |
256 | ||
257 | #include <sys/stat.h> | |
258 | #include <sys/wait.h> | |
259 | #include <sys/utsname.h> | |
260 | #include <fcntl.h> | |
261 | ||
262 | /* There's a shambles in IRIX6 - it defines EX_OK in unistd.h which conflicts | |
415c8f3b PH |
263 | with the definition in sysexits.h. Exim does not actually use this macro, so we |
264 | just undefine it. It would be nice to be able to re-instate the definition from | |
265 | sysexits.h if there is no definition in unistd.h, but I do not think there is a | |
266 | way to do this in C because macro definitions are not scanned for other macros | |
267 | at definition time. [The code here used to assume they were, until I was | |
268 | disabused of the notion. Luckily, since EX_OK is not used, it didn't matter.] */ | |
059ec3d9 PH |
269 | |
270 | #ifdef EX_OK | |
c007c974 | 271 | # undef EX_OK |
059ec3d9 PH |
272 | #endif |
273 | ||
274 | #include <unistd.h> | |
275 | ||
059ec3d9 PH |
276 | #include <utime.h> |
277 | #ifndef NO_NET_IF_H | |
c007c974 | 278 | # include <net/if.h> |
059ec3d9 PH |
279 | #endif |
280 | #include <sys/un.h> | |
281 | #include <netinet/in.h> | |
282 | #include <netinet/tcp.h> | |
283 | #include <arpa/inet.h> | |
284 | #include <arpa/nameser.h> | |
285 | ||
286 | ||
287 | /* If arpa/nameser.h defines a maximum name server packet size, use it, | |
288 | provided it is greater than 2048. Otherwise go for a default. PACKETSZ was used | |
289 | for this, but it seems that NS_PACKETSZ is coming into use. */ | |
290 | ||
291 | #if defined(NS_PACKETSZ) && NS_PACKETSZ >= 2048 | |
292 | #define MAXPACKET NS_PACKETSZ | |
293 | #elif defined(PACKETSZ) && PACKETSZ >= 2048 | |
294 | #define MAXPACKET PACKETSZ | |
295 | #else | |
296 | #define MAXPACKET 2048 | |
297 | #endif | |
298 | ||
299 | /* While IPv6 is still young the definitions of T_AAAA and T_A6 may not be | |
300 | included in arpa/nameser.h. Fudge them here. */ | |
301 | ||
302 | #ifndef T_AAAA | |
303 | #define T_AAAA 28 | |
304 | #endif | |
305 | ||
306 | #ifndef T_A6 | |
307 | #define T_A6 38 | |
308 | #endif | |
309 | ||
310 | /* Ancient systems (e.g. SunOS4) don't appear to have T_TXT defined in their | |
311 | header files. I don't suppose they have T_SRV either. */ | |
312 | ||
313 | #ifndef T_TXT | |
c007c974 | 314 | # define T_TXT 16 |
059ec3d9 PH |
315 | #endif |
316 | ||
317 | #ifndef T_SRV | |
c007c974 | 318 | # define T_SRV 33 |
059ec3d9 PH |
319 | #endif |
320 | ||
eae0036b PP |
321 | /* Many systems do not have T_SPF. */ |
322 | ||
323 | #ifndef T_SPF | |
c007c974 | 324 | # define T_SPF 99 |
eae0036b PP |
325 | #endif |
326 | ||
1e06383a TL |
327 | /* New TLSA record for DANE */ |
328 | #ifndef T_TLSA | |
c007c974 | 329 | # define T_TLSA 52 |
1e06383a TL |
330 | #endif |
331 | #define MAX_TLSA_EXPANDED_SIZE 8192 | |
332 | ||
ade42478 PH |
333 | /* It seems that some versions of arpa/nameser.h don't define *any* of the |
334 | T_xxx macros, which seem to be non-standard nowadays. Just to be on the safe | |
335 | side, put in definitions for all the ones that Exim uses. */ | |
336 | ||
337 | #ifndef T_A | |
c007c974 | 338 | # define T_A 1 |
ade42478 PH |
339 | #endif |
340 | ||
341 | #ifndef T_CNAME | |
c007c974 | 342 | # define T_CNAME 5 |
ade42478 PH |
343 | #endif |
344 | ||
885ccd3e | 345 | #ifndef T_SOA |
c007c974 | 346 | # define T_SOA 6 |
885ccd3e PH |
347 | #endif |
348 | ||
ade42478 | 349 | #ifndef T_MX |
c007c974 | 350 | # define T_MX 15 |
ade42478 PH |
351 | #endif |
352 | ||
353 | #ifndef T_NS | |
c007c974 | 354 | # define T_NS 2 |
ade42478 PH |
355 | #endif |
356 | ||
357 | #ifndef T_PTR | |
c007c974 | 358 | # define T_PTR 12 |
ade42478 PH |
359 | #endif |
360 | ||
361 | ||
e5a9dba6 PH |
362 | /* We define a few private types for special DNS lookups: |
363 | ||
364 | . T_ZNS gets the nameservers of the enclosing zone of a domain | |
365 | ||
366 | . T_MXH gets the MX hostnames only (without their priorities) | |
367 | ||
368 | . T_CSA gets the domain's Client SMTP Authorization SRV record | |
369 | ||
66be95e0 PP |
370 | . T_ADDRESSES looks up both AAAA (or A6) and A records |
371 | ||
372 | If any of these names appear in the RRtype list at: | |
373 | <http://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml> | |
374 | then we should rename Exim's private type away from the conflict. | |
e5a9dba6 | 375 | */ |
33397d19 PH |
376 | |
377 | #define T_ZNS (-1) | |
ea3bc19b | 378 | #define T_MXH (-2) |
e5a9dba6 | 379 | #define T_CSA (-3) |
66be95e0 | 380 | #define T_ADDRESSES (-4) |
33397d19 | 381 | |
059ec3d9 PH |
382 | /* The resolv.h header defines __P(x) on some Solaris 2.5.1 systems (without |
383 | checking that it is already defined, in fact). This conflicts with other | |
384 | headers that behave likewise (see below), leading to compiler warnings. Arrange | |
385 | to undefine it if resolv.h defines it. */ | |
386 | ||
387 | #if defined(__P) | |
c007c974 | 388 | # define __P_WAS_DEFINED_BEFORE_RESOLV |
059ec3d9 PH |
389 | #endif |
390 | ||
391 | #include <resolv.h> | |
392 | ||
393 | #if defined(__P) && ! defined (__P_WAS_DEFINED_BEFORE_RESOLV) | |
c007c974 | 394 | # undef __P |
059ec3d9 PH |
395 | #endif |
396 | ||
5bfb4cdf PP |
397 | /* If not defined by os.h, we do nothing special to push DNS resolver state |
398 | back to be available by the classic resolver routines. Also, provide | |
399 | prototype for our get routine, unless defined away. */ | |
400 | ||
401 | #ifndef os_put_dns_resolver_res | |
402 | # define os_put_dns_resolver_res(R) do {/**/} while(0) | |
403 | #endif | |
404 | #ifndef os_get_dns_resolver_res | |
405 | res_state os_get_dns_resolver_res(void); | |
406 | #endif | |
407 | ||
059ec3d9 PH |
408 | /* These three are to support the IP option logging code. Linux is |
409 | different to everyone else and there are also other systems which don't | |
410 | have netinet/ip_var.h, so there's a general macro to control its inclusion. */ | |
411 | ||
412 | #include <netinet/in_systm.h> | |
413 | #include <netinet/ip.h> | |
414 | ||
415 | #ifndef NO_IP_VAR_H | |
c007c974 | 416 | # include <netinet/ip_var.h> |
059ec3d9 PH |
417 | #endif |
418 | ||
419 | /* Linux (and some others) uses a different type for the 2nd argument of | |
420 | iconv(). It's os.h file defines ICONV_ARG2_TYPE. For the rest, define a default | |
421 | here. */ | |
422 | ||
423 | #ifndef ICONV_ARG2_TYPE | |
9c19b270 | 424 | # define ICONV_ARG2_TYPE char ** |
059ec3d9 PH |
425 | #endif |
426 | ||
427 | /* One OS uses a different type for the 5th argument of getsockopt */ | |
428 | ||
429 | #ifndef GETSOCKOPT_ARG5_TYPE | |
c007c974 | 430 | # define GETSOCKOPT_ARG5_TYPE socklen_t * |
059ec3d9 PH |
431 | #endif |
432 | ||
433 | /* One operating system uses a different type for the 2nd argument of select(). | |
434 | Its os.h file defines SELECT_ARG2_TYPE. For the rest, define a default here. */ | |
435 | ||
436 | #ifndef SELECT_ARG2_TYPE | |
c007c974 | 437 | # define SELECT_ARG2_TYPE fd_set |
059ec3d9 PH |
438 | #endif |
439 | ||
440 | /* One operating system uses a different type for the 4th argument of | |
441 | dn_expand(). Its os.h file defines DN_EXPAND_ARG4_TYPE. For the rest, define a | |
442 | default here. */ | |
443 | ||
444 | #ifndef DN_EXPAND_ARG4_TYPE | |
c007c974 | 445 | # define DN_EXPAND_ARG4_TYPE char * |
059ec3d9 PH |
446 | #endif |
447 | ||
448 | /* One operating system defines a different type for the yield of inet_addr(). | |
449 | In Exim code, its value is always assigned to the s_addr members of address | |
450 | structures. Casting the yield to the type of s_addr should fix the problem, | |
451 | since the size of the data is correct. Just in case this ever has to be | |
452 | changed, use a macro for the type, and define it here so that it is possible to | |
453 | use different values for specific OS if ever necessary. */ | |
454 | ||
455 | #ifndef S_ADDR_TYPE | |
c007c974 | 456 | # define S_ADDR_TYPE u_long |
059ec3d9 PH |
457 | #endif |
458 | ||
459 | /* (At least) one operating system (Solaris) defines a different type for the | |
460 | second argument of pam_converse() - the difference is the absence of "const". | |
461 | Its os.h file defines PAM_CONVERSE_ARG2_TYPE. For the rest, define a default | |
462 | here. */ | |
463 | ||
464 | #ifndef PAM_CONVERSE_ARG2_TYPE | |
c007c974 | 465 | # define PAM_CONVERSE_ARG2_TYPE const struct pam_message |
059ec3d9 PH |
466 | #endif |
467 | ||
468 | /* One operating system (SunOS4) defines getc, ungetc, feof, and ferror as | |
469 | macros and not as functions. Exim needs them to be assignable functions. This | |
470 | flag gets set to cause this to be sorted out here. */ | |
471 | ||
472 | #ifdef FUDGE_GETC_AND_FRIENDS | |
c007c974 | 473 | # undef getc |
059ec3d9 | 474 | extern int getc(FILE *); |
c007c974 | 475 | # undef ungetc |
059ec3d9 | 476 | extern int ungetc(int, FILE *); |
c007c974 | 477 | # undef feof |
059ec3d9 | 478 | extern int feof(FILE *); |
c007c974 | 479 | # undef ferror |
059ec3d9 PH |
480 | extern int ferror(FILE *); |
481 | #endif | |
482 | ||
483 | /* The header from the PCRE regex package */ | |
484 | ||
8eb9f5bd | 485 | #include <pcre.h> |
059ec3d9 PH |
486 | |
487 | /* Exim includes are in several files. Note that local_scan.h #includes | |
750af86e PH |
488 | config.h, mytypes.h, and store.h, so we don't need to mention them explicitly. |
489 | */ | |
8523533c | 490 | |
059ec3d9 PH |
491 | #include "local_scan.h" |
492 | #include "macros.h" | |
059ec3d9 PH |
493 | #include "dbstuff.h" |
494 | #include "structs.h" | |
0ab63f3d | 495 | #include "blob.h" |
059ec3d9 | 496 | #include "globals.h" |
5fb822fc | 497 | #include "hash.h" |
059ec3d9 PH |
498 | #include "functions.h" |
499 | #include "dbfunctions.h" | |
500 | #include "osfunctions.h" | |
501 | ||
8523533c | 502 | #ifdef EXPERIMENTAL_BRIGHTMAIL |
c007c974 | 503 | # include "bmi_spam.h" |
8523533c | 504 | #endif |
7952eef9 | 505 | #ifdef SUPPORT_SPF |
c007c974 | 506 | # include "spf.h" |
8523533c TK |
507 | #endif |
508 | #ifdef EXPERIMENTAL_SRS | |
c007c974 | 509 | # include "srs.h" |
8523533c | 510 | #endif |
80a47a2c | 511 | #ifndef DISABLE_DKIM |
c007c974 | 512 | # include "dkim.h" |
f7572e5a | 513 | #endif |
4840604e | 514 | #ifdef EXPERIMENTAL_DMARC |
c007c974 JH |
515 | # include "dmarc.h" |
516 | # include <opendmarc/dmarc.h> | |
4840604e | 517 | #endif |
8523533c | 518 | |
059ec3d9 PH |
519 | /* The following stuff must follow the inclusion of config.h because it |
520 | requires various things that are set therein. */ | |
521 | ||
522 | #if HAVE_ICONV /* Not all OS have this */ | |
c007c974 | 523 | # include <iconv.h> |
059ec3d9 PH |
524 | #endif |
525 | ||
379120bf | 526 | #if defined(USE_READLINE) || defined(EXPAND_DLFUNC) || defined (LOOKUP_MODULE_DIR) |
c007c974 | 527 | # include <dlfcn.h> |
059ec3d9 PH |
528 | #endif |
529 | ||
54fc8428 | 530 | #ifdef ENABLE_DISABLE_FSYNC |
c007c974 | 531 | # define EXIMfsync(f) (disable_fsync? 0 : fsync(f)) |
54fc8428 | 532 | #else |
c007c974 | 533 | # define EXIMfsync(f) fsync(f) |
54fc8428 PH |
534 | #endif |
535 | ||
059ec3d9 PH |
536 | /* Backward compatibility; LOOKUP_LSEARCH now includes all three */ |
537 | ||
538 | #if (!defined LOOKUP_LSEARCH) && (defined LOOKUP_WILDLSEARCH || defined LOOKUP_NWILDLSEARCH) | |
c007c974 | 539 | # define LOOKUP_LSEARCH yes |
059ec3d9 PH |
540 | #endif |
541 | ||
542 | /* Define a union to hold either an IPv4 or an IPv6 sockaddr structure; this | |
52ba4661 PP |
543 | simplifies some of the coding. We include the sockaddr to reduce type-punning |
544 | issues in C99. */ | |
059ec3d9 PH |
545 | |
546 | union sockaddr_46 { | |
547 | struct sockaddr_in v4; | |
548 | #if HAVE_IPV6 | |
549 | struct sockaddr_in6 v6; | |
550 | #endif | |
52ba4661 | 551 | struct sockaddr v0; |
059ec3d9 PH |
552 | }; |
553 | ||
554 | /* If SUPPORT_TLS is not defined, ensure that USE_GNUTLS is also not defined | |
16be7f11 JH |
555 | so that if USE_GNUTLS *is* set, we can assume SUPPORT_TLS is also set. |
556 | Likewise, OSCP, AUTH_TLS and CERTNAMES cannot be supported. */ | |
059ec3d9 PH |
557 | |
558 | #ifndef SUPPORT_TLS | |
c007c974 | 559 | # undef USE_GNUTLS |
16be7f11 JH |
560 | # ifndef DISABLE_OCSP |
561 | # define DISABLE_OCSP | |
562 | # endif | |
563 | # undef EXPERIMENTAL_CERTNAMES | |
564 | # undef AUTH_TLS | |
059ec3d9 PH |
565 | #endif |
566 | ||
567 | /* If SPOOL_DIRECTORY, LOG_FILE_PATH or PID_FILE_PATH have not been defined, | |
568 | set them to the null string. */ | |
569 | ||
570 | #ifndef SPOOL_DIRECTORY | |
571 | #define SPOOL_DIRECTORY "" | |
572 | #endif | |
573 | #ifndef LOG_FILE_PATH | |
574 | #define LOG_FILE_PATH "" | |
575 | #endif | |
576 | #ifndef PID_FILE_PATH | |
577 | #define PID_FILE_PATH "" | |
578 | #endif | |
579 | ||
580 | /* The EDQUOT error code isn't universally available, though it is widespread. | |
581 | There is a particular shambles in SunOS5, where it did not exist originally, | |
582 | but got installed with a particular patch for Solaris 2.4. There is a | |
583 | configuration variable for specifying what the system's "over quota" error is, | |
584 | which will end up in config.h if supplied in OS/Makefile-xxx. If it is not set, | |
585 | default to EDQUOT if it exists, otherwise ENOSPC. */ | |
586 | ||
587 | #ifndef ERRNO_QUOTA | |
c007c974 JH |
588 | # ifdef EDQUOT |
589 | # define ERRNO_QUOTA EDQUOT | |
590 | # else | |
591 | # define ERRNO_QUOTA ENOSPC | |
592 | # endif | |
059ec3d9 PH |
593 | #endif |
594 | ||
afe12dd0 | 595 | /* DANE w/o DNSSEC is useless */ |
c0635b6d | 596 | #if defined(SUPPORT_DANE) && defined(DISABLE_DNSSEC) |
fd5a6ffb | 597 | # error DANE support requires DNSSEC support |
afe12dd0 HSHR |
598 | #endif |
599 | ||
e72cfa5b JH |
600 | /* Some platforms (FreeBSD, OpenBSD, Solaris) do not seem to define this */ |
601 | ||
602 | #ifndef POLLRDHUP | |
603 | # define POLLRDHUP (POLLIN | POLLHUP) | |
604 | #endif | |
605 | ||
cb224393 | 606 | #endif |
059ec3d9 | 607 | /* End of exim.h */ |