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