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