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