From 420a0d19af455b8c65ca20e08b500bd9c4995860 Mon Sep 17 00:00:00 2001 From: Clinton Ebadi Date: Wed, 13 May 2015 23:12:14 -0400 Subject: [PATCH] Imported Upstream version 4.84 --- .gitattributes | 1 + .gitignore | 4 + ABOUT | 9 + ACKNOWLEDGMENTS | 474 + CHANGES | 10 + CONTRIBUTING | 56 + LICENCE | 340 + LICENSE.opendmarc | 29 + Makefile | 101 + NOTICE | 152 + OS/Makefile-AIX | 28 + OS/Makefile-BSDI | 21 + OS/Makefile-Base | 756 + OS/Makefile-CYGWIN | 114 + OS/Makefile-DGUX | 32 + OS/Makefile-Darwin | 29 + OS/Makefile-Default | 329 + OS/Makefile-DragonFly | 31 + OS/Makefile-FreeBSD | 50 + OS/Makefile-GNU | 29 + OS/Makefile-GNUkFreeBSD | 29 + OS/Makefile-GNUkNetBSD | 29 + OS/Makefile-HI-OSF | 8 + OS/Makefile-HI-UX | 12 + OS/Makefile-HP-UX | 25 + OS/Makefile-HP-UX-9 | 15 + OS/Makefile-IRIX | 12 + OS/Makefile-IRIX6 | 13 + OS/Makefile-IRIX632 | 16 + OS/Makefile-IRIX65 | 16 + OS/Makefile-Linux | 36 + OS/Makefile-NetBSD | 27 + OS/Makefile-NetBSD-a.out | 24 + OS/Makefile-OSF1 | 10 + OS/Makefile-OpenBSD | 28 + OS/Makefile-OpenUNIX | 17 + OS/Makefile-QNX | 30 + OS/Makefile-SCO | 28 + OS/Makefile-SCO_SV | 34 + OS/Makefile-SunOS4 | 16 + OS/Makefile-SunOS5 | 22 + OS/Makefile-SunOS5-hal | 18 + OS/Makefile-ULTRIX | 18 + OS/Makefile-UNIX_SV | 24 + OS/Makefile-USG | 33 + OS/Makefile-Unixware7 | 32 + OS/Makefile-mips | 16 + OS/eximon.conf-Default | 41 + OS/os.Configuring | 215 + OS/os.c-GNU | 55 + OS/os.c-HI-OSF | 35 + OS/os.c-IRIX | 118 + OS/os.c-IRIX6 | 118 + OS/os.c-IRIX632 | 118 + OS/os.c-IRIX65 | 118 + OS/os.c-Linux | 153 + OS/os.c-OSF1 | 36 + OS/os.c-cygwin | 862 + OS/os.h-AIX | 23 + OS/os.h-BSDI | 11 + OS/os.h-DGUX | 25 + OS/os.h-Darwin | 45 + OS/os.h-DragonFly | 10 + OS/os.h-FreeBSD | 13 + OS/os.h-GNU | 20 + OS/os.h-GNUkFreeBSD | 22 + OS/os.h-GNUkNetBSD | 22 + OS/os.h-HI-OSF | 9 + OS/os.h-HI-UX | 18 + OS/os.h-HP-UX | 27 + OS/os.h-HP-UX-9 | 20 + OS/os.h-IRIX | 20 + OS/os.h-IRIX6 | 19 + OS/os.h-IRIX632 | 21 + OS/os.h-IRIX65 | 19 + OS/os.h-Linux | 72 + OS/os.h-NetBSD | 25 + OS/os.h-NetBSD-a.out | 5 + OS/os.h-OSF1 | 19 + OS/os.h-OpenBSD | 16 + OS/os.h-OpenUNIX | 16 + OS/os.h-QNX | 21 + OS/os.h-SCO | 18 + OS/os.h-SCO_SV | 16 + OS/os.h-SunOS4 | 36 + OS/os.h-SunOS5 | 31 + OS/os.h-SunOS5-hal | 11 + OS/os.h-ULTRIX | 15 + OS/os.h-UNIX_SV | 22 + OS/os.h-USG | 16 + OS/os.h-Unixware7 | 19 + OS/os.h-cygwin | 51 + OS/os.h-mips | 24 + README | 349 + README.DSN | 141 + README.UPDATING | 757 + doc/ChangeLog | 6092 +++++ doc/Exim3.upgrade | 671 + doc/Exim4.upgrade | 1730 ++ doc/GnuTLS-FAQ.txt | 410 + doc/NewStuff | 973 + doc/OptionLists.txt | 1043 + doc/README | 65 + doc/README.SIEVE | 343 + doc/dbm.discuss.txt | 320 + doc/exim.8 | 1642 ++ doc/experimental-spec.txt | 1154 + doc/filter.txt | 1726 ++ doc/spec.txt | 34896 ++++++++++++++++++++++++++ exim_monitor/EDITME | 179 + exim_monitor/em_StripChart.c | 504 + exim_monitor/em_TextPop.c | 767 + exim_monitor/em_globals.c | 239 + exim_monitor/em_hdr.h | 327 + exim_monitor/em_init.c | 237 + exim_monitor/em_log.c | 406 + exim_monitor/em_main.c | 939 + exim_monitor/em_menu.c | 984 + exim_monitor/em_queue.c | 834 + exim_monitor/em_strip.c | 264 + exim_monitor/em_text.c | 73 + exim_monitor/em_version.c | 37 + exim_monitor/em_xs.c | 44 + scripts/Configure | 10 + scripts/Configure-Makefile | 292 + scripts/Configure-config.h | 60 + scripts/Configure-eximon | 51 + scripts/Configure-os.c | 30 + scripts/Configure-os.h | 51 + scripts/MakeLinks | 276 + scripts/arch-type | 74 + scripts/exim_install | 470 + scripts/lookups-Makefile | 197 + scripts/newer | 21 + scripts/os-type | 164 + scripts/reversion | 80 + scripts/source_checks | 50 + src/EDITME | 1343 + src/acl.c | 4488 ++++ src/aliases.default | 40 + src/auths/Makefile | 47 + src/auths/README | 98 + src/auths/auth-spa.c | 1542 ++ src/auths/auth-spa.h | 92 + src/auths/b64decode.c | 84 + src/auths/b64encode.c | 74 + src/auths/call_pam.c | 205 + src/auths/call_pwcheck.c | 120 + src/auths/call_radius.c | 221 + src/auths/check_serv_cond.c | 130 + src/auths/cram_md5.c | 351 + src/auths/cram_md5.h | 32 + src/auths/cyrus_sasl.c | 530 + src/auths/cyrus_sasl.h | 36 + src/auths/dovecot.c | 459 + src/auths/dovecot.h | 28 + src/auths/get_data.c | 47 + src/auths/get_no64_data.c | 47 + src/auths/gsasl_exim.c | 619 + src/auths/gsasl_exim.h | 42 + src/auths/heimdal_gssapi.c | 595 + src/auths/heimdal_gssapi.h | 39 + src/auths/md5.c | 357 + src/auths/plaintext.c | 299 + src/auths/plaintext.h | 32 + src/auths/pwcheck.c | 453 + src/auths/pwcheck.h | 27 + src/auths/sha1.c | 552 + src/auths/spa.c | 369 + src/auths/spa.h | 39 + src/auths/xtextdecode.c | 57 + src/auths/xtextencode.c | 61 + src/bmi_spam.c | 470 + src/bmi_spam.h | 22 + src/buildconfig.c | 930 + src/child.c | 514 + src/cnumber.h | 1 + src/config.h.defaults | 200 + src/configure.default | 822 + src/convert4r3.src | 1368 + src/convert4r4.src | 2513 ++ src/crypt16.c | 75 + src/daemon.c | 2095 ++ src/dbfn.c | 691 + src/dbfunctions.h | 33 + src/dbstuff.h | 665 + src/dcc.c | 517 + src/dcc.h | 16 + src/debug.c | 240 + src/deliver.c | 7683 ++++++ src/demime.c | 1243 + src/demime.h | 134 + src/directory.c | 96 + src/dkim.c | 580 + src/dkim.h | 31 + src/dmarc.c | 641 + src/dmarc.h | 62 + src/dns.c | 1260 + src/drtables.c | 674 + src/dummies.c | 148 + src/enq.c | 100 + src/exicyclog.src | 339 + src/exigrep.src | 230 + src/exim.c | 5613 +++++ src/exim.h | 594 + src/exim_checkaccess.src | 172 + src/exim_dbmbuild.c | 502 + src/exim_dbutil.c | 1358 + src/exim_lock.c | 638 + src/eximon.src | 201 + src/eximstats.src | 4218 ++++ src/exinext.src | 252 + src/exipick.src | 1824 ++ src/exiqgrep.src | 198 + src/exiqsumm.src | 167 + src/exiwhat.src | 135 + src/expand.c | 7107 ++++++ src/filter.c | 2611 ++ src/filtertest.c | 281 + src/functions.h | 447 + src/globals.c | 1457 ++ src/globals.h | 924 + src/header.c | 462 + src/host.c | 3239 +++ src/ip.c | 648 + src/local_scan.c | 64 + src/local_scan.h | 197 + src/log.c | 1349 + src/lookupapi.h | 59 + src/lookups/Makefile | 69 + src/lookups/README | 172 + src/lookups/cdb.c | 474 + src/lookups/dbmdb.c | 283 + src/lookups/dnsdb.c | 589 + src/lookups/dsearch.c | 157 + src/lookups/ibase.c | 584 + src/lookups/ldap.c | 1669 ++ src/lookups/ldap.h | 13 + src/lookups/lf_check_file.c | 113 + src/lookups/lf_functions.h | 17 + src/lookups/lf_quote.c | 65 + src/lookups/lf_sqlperform.c | 137 + src/lookups/lsearch.c | 488 + src/lookups/mysql.c | 456 + src/lookups/nis.c | 137 + src/lookups/nisplus.c | 297 + src/lookups/oracle.c | 642 + src/lookups/passwd.c | 90 + src/lookups/pgsql.c | 530 + src/lookups/redis.c | 349 + src/lookups/spf.c | 114 + src/lookups/sqlite.c | 196 + src/lookups/testdb.c | 103 + src/lookups/whoson.c | 101 + src/lss.c | 142 + src/macros.h | 898 + src/malware.c | 1679 ++ src/match.c | 1327 + src/memcheck.h | 277 + src/mime.c | 740 + src/mime.h | 83 + src/moan.c | 761 + src/mytypes.h | 117 + src/os.c | 917 + src/osfunctions.h | 36 + src/parse.c | 2200 ++ src/pdkim/Makefile | 22 + src/pdkim/README | 11 + src/pdkim/base64.c | 181 + src/pdkim/base64.h | 77 + src/pdkim/bignum.c | 1865 ++ src/pdkim/bignum.h | 527 + src/pdkim/bn_mul.h | 735 + src/pdkim/pdkim.c | 1773 ++ src/pdkim/pdkim.h | 320 + src/pdkim/rsa.c | 957 + src/pdkim/rsa.h | 419 + src/pdkim/sha1.c | 434 + src/pdkim/sha1.h | 145 + src/pdkim/sha2.c | 441 + src/pdkim/sha2.h | 153 + src/perl.c | 190 + src/queue.c | 1376 + src/rda.c | 1005 + src/readconf.c | 4151 +++ src/receive.c | 4157 +++ src/regex.c | 245 + src/retry.c | 943 + src/rewrite.c | 828 + src/rfc2047.c | 349 + src/route.c | 2012 ++ src/routers/Makefile | 43 + src/routers/README | 57 + src/routers/accept.c | 128 + src/routers/accept.h | 31 + src/routers/dnslookup.c | 432 + src/routers/dnslookup.h | 41 + src/routers/ipliteral.c | 200 + src/routers/ipliteral.h | 34 + src/routers/iplookup.c | 401 + src/routers/iplookup.h | 41 + src/routers/manualroute.c | 477 + src/routers/manualroute.h | 39 + src/routers/queryprogram.c | 537 + src/routers/queryprogram.h | 40 + src/routers/redirect.c | 914 + src/routers/redirect.h | 77 + src/routers/rf_change_domain.c | 84 + src/routers/rf_expand_data.c | 48 + src/routers/rf_functions.h | 31 + src/routers/rf_get_errors_address.c | 131 + src/routers/rf_get_munge_headers.c | 112 + src/routers/rf_get_transport.c | 90 + src/routers/rf_get_ugid.c | 80 + src/routers/rf_lookup_hostlist.c | 228 + src/routers/rf_queue_add.c | 106 + src/routers/rf_self_action.c | 141 + src/routers/rf_set_ugid.c | 44 + src/search.c | 823 + src/sieve.c | 3678 +++ src/smtp_in.c | 5046 ++++ src/smtp_out.c | 571 + src/spam.c | 445 + src/spam.h | 28 + src/spf.c | 139 + src/spf.h | 33 + src/spool_in.c | 884 + src/spool_mbox.c | 224 + src/spool_out.c | 521 + src/srs.c | 229 + src/srs.h | 29 + src/std-crypto.c | 521 + src/store.c | 563 + src/store.h | 53 + src/string.c | 1783 ++ src/structs.h | 794 + src/tls-gnu.c | 2258 ++ src/tls-openssl.c | 2349 ++ src/tls.c | 337 + src/tlscert-gnu.c | 451 + src/tlscert-openssl.c | 457 + src/tod.c | 211 + src/transport-filter.src | 83 + src/transport.c | 2205 ++ src/transports/Makefile | 25 + src/transports/README | 41 + src/transports/appendfile.c | 3371 +++ src/transports/appendfile.h | 97 + src/transports/autoreply.c | 874 + src/transports/autoreply.h | 45 + src/transports/lmtp.c | 789 + src/transports/lmtp.h | 32 + src/transports/pipe.c | 1161 + src/transports/pipe.h | 51 + src/transports/smtp.c | 3556 +++ src/transports/smtp.h | 112 + src/transports/tf_maildir.c | 598 + src/transports/tf_maildir.h | 20 + src/tree.c | 365 + src/valgrind.h | 4797 ++++ src/verify.c | 3729 +++ src/version.c | 56 + src/version.sh | 4 + util/README | 40 + util/cramtest.pl | 58 + util/gen_pkcs3.c | 239 + util/logargs.sh | 26 + util/mkcdb.pl | 92 + util/ocsp_fetch.pl | 83 + util/proxy_protocol_client.pl | 250 + util/ratelimit.pl | 157 + util/unknownuser.sh | 32 + 372 files changed, 228806 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 ABOUT create mode 100644 ACKNOWLEDGMENTS create mode 100644 CHANGES create mode 100644 CONTRIBUTING create mode 100644 LICENCE create mode 100644 LICENSE.opendmarc create mode 100644 Makefile create mode 100644 NOTICE create mode 100644 OS/Makefile-AIX create mode 100644 OS/Makefile-BSDI create mode 100644 OS/Makefile-Base create mode 100644 OS/Makefile-CYGWIN create mode 100644 OS/Makefile-DGUX create mode 100644 OS/Makefile-Darwin create mode 100644 OS/Makefile-Default create mode 100644 OS/Makefile-DragonFly create mode 100644 OS/Makefile-FreeBSD create mode 100644 OS/Makefile-GNU create mode 100644 OS/Makefile-GNUkFreeBSD create mode 100644 OS/Makefile-GNUkNetBSD create mode 100644 OS/Makefile-HI-OSF create mode 100644 OS/Makefile-HI-UX create mode 100644 OS/Makefile-HP-UX create mode 100644 OS/Makefile-HP-UX-9 create mode 100644 OS/Makefile-IRIX create mode 100644 OS/Makefile-IRIX6 create mode 100644 OS/Makefile-IRIX632 create mode 100644 OS/Makefile-IRIX65 create mode 100644 OS/Makefile-Linux create mode 100644 OS/Makefile-NetBSD create mode 100644 OS/Makefile-NetBSD-a.out create mode 100644 OS/Makefile-OSF1 create mode 100644 OS/Makefile-OpenBSD create mode 100644 OS/Makefile-OpenUNIX create mode 100644 OS/Makefile-QNX create mode 100644 OS/Makefile-SCO create mode 100644 OS/Makefile-SCO_SV create mode 100644 OS/Makefile-SunOS4 create mode 100644 OS/Makefile-SunOS5 create mode 100644 OS/Makefile-SunOS5-hal create mode 100644 OS/Makefile-ULTRIX create mode 100644 OS/Makefile-UNIX_SV create mode 100644 OS/Makefile-USG create mode 100644 OS/Makefile-Unixware7 create mode 100644 OS/Makefile-mips create mode 100644 OS/eximon.conf-Default create mode 100644 OS/os.Configuring create mode 100644 OS/os.c-GNU create mode 100644 OS/os.c-HI-OSF create mode 100644 OS/os.c-IRIX create mode 100644 OS/os.c-IRIX6 create mode 100644 OS/os.c-IRIX632 create mode 100644 OS/os.c-IRIX65 create mode 100644 OS/os.c-Linux create mode 100644 OS/os.c-OSF1 create mode 100644 OS/os.c-cygwin create mode 100644 OS/os.h-AIX create mode 100644 OS/os.h-BSDI create mode 100644 OS/os.h-DGUX create mode 100644 OS/os.h-Darwin create mode 100644 OS/os.h-DragonFly create mode 100644 OS/os.h-FreeBSD create mode 100644 OS/os.h-GNU create mode 100644 OS/os.h-GNUkFreeBSD create mode 100644 OS/os.h-GNUkNetBSD create mode 100644 OS/os.h-HI-OSF create mode 100644 OS/os.h-HI-UX create mode 100644 OS/os.h-HP-UX create mode 100644 OS/os.h-HP-UX-9 create mode 100644 OS/os.h-IRIX create mode 100644 OS/os.h-IRIX6 create mode 100644 OS/os.h-IRIX632 create mode 100644 OS/os.h-IRIX65 create mode 100644 OS/os.h-Linux create mode 100644 OS/os.h-NetBSD create mode 100644 OS/os.h-NetBSD-a.out create mode 100644 OS/os.h-OSF1 create mode 100644 OS/os.h-OpenBSD create mode 100644 OS/os.h-OpenUNIX create mode 100644 OS/os.h-QNX create mode 100644 OS/os.h-SCO create mode 100644 OS/os.h-SCO_SV create mode 100644 OS/os.h-SunOS4 create mode 100644 OS/os.h-SunOS5 create mode 100644 OS/os.h-SunOS5-hal create mode 100644 OS/os.h-ULTRIX create mode 100644 OS/os.h-UNIX_SV create mode 100644 OS/os.h-USG create mode 100644 OS/os.h-Unixware7 create mode 100644 OS/os.h-cygwin create mode 100644 OS/os.h-mips create mode 100644 README create mode 100644 README.DSN create mode 100644 README.UPDATING create mode 100644 doc/ChangeLog create mode 100644 doc/Exim3.upgrade create mode 100644 doc/Exim4.upgrade create mode 100644 doc/GnuTLS-FAQ.txt create mode 100644 doc/NewStuff create mode 100644 doc/OptionLists.txt create mode 100644 doc/README create mode 100644 doc/README.SIEVE create mode 100644 doc/dbm.discuss.txt create mode 100644 doc/exim.8 create mode 100644 doc/experimental-spec.txt create mode 100644 doc/filter.txt create mode 100644 doc/spec.txt create mode 100644 exim_monitor/EDITME create mode 100644 exim_monitor/em_StripChart.c create mode 100644 exim_monitor/em_TextPop.c create mode 100644 exim_monitor/em_globals.c create mode 100644 exim_monitor/em_hdr.h create mode 100644 exim_monitor/em_init.c create mode 100644 exim_monitor/em_log.c create mode 100644 exim_monitor/em_main.c create mode 100644 exim_monitor/em_menu.c create mode 100644 exim_monitor/em_queue.c create mode 100644 exim_monitor/em_strip.c create mode 100644 exim_monitor/em_text.c create mode 100644 exim_monitor/em_version.c create mode 100644 exim_monitor/em_xs.c create mode 100755 scripts/Configure create mode 100755 scripts/Configure-Makefile create mode 100755 scripts/Configure-config.h create mode 100755 scripts/Configure-eximon create mode 100755 scripts/Configure-os.c create mode 100755 scripts/Configure-os.h create mode 100755 scripts/MakeLinks create mode 100755 scripts/arch-type create mode 100755 scripts/exim_install create mode 100755 scripts/lookups-Makefile create mode 100755 scripts/newer create mode 100755 scripts/os-type create mode 100755 scripts/reversion create mode 100644 scripts/source_checks create mode 100644 src/EDITME create mode 100644 src/acl.c create mode 100644 src/aliases.default create mode 100644 src/auths/Makefile create mode 100644 src/auths/README create mode 100644 src/auths/auth-spa.c create mode 100644 src/auths/auth-spa.h create mode 100644 src/auths/b64decode.c create mode 100644 src/auths/b64encode.c create mode 100644 src/auths/call_pam.c create mode 100644 src/auths/call_pwcheck.c create mode 100644 src/auths/call_radius.c create mode 100644 src/auths/check_serv_cond.c create mode 100644 src/auths/cram_md5.c create mode 100644 src/auths/cram_md5.h create mode 100644 src/auths/cyrus_sasl.c create mode 100644 src/auths/cyrus_sasl.h create mode 100644 src/auths/dovecot.c create mode 100644 src/auths/dovecot.h create mode 100644 src/auths/get_data.c create mode 100644 src/auths/get_no64_data.c create mode 100644 src/auths/gsasl_exim.c create mode 100644 src/auths/gsasl_exim.h create mode 100644 src/auths/heimdal_gssapi.c create mode 100644 src/auths/heimdal_gssapi.h create mode 100644 src/auths/md5.c create mode 100644 src/auths/plaintext.c create mode 100644 src/auths/plaintext.h create mode 100644 src/auths/pwcheck.c create mode 100644 src/auths/pwcheck.h create mode 100644 src/auths/sha1.c create mode 100644 src/auths/spa.c create mode 100644 src/auths/spa.h create mode 100644 src/auths/xtextdecode.c create mode 100644 src/auths/xtextencode.c create mode 100644 src/bmi_spam.c create mode 100644 src/bmi_spam.h create mode 100644 src/buildconfig.c create mode 100644 src/child.c create mode 100644 src/cnumber.h create mode 100644 src/config.h.defaults create mode 100644 src/configure.default create mode 100755 src/convert4r3.src create mode 100755 src/convert4r4.src create mode 100644 src/crypt16.c create mode 100644 src/daemon.c create mode 100644 src/dbfn.c create mode 100644 src/dbfunctions.h create mode 100644 src/dbstuff.h create mode 100644 src/dcc.c create mode 100644 src/dcc.h create mode 100644 src/debug.c create mode 100644 src/deliver.c create mode 100644 src/demime.c create mode 100644 src/demime.h create mode 100644 src/directory.c create mode 100644 src/dkim.c create mode 100644 src/dkim.h create mode 100644 src/dmarc.c create mode 100644 src/dmarc.h create mode 100644 src/dns.c create mode 100644 src/drtables.c create mode 100644 src/dummies.c create mode 100644 src/enq.c create mode 100644 src/exicyclog.src create mode 100644 src/exigrep.src create mode 100644 src/exim.c create mode 100644 src/exim.h create mode 100755 src/exim_checkaccess.src create mode 100644 src/exim_dbmbuild.c create mode 100644 src/exim_dbutil.c create mode 100644 src/exim_lock.c create mode 100644 src/eximon.src create mode 100644 src/eximstats.src create mode 100644 src/exinext.src create mode 100644 src/exipick.src create mode 100644 src/exiqgrep.src create mode 100644 src/exiqsumm.src create mode 100644 src/exiwhat.src create mode 100644 src/expand.c create mode 100644 src/filter.c create mode 100644 src/filtertest.c create mode 100644 src/functions.h create mode 100644 src/globals.c create mode 100644 src/globals.h create mode 100644 src/header.c create mode 100644 src/host.c create mode 100644 src/ip.c create mode 100644 src/local_scan.c create mode 100644 src/local_scan.h create mode 100644 src/log.c create mode 100644 src/lookupapi.h create mode 100644 src/lookups/Makefile create mode 100644 src/lookups/README create mode 100644 src/lookups/cdb.c create mode 100644 src/lookups/dbmdb.c create mode 100644 src/lookups/dnsdb.c create mode 100644 src/lookups/dsearch.c create mode 100644 src/lookups/ibase.c create mode 100644 src/lookups/ldap.c create mode 100644 src/lookups/ldap.h create mode 100644 src/lookups/lf_check_file.c create mode 100644 src/lookups/lf_functions.h create mode 100644 src/lookups/lf_quote.c create mode 100644 src/lookups/lf_sqlperform.c create mode 100644 src/lookups/lsearch.c create mode 100644 src/lookups/mysql.c create mode 100644 src/lookups/nis.c create mode 100644 src/lookups/nisplus.c create mode 100644 src/lookups/oracle.c create mode 100644 src/lookups/passwd.c create mode 100644 src/lookups/pgsql.c create mode 100644 src/lookups/redis.c create mode 100644 src/lookups/spf.c create mode 100644 src/lookups/sqlite.c create mode 100644 src/lookups/testdb.c create mode 100644 src/lookups/whoson.c create mode 100644 src/lss.c create mode 100644 src/macros.h create mode 100644 src/malware.c create mode 100644 src/match.c create mode 100644 src/memcheck.h create mode 100644 src/mime.c create mode 100644 src/mime.h create mode 100644 src/moan.c create mode 100644 src/mytypes.h create mode 100644 src/os.c create mode 100644 src/osfunctions.h create mode 100644 src/parse.c create mode 100644 src/pdkim/Makefile create mode 100644 src/pdkim/README create mode 100644 src/pdkim/base64.c create mode 100644 src/pdkim/base64.h create mode 100644 src/pdkim/bignum.c create mode 100644 src/pdkim/bignum.h create mode 100644 src/pdkim/bn_mul.h create mode 100644 src/pdkim/pdkim.c create mode 100644 src/pdkim/pdkim.h create mode 100644 src/pdkim/rsa.c create mode 100644 src/pdkim/rsa.h create mode 100644 src/pdkim/sha1.c create mode 100644 src/pdkim/sha1.h create mode 100644 src/pdkim/sha2.c create mode 100644 src/pdkim/sha2.h create mode 100644 src/perl.c create mode 100644 src/queue.c create mode 100644 src/rda.c create mode 100644 src/readconf.c create mode 100644 src/receive.c create mode 100644 src/regex.c create mode 100644 src/retry.c create mode 100644 src/rewrite.c create mode 100644 src/rfc2047.c create mode 100644 src/route.c create mode 100644 src/routers/Makefile create mode 100644 src/routers/README create mode 100644 src/routers/accept.c create mode 100644 src/routers/accept.h create mode 100644 src/routers/dnslookup.c create mode 100644 src/routers/dnslookup.h create mode 100644 src/routers/ipliteral.c create mode 100644 src/routers/ipliteral.h create mode 100644 src/routers/iplookup.c create mode 100644 src/routers/iplookup.h create mode 100644 src/routers/manualroute.c create mode 100644 src/routers/manualroute.h create mode 100644 src/routers/queryprogram.c create mode 100644 src/routers/queryprogram.h create mode 100644 src/routers/redirect.c create mode 100644 src/routers/redirect.h create mode 100644 src/routers/rf_change_domain.c create mode 100644 src/routers/rf_expand_data.c create mode 100644 src/routers/rf_functions.h create mode 100644 src/routers/rf_get_errors_address.c create mode 100644 src/routers/rf_get_munge_headers.c create mode 100644 src/routers/rf_get_transport.c create mode 100644 src/routers/rf_get_ugid.c create mode 100644 src/routers/rf_lookup_hostlist.c create mode 100644 src/routers/rf_queue_add.c create mode 100644 src/routers/rf_self_action.c create mode 100644 src/routers/rf_set_ugid.c create mode 100644 src/search.c create mode 100644 src/sieve.c create mode 100644 src/smtp_in.c create mode 100644 src/smtp_out.c create mode 100644 src/spam.c create mode 100644 src/spam.h create mode 100644 src/spf.c create mode 100644 src/spf.h create mode 100644 src/spool_in.c create mode 100644 src/spool_mbox.c create mode 100644 src/spool_out.c create mode 100644 src/srs.c create mode 100644 src/srs.h create mode 100644 src/std-crypto.c create mode 100644 src/store.c create mode 100644 src/store.h create mode 100644 src/string.c create mode 100644 src/structs.h create mode 100644 src/tls-gnu.c create mode 100644 src/tls-openssl.c create mode 100644 src/tls.c create mode 100644 src/tlscert-gnu.c create mode 100644 src/tlscert-openssl.c create mode 100644 src/tod.c create mode 100644 src/transport-filter.src create mode 100644 src/transport.c create mode 100644 src/transports/Makefile create mode 100644 src/transports/README create mode 100644 src/transports/appendfile.c create mode 100644 src/transports/appendfile.h create mode 100644 src/transports/autoreply.c create mode 100644 src/transports/autoreply.h create mode 100644 src/transports/lmtp.c create mode 100644 src/transports/lmtp.h create mode 100644 src/transports/pipe.c create mode 100644 src/transports/pipe.h create mode 100644 src/transports/smtp.c create mode 100644 src/transports/smtp.h create mode 100644 src/transports/tf_maildir.c create mode 100644 src/transports/tf_maildir.h create mode 100644 src/tree.c create mode 100644 src/valgrind.h create mode 100644 src/verify.c create mode 100644 src/version.c create mode 100644 src/version.sh create mode 100644 util/README create mode 100755 util/cramtest.pl create mode 100644 util/gen_pkcs3.c create mode 100755 util/logargs.sh create mode 100755 util/mkcdb.pl create mode 100755 util/ocsp_fetch.pl create mode 100644 util/proxy_protocol_client.pl create mode 100644 util/ratelimit.pl create mode 100755 util/unknownuser.sh diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..554385c --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +ACKNOWLEDGMENTS encoding=utf-8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7839e97 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +Local +build-* +tags +cscope.out diff --git a/ABOUT b/ABOUT new file mode 100644 index 0000000..8d204b5 --- /dev/null +++ b/ABOUT @@ -0,0 +1,9 @@ +Exim repository: src +-------------------- + +This directory contains everything that is included in an Exim distribution +tarball, with the exception of the doc directory and an empty Local directory. +You can build Exim from the contents of this directory by adding a Local +directory that contains appropriate configuration files. + +End diff --git a/ACKNOWLEDGMENTS b/ACKNOWLEDGMENTS new file mode 100644 index 0000000..1c4a934 --- /dev/null +++ b/ACKNOWLEDGMENTS @@ -0,0 +1,474 @@ +EXIM ACKNOWLEDGEMENTS + +This file is divided into two parts. The first is the original list maintained +by Exim's author, Philip Hazel, before he retired. That has two sub-lists of +contributors. The second main part is an attempt to bring this up-to-date, +using information from ChangeLog and git. + +Names may well occur more than once. + +There was a five year gap. It is unlikely that this file is complete. +If you contributed and are not listed, then *please* let us know. Even if you +don't much care, we want to acknowledge your help. A contribution isn't just +code, it includes reporting real bugs, helping with tracking problems down, +documentation fixes and more. + +(Note that we have patches from folks in various countries and Latin1 is not + sufficient to handle all of their names acceptably. + This file should be in UTF-8). + +-Phil Pennock, pp The Exim Maintainers. + +============================8< cut here >8============================== + +I have not been very good at keeping a proper record of all the people who have +sent in patches and other contributions to Exim. I am going to try to do better +in the future by keeping a record in this file. First, I'll put a list of all +those I can recover from the past; then I'll create a new list to which I'll +add new contributors in future. Some regular contributors may appear in both. + +I'm going to record people who send in actual patches or who help in detailed +ways. I'm not going to list people who just make a suggestion or report a +bug. I hope that is a reasonable approach. + +If you should be on one of these lists and are not, please accept my apologies, +and let me know! Any omissions are solely due to my incompetence. In +particular, the "past" list has certainly lost the names of people who sent in +relatively small patches. + +Philip Hazel + +Lists created: 20 November 2002 +Last updated (by PH): 22 August 2007 + +THE OLD LIST + +Alan Barratt First code for relay checking +Malcolm Beattie Interface to embedded Perl +Philip Blundell First support for IPv6 +Piete Brooks Running the first live version + Implementing multiple-system compilation +Matthew Byng-Maddick First code for dsearch lookup +Steve Campbell Extensions to eximstats + Steve is now the maintainer of eximstats +Brian Candler LDAP support enhancement +Petr Cech PostgreSQL interface +Steve Clarke Best way to find the load average in Linux +Energis Ltd Resources for the exim.org site +Yann Golanski Numerical hash function +Jason Gunthorpe IPv6 support (Linux) +Michael Haardt LDAP support enhancement +Steve Haslam First code for TLS +Kjetil Torgrim Homme Suggested patch for macro extensions +John Horne Proof-reading documentation (repeatedly) +Pierre Humblet Cygwin support +Paul Kelly MySQL interface + First code for Oracle interface +Ian Kirk Radius support +Stuart Levy Replacement for broken inet_ntoa() on IRIX +Stuart Lynne First code for LDAP +Nigel Metheringham Setting up the web site and mailing list + Managing the web site and mailing list + Interface to Berkeley DB + Support for cdb + Support for maildir +Barry Pederson LDAP support enhancement +Marc Prud'hommeaux SPA client authentication +Alexander Sabourenkov pwcheck daemon support +Peter Savitch LDAP support enhancement +Robert Wal whoson lookup +Joachim Wieland Researching strace and stolen subprocesses in Linux + + +THE NEW LIST + +Alexander Alekseev Use of function attribute checks in gcc +Justo Alonso Suggested patch for maildir++ maildirsize file support +Anton Altaparmakov Patches to get cyrus_sasl fully working +Simon Arlott Patch for $dnslist_matched. +Claus Assmann Example code for OpenSSL CRL support +Warren Baker Experimental Redis lookup. +Robert Bannocks Patch for LDAP reference problem on Solaris +Ian Bell Analysis of a bug and an infelicity in clock tick code + Patch for ${quote_local_part +Peter Benie A number mistakes found by analysing the code +Johannes Berg Suggested patch for authentication client $auth support + Suggested patch for acl_not_smtp_start +Matt Bernstein LMTP over socket + Suggested patch for dnslists '&' feature +Mike Bethune Help with debugging an elusive ALRM signal bug +Ard Biesheuvel Lookup code for accessing an Interbase database +Richard Birkett Fix for empty -f address crash +Dean Brooks Fix for ratelimit per_rcpt in acl_not_smtp. +Nick Burrett Patch for CONFIGURE_FILE_USE_EUID in exicyclog +Matthew Byng-Maddick Patch for qualify_domain in redirect router + Patch for ignore_target_hosts in ipliteral router + The cyrus_sasl authenticator +Steve Campbell eximstats extensions and continued maintenance +Brian Candler Use h_errno for gethostbyname() + Suggested patch for .ifdef etc + Several minor fixes and suggestions +Pete Carah Patch for change to radiusclient API +Oliver Cook Suggested patch for exigrep & rejected messages + Patch to add sender/host info to local_scan() rejects + Suggested patch to add queue time to "Completed" +Ted Cooper Suggested patch for NOTQUIT ACL +Jennifer Corley Designing the new Exim logo +John Dalbec Patch for quota_warn_threshold bug +Vivek Dasmohapatra Suggested patch for CRL support +Dennis Davis Suggested server_condition for all authenticators +Andrew Doran Patch for NetBSD configuration files + Patch for ifreq alignment and size problems +Michael Deutschmann Suggested patch for treating bind() failure like connect() + Patch for $sender_data and $recipient_data + Suggested patch for null address match lookup bug + Suggested patch for verify = not_blind + Patch for alternate TXT lookup in DNS lists +Oliver Eikemeier Patch to skip Received: if expansion is empty + Patch for "eqi" +Nico Erfurth Fix for bug in ${readfile} + Patch for router_home_directory + Patch for ACL crash (try to test sender after ETRN) + Suggested patch for lookup search bug + Suggested patch for advertise_condition + Patch for missing HELO in checkaccess + Patch for raw headers + Patch for lsearch lookups tidying + Patch for .include_if_exists + Patch for partial- not recognized in host list + Lots more patches for bug fixes, enhancements, and + code refactorings - too many to record details! +Jochen Erwied Fix for BDB 4.1 API +Stefan Esser Fix for DNS RR parsing bug +Peter Evans Suggested using modification time of "new" for time + of "mailbox last read" for maildir +Andrew Findlay Patch to close writing end of ${readsocket +Michael Fischer + v. Mollard Suggested patch for exigrep -t option +Kevin Fleming Callout cache code + Patch for authenticated_sender +Tony Finch Expansion extensions + Timezone addition to log timestamps + A number of useful code criticisms + Timezone patch for exiwhat + Patch for more daemon exiwhat information + Patch for -dd + Patch for mxh lookup type in dnsdb + Patch for defer_foo in dndsb + Patch for ${dlfunc + Patch for $message_linecount + ... and many more +Graeme Fowler Suggested patch for /noupdate with ratelimit +Ian Freislich Patch for spamd timeout problem +Giuliano Gavazzi Patches for OSX compilation +Dominic Germain Patch for exiqgrep MacOS X bug +Oliver Gorwits $load_average patch + Patch for additional syslog facilities +James Grinter Suggested patches for header manipulation functions + and recipient remove for local_scan() use +Lukasz Grochal Patch for saslauthd buglet +Pavel Gulchouck Diagnosis of return_path_on_delivery crash +Michael Haardt Tidies to make the code stricter + Refactoring to allow for other filter types + Suggested patch for appendfile "folder" extension + Module to support Sieve (RFC 3028) filters and + continued maintenance of same + Patch for faster sort algorithm in queue.c + Patch for LDAP timeout handling + ... and several more +Thomas Hager Patch for saslauthd crash bug +Richard Hall Fix for file descriptor leak in redirection + Fix for exiqsumm output corner case +Jori Hamalainen Patch to add features to exiqsumm + Patch to speed up exigrep +Steve Haslam Lots of stuff, including + HMAC computations + Better error messages for BDB +Sheldon Hearn Suggested patch for smtp_accept_max_nonmail_hosts + Fix for compile error with OpenSSL 0.9.8e +Bryan Henderson Patch to use RM_COMMAND everywhere during building +Jakob Hirsch Patch for % operator + Patch for arbitrarily named ACL variables +Magnus Holmgren Patch for filter_prepend_home + Patch for "h" flag in Domain Keys + Patch for $sending_ip_address/$sending_port + Patch for ${rfc2047d: + ... and several more + Lots of other maintenance support +Kjetil Torgrim Homme Patch for require_files problem on NFS file systems +Tom Hughes Suggested patch for $n bug in pipe command from filter +Pierre Humblet Continued Cygwin support +Peter Ilieve Suggested patch for lookup search bug +John Jetmore Writing and maintaining the 'exipick' utility + Much helpful testing of the test suite & elsewhere + Patch for -Mset + Patch for TLS testing with -bh/-bhc/-bs + Patch for exigrep -v functionality +Bob Johannessen Patch for Sieve envelope tests bug + Patch for negative uid/gid bug +Brad Jorsch Patch for bitwise logical operators + Patch for using "message" on acceptance + Patch to add == and =& to dnslists +Christian Kellner Patch for LDAP dereferencing +Alex Kiernan Patches for libradius + Diagnosis of milliwait clock-backwards bug + Patch for BDB 4.3 API change +Tom Kistner SPA server code + Writing and maintaining the content scanning + extension (exiscan) +Jürgen Kreileder Fix for cyrus_sasl advertisement problem +Friso Kuipers Patch for GDBM problem +Matthias Lederhofer Diagnosing and patching obscure and subtle socket bug +Chris Liddiard Fix for bug in exiqsumm +Chris Lightfoot Patch for -restore-times in exim_lock +Edgar Lovecraft Patch for ${str2b64: +Torsten Luettgert Suggested patch for proper integer overflow detection +Todd Lyons Patch to add DMARC support using OpenDMARC libs/tools +David Madole Patch for SPA forced expansion failure bug +Lars Mainka Patch for OpenSSL crl collections +Andrey Malyshev Patch for $address_data after redirection bug +Lionel Elie Mamane Patch for IPv4/IPv6 listen() problem on USAGI Linux + Patch for recognizing IPv6 "scoped addresses" + Patch for callout caching bug +Everton da Silva Marques Suggested patch for SRV handling + Suggested patch for SRV/MX lookup retry option +Nikos Mavrogiannopoulos GnuTLS proof of concept code + Update to RSA and D-H parameter caching code +Komar Maxim Patch for check_rfc2047_length +Andy Mell Fix for rejectlog regeneration bug +Marc Merlin Many suggestions and patches for callouts and + SMTP error message features +Andreas Metzler Patch for message_id_header_domain + Suggested patch for multi-config files in scripts bug + GnuTLS non-existent parameter file bug fix +Alex Miller Suggested readline() patch + Patch for LDAP_RES_SEARCH_REFERENCE handling + Support for the DrWeb content scanner +Arkadiusz Miskiewicz Patch to add timeout to reads in malware.c +Martin Mrazik Patches for problems in the test suite +Andreas Mueller Patch for logging uncompleted SMTP transactions +Pete Naylor Patch for LDAP TCP connect timeout setting +Alexander Newmann Diagnosing and patching obscure and subtle socket bug +Matthew Newton Patch for exicyclog log location problem +Marcin Owsiany Diagnosis of a tricky timeout failure bug +Andrey Panin Dovecot authenticator +Eric Parusel Patch for tls_remember_esmtp +Gaige Paulsen Amended Darwin config files +Richard Premdas Patch for PAM buglet +Jason Pyeron Suggested patch for ignoring Sendmail's -O option +Axel Rau Patch for Transport Post Delivery sql logging +Mark Rigby-Jones Patch for race condition during MBX locking +Robert Roselius Patch for OpenSSL workaround for bad clients +Larry Rosenman OpenUNIX config files +Alexander Sabourenkov Patch to add saslauthd daemon support + Patch for MySQL non-data queries +David Saez Suggested patch for $sender_hostname lookup if needed + Support for the clamd virus scanner + Suggested patch for increased number of ACL variables +Jonathan Sambrook Suggested patch for expanding uid and gid lists +Peter Savitch Diagnosis of FPE bug when statvfs() fails on spool +Harald Schueler Patch for dn_expand() failure on truncated data +Heiko Schlichting Diagnosis of intermittent daemon crash bug +Heiko Schlitterman Proposed patch for +pid +Stephan Schulz Patch for $host_data caching error +Lai Zit Seng Patch for radiusclient 0.4.9 interface bugs +Tony Sheen Log files with datestamped names and auto rollover +Martin Sluka Patch for exigrep to include non-message lines +Adam Stephens Suggested patch for IGNOREQUOTA in LMTP +Russell Stuart Diagnosis of obscure batch multiple delivery bug +Tamas Tevesz Patch for crypt16() support +Johan Thelmen Support for the F-Secure virus scanner +William Thompson Suggested patch for acl_smtp_helo + Suggested patch for nested ACL "drop" bug + Suggested patch for continuation lines in file ACLs + Patch for != support in DNS lists +Adam Thornton Patch for SMTP port expansion +Daniel Tiefnig Much helpful testing of the test suite +Rein Tollevik Patch to fix search cache missing tidyup +Stefan Traby Threaded Perl support +Samuli Tuomola OS files for QNX 6.2.0 +Dave Turner Suggested patch for sender rewriting brokenness +Steve Usher Unbuffered I/O patch for Dovecot authentication +Carlos Villegas Suggested patch for "headers" in filter files +Matthias Waffenschmidt Patch for build-time Perl bug in configure script + Queue run abandon log message tidy up +Norihisa Washitake Suggested patch for RFC 2047 header decoding +Chris Webb Patch for support of an SPF lookup method. +Florian Weimer Patch for minor format string issue + Noticing the unwanted (and time-wasting) GnuTLS + RSA_EXPORT code, and supplying a patch to remove it +Joachim Wieland Patches for PostgreSQL socket support and other + PostgreSQL functionality + Patch for hosts_avoid_esmtp +Stephen Wilcox Patch for ignore_enotdir problem +Alain Williams Suggested patch for exicyclog options + PATCH for LDAP referrals option +David Woodhouse SQLite support proof of concept code + control=freeze/no_tell basic code +Erik ? patch to use select() instead of poll() on OS X +**** + +============================8< cut here >8============================== + +The Exim Maintainers Lists +========================== + +We'll start with the Exim Maintainers, who are the people with commit +access to the master git repository and a couple more folk; then we'll list +known contributors since the lists above. Then we list the folks who work +to make Exim available on various operating systems as porters/packagers. + +For the Maintainers, we may list primary focus area. All maintainers +will have contributed to work outside those areas. The maintainers' +contributions are initialled in ChangeLog. Changes from before maintainership +should be listed as a contributor. + +For other contributors, we will attempt to track all contributions. Note that +the entries per-person were added initially by scanning back through the +ChangeLog and git, so are not in chronological order. + +[ With names from all over the world, we need one sort order. I've arbitrarily + decreed it to be "normal British address-book sort order, but based on family + name rather than whichever comes last and using whatever seems sanest for + sort order of characters which do not collate onto an English character", + which should handle the majority of cases. If it is not adequate for some + situation, we'll resolve it then. + We leave out titles and honourifics, just names and handles. ] + + +Maintainers +----------- +Steve Campbell eximstats maintainer. +Mike Cardwell Exim webmaster. +Tony Finch Unbreaks lots of things. Ratelimit code. +Graeme Fowler +Michael Haardt Maintains Sieve support, works on DKIM. +Jeremy Harris +Philip Hazel Retired. + Originating architect and author of the Exim project. +John Jetmore +Tom Kistner DKIM. Content scanning. SPA. +Todd Lyons +Nigel Metheringham Transitioning out of Default Victim status. +Phil Pennock Release Coordinator. Breaks lots of things. +David Woodhouse Dynamic modules. Security. + + +Contributors +------------ +Andrew Aitchison Spotted cmdline AV scanner regression with -bmalware +Simon Arlott Code for outbound SSL-on-connect + Patch implementing %M datestamping in log filenames + Patch restoring SIGPIPE handler for child_open_uid + Patch fixing NUL term/init of DKIM strings + Patch fixing dnsdb TXT record handling for DKIM + Patch speeding up DomainKeys signing +Warren Baker Found crash with MIME ACLs in non-SMTP local injection +Dmitry Banschikov Path to check for LDAP TLS initialisation errors +René Berber Pointed out mistake in build instructions for QNX +Johannes Berg Maintained dynamically loadable module code out-of-tree + Patch expanding spamd_address if contains $ +Jasen Betts Spotted lack of docs re bool{} on empty string + and typo fixes +Wolfgang Breyha DCC integration; expandable spamd_address + Patch handling IPv6 addresses for SPF + Patch fixing DKIM verification when signature header + not prepended + Unbroke Cyrus SASL auth after incorrect SSF addition + Logging of 8bitmime reception +David Brownlee Patch improving local interface IP address detection +Eugene Bujak Security patch fixing buffer overflow in string_format +Adam Ciarcinski Patch for TLS-enabled LDAP (alternative to ldaps) +Dennis Davis Patches fixing compilation in older compilers + Reported dynlookup framework build issues on Solaris +Serge Demonchaux Maintained dynamically loadable module code out-of-tree + Patch fixing sign/unsigned and UTF mismatches +Uwe Doering Patch fixing DKIM multiple signature generation +Maxim Dounin Patch portability of accept() len +Frank Elsner Fixed build reliability by exporting LC_ALL=C +Paul Fisher Diagnosed smtp_cmd_buffer_size affecting GSSAPI SASL + initial response, raised buffer size + Patch adjusting connection_max_messages wait-DB usage +Oliver Fleischmann Patches fixing compilation in older compilers +Julian Gilbey Helped improve userforward local_part_suffix docs +Richard Godbee Patch fixing usage fprintf +Steve Haslam Maintained dynamically loadable module code out-of-tree +Oliver Heesakkers Debugged dynamic lookup build issues for LOOKUP_foo. +Dmitry Isaikin Spotted short writes to local files + Patch for format string regression +Alun Jones Patch for NULL dereference in localhost_number +Brad Jorsch Patches fixing Resent-*: header handling +John Hall Updated PCRE to 7.4 (when in-tree) +Jeremy Harris Patch to log authentication information in reject log + Reported a ${extract error message typo +Jakob Hirsch Patch implementing freeze_signal on pipe transports + Suggested X-Envelope-Sender: for content-scanning + Patch fixing Base64 decode bugs +John Horne Patch adding $av_failed + Patch escaping log text after lookup expansion defer + Documentation fixes + Pointed out ClamAV ExtendedDetectionInfo compat issue +Regid Ichira Documentation fixes +Andreas M. Kirchwitz Let /dev/null have normal permissions (4.73 fallout) +J. Nick Koston Patch adding force_command pipe transport option +Roberto Lima Patch letting exicyclog rotate paniclog +Todd Lyons Patch handling TAB in MAIL arguments +Christof Meerwald Provided insight & suggested patch for GnuTLS update +Andreas Metzler Patch upgrading PolarSSL (DKIM) + Reported delivery logging problems (4.73 fallout) + Patch to build without WITH_CONTENT_SCAN + Patches fixing docs for max_rcpts, relay hosts/domains + Documentation fixes +Kirill Miazine Multiple patches improving Dovecot authenticator +Robert Millan Wrote SPF Best Guess support +Marcin Mirosław Running static analysis tools for us, catching issues +Dirk Mueller Patch extending use of our printf() compiler checking +Andrey Oktyabrski Patch fixing wide character breakage in rfc2047 coding + Patch keeping SQL errors from being returned over SMTP +Phil Pennock Patch adding gnutls_compat_mode + Patches adding bool{} and later bool_lax{} + Patch for TLS library version reporting build/runtime + Patch letting EXPN work under TLS + More patches built up & applied when became maintainer +Mark Daniel Reidel Patch adding f-protd malware scanner support +Steven A Reisman Pointed out ${eval:x % 0} SIGFPE +Todd Rinaldo Patch fixing transport filter timeout +Dan Rosenberg Security notification & patch for hardlink attack on + sticky mail directory + Security notification of race condition in MBX locking +Jay Rouman Kept our copyright claim in the 21st century, not 11th + Drew attention to SSL docs and epoch issue on 32bit +Heiko Schlittermann Patch making maildir_use_size_file expand + Patch fixing maildir quota file races + Patch fixing make parallelisation + Updates to eximstats, exiwhat +Janne Snabb TLS extensive debugging & failure root cause analysis + Added SPF record type support to dnsdb lookup +Jan Srzednicki Patch improving Dovecot authenticator + Reported crash in Dovecot authenticator +Samuel Thibault Patch fixing IPv6 interface address detection on Hurd +Martin Tscholak Reported issue with TLS anonymous ciphersuites +Stephen Usher Patch fixing use of Oracle's LDAP libraries on Solaris +Holger Weiß Patch leting ${run} return more data than OS pipe + buffer size +Moritz Wilhelmy Pointed out PCRE_PRERELEASE glitch +Alain Williams Patch supporting MySQL stored procedures +Mark Zealey Patch updating $message_linecount for maildir_tag + Patch improving spamd server selection + Patch to allow multiple TCP clamd servers + + +Packagers +--------- +Mark Baker Debian, through Exim 3 +Hilko Bengen Debian, Exim 4, current(*) maintenance +Tim Cutts Debian, initial packaging +Marc Haber Debian, Exim 4, current(*) maintenance +Steve Haslam Debian, Exim 4 +Andreas Metzler Debian, current(*) maintenance +Christian Perrier Debian, current(*) maintenance + +(*) Current as of our last information as of release: Exim 4.82 + + +# vim: set fileencoding=utf-8 expandtab : diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..6f8fd3b --- /dev/null +++ b/CHANGES @@ -0,0 +1,10 @@ +Change Information for Exim +--------------------------- + +Complete lists of all changes to the code, including bug fixes, are listed in +doc/ChangeLog, and documentation for changes that have not yet made it +into the manual is available in doc/NewStuff. The ftp site has a directory +called ChangeLogs which contains individual ChangeLog and NewStuff files for +each separate release. + +**** diff --git a/CONTRIBUTING b/CONTRIBUTING new file mode 100644 index 0000000..a5f7809 --- /dev/null +++ b/CONTRIBUTING @@ -0,0 +1,56 @@ +CONTRIBUTING TO EXIM +==================== + +Exim is an open-source project licensed under the GNU General Public License. +At time of writing, all the developers work on Exim on a volunteer basis. +We welcome patches and contributions. There is no copyright assignment +policy; if you offer a patch, it is assumed to be under the GPL, of whichever +version the main developers see fit to use. + +Mistakes or inadequacies in the documentation are treated as bugs. The main +documentation is called "The Exim Specification" for a reason. So if you +can't code there are still places where your help will be very appreciated. + +General discussion, requests for help, and initial "is this a bug?" questions +go to . Many suspected bugs turn out to not be bugs, so +asking first is appreciated. + +Our main website is at http://www.exim.org/ and contains links to our wiki, +where many frequent setups are walked through. You will also find our +bug-tracking system linked there. + +Development takes place in part on exim-users, when bugs or missing features +are spotted based on feedback from people actually using the product. In +large part, discussion takes place on . While you can use +the bug-tracking system, everyone working on Exim, a mail transfer agent, is +comfortable dealing with just email too, so you can use whichever you're most +comfortable with. + +If you have an idea for a new feature, please do raise it on exim-users first. + +Our code is maintained in a Git repository. The master repository, together +with some others, can be found on http://git.exim.org/ and we welcome patches, +whether of documentation or of code. If you have a request for a new feature +and can accompany it with working code, then it stands a much greater chance +of being incorporated in a timely manner. + +If you're planning on working on a major new feature or redesign, please do +talk to us first. + +We do not have a formal code-review process, but posted patches are subject to +being reworked before being pulled in, or requests for modification made; +we're a small enough pool of developers that we rely on the good judgement and +discretion of the committer rather than formal process. + +We prefer new features to be accompanied by documentation patches, but if no +new documentation is provided, we can write it and, in the process, perhaps +uncover issues to work over with you. Note that the PDF form of the +documentation is faster to build than the TXT form. + +We do have a test harness and appreciate it if new features can be accompanied +by new tests; if this is awkward for you, please do include sufficient +description to allow someone else to write the test. + + +-The Exim Maintainers + July 7th, 2010 diff --git a/LICENCE b/LICENCE new file mode 100644 index 0000000..31d076d --- /dev/null +++ b/LICENCE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/LICENSE.opendmarc b/LICENSE.opendmarc new file mode 100644 index 0000000..e2ba06b --- /dev/null +++ b/LICENSE.opendmarc @@ -0,0 +1,29 @@ +Copyright (c) 2009, 2010, 2012, The Trusted Domain Project. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of The Trusted Domain Project nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +Portions of this project are also covered by the Sendmail Open Source +License, available in this distribution in the file "LICENSE.Sendmail". +See the copyright notice(s) in each file to determine whether or not it is +covered by both licenses. + +THIS SOFTWARE IS PROVIDED BY THE OPENDKIM PROJECT ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE OPENDKIM PROJECT BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..99f4ab3 --- /dev/null +++ b/Makefile @@ -0,0 +1,101 @@ +# Top-level makefile for Exim; handles creating a build directory with +# appropriate links, and then creating and running the main makefile in that +# directory. + +# Copyright (c) University of Cambridge, 1995 - 2014 +# See the file NOTICE for conditions of use and distribution. + +# IRIX make uses the shell that is in the SHELL variable, which often defaults +# to csh, so put this in to make it use the Bourne shell. In systems where +# /bin/sh is not a Bourne-compatible shell, this line will have to be edited, +# or "make" must be called with a different SHELL= setting. + +SHELL=/bin/sh +RM_COMMAND=/bin/rm + +# If a build name has not been specified by running this make file via a +# command of the form "make build=xxxx", then determine the name of the +# operating system and the machine architecture and use that. This does not +# provide an override for the OS type and architecture type; they still have +# to be used for the OS-specific files. To override them, you can set the +# shell variables OSTYPE and ARCHTYPE when running make. + +buildname=$${build:-`$(SHELL) scripts/os-type`-`$(SHELL) scripts/arch-type`} + +# The default target checks for the existence of Local/Makefile, that the main +# makefile is built and up-to-date, and then it runs it. + +all: Local/Makefile configure + @cd build-$(buildname); $(MAKE) SHELL=$(SHELL) $(MFLAGS) + +Local/Makefile: + @echo "" + @echo "*** Please create Local/Makefile by copying src/EDITME and making" + @echo "*** appropriate changes for your site." + @echo "" + @test ! -d Local && mkdir Local + @false + +# This is separated off so that "make build-directory" can be obeyed on +# its own if necessary. + +build-directory: + @builddir=build-$(buildname); \ + case "$$builddir" in *UnKnown*) exit 1;; esac; \ + $(SHELL) -c "test -d $$builddir -a -r $$builddir/version.c || \ + (mkdir $$builddir; cd $$builddir; $(SHELL) ../scripts/MakeLinks)"; + +checks: + $(SHELL) scripts/source_checks + +# The "configure" target ensures that the build directory exists, then arranges +# to build the main makefile from inside the build directory, by calling the +# Configure-Makefile script. This does its own dependency checking because of +# the optional files. + +configure: checks build-directory + @cd build-$(buildname); \ + build=$(build) $(SHELL) ../scripts/Configure-Makefile + +# The "makefile" target forces a rebuild of the makefile (as opposed to +# "configure", which doesn't force it). + +makefile: build-directory + @cd build-$(buildname); $(RM_COMMAND) -f Makefile; \ + build=$(build) $(SHELL) ../scripts/Configure-Makefile + +# The installation commands are kept in a separate script, which expects +# to be run from inside the build directory. + +install: all + @cd build-$(buildname); \ + build=$(build) $(SHELL) ../scripts/exim_install $(INSTALL_ARG) + +# Tidy-up targets + +clean:; @echo ""; echo '*** "make clean" just removes all .o and .a files' + @echo '*** Use "make makefile" to force a rebuild of the makefile' + @echo "" + cd build-$(buildname); \ + $(RM_COMMAND) -f *.o lookups/*.o lookups/*.a auths/*.o auths/*.a \ + routers/*.o routers/*.a transports/*.o transports/*.a \ + pdkim/*.o pdkim/*.a + +clean_exim:; cd build-$(buildname); \ + $(RM_COMMAND) -f *.o lookups/*.o lookups/*.a auths/*.o auths/*.a \ + routers/*.o routers/*.a transports/*.o transports/*.a lookups/*.so + +distclean:; $(RM_COMMAND) -rf build-* cscope* + +cscope.files: FRC + echo "-q" > $@ + echo "-p3" >> $@ + find src Local OS -name "*.[cshyl]" -print \ + -o -name "os.h*" -print \ + -o -name "*akefile*" -print \ + -o -name EDITME -print >> $@ + ls OS/* >> $@ + +FRC: + +# End of top-level makefile diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..b4a5c40 --- /dev/null +++ b/NOTICE @@ -0,0 +1,152 @@ +THE EXIM MAIL TRANSFER AGENT +---------------------------- + +Copyright (c) 2004 University of Cambridge + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +In addition, for the avoidance of any doubt, permission is granted to +link this program with OpenSSL or any other library package and to +(re)distribute the binaries produced as the result of such linking. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + +UNSOLICITED EMAIL +----------------- + +The use, supply or promotion of Exim for the purpose of sending bulk, +unsolicited electronic mail is incompatible with the basic aims of the program, +which revolve around the free provision of a service that enhances the quality +of personal communications. The author of Exim regards indiscriminate +mass-mailing as an antisocial, irresponsible abuse of the Internet. + + +INCORPORATED CODE +----------------- + +A number of pieces of external code are included in the Exim distribution. + + . Support for the cdb (Constant DataBase) lookup method is provided by code + contributed by Nigel Metheringham of Planet Online Ltd. which contains + the following statements: + _________________________________________________________________________ + + Copyright (c) 1998 Nigel Metheringham, Planet Online Ltd + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This code implements Dan Bernstein's Constant DataBase (cdb) spec. + Information, the spec and sample code for cdb can be obtained from + http://www.pobox.com/~djb/cdb.html. This implementation borrows some code + from Dan Bernstein's implementation (which has no license restrictions + applied to it). + _________________________________________________________________________ + + The implementation is completely contained within the code of Exim. It + does not link against an external cdb library. + + . Client support for Microsoft's "Secure Password Authentication" is pro- + vided by code contributed by Marc Prud'hommeaux. Server support was + contributed by Tom Kistner. This includes code taken from the Samba + project, which is released under the Gnu GPL. + + + . Support for calling the Cyrus "pwcheck" and "saslauthd" daemons is + provided by code taken from the Cyrus-SASL library and adapted by + Alexander S. Sabourenkov. The permission notice appears below, in + accordance with the conditions expressed therein. + + _________________________________________________________________________ + + Copyright (c) 2001 Carnegie Mellon University. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The name 'Carnegie Mellon University' must not be used to endorse or + promote products derived from this software without prior written + permission. For permission or any other legal details, please + contact + + Office of Technology Transfer + Carnegie Mellon University + 5000 Forbes Avenue + Pittsburgh, PA 15213-3890 + (412) 268-4387, fax: (412) 268-7395 + tech-transfer@andrew.cmu.edu + + 4. Redistributions of any form whatsoever must retain the following + acknowledgment: + This product includes software developed by Computing Services at + Carnegie Mellon University (http://www.cmu.edu/computing/). + + CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE FOR ANY + SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + _________________________________________________________________________ + + + . The Exim Monitor program, which is an X-Window application, includes + modified versions of the Athena StripChart and TextPop widgets. This code + is copyright by DEC and MIT, and their permission notice appears below, + in accordance with the conditions expressed therein. + + _________________________________________________________________________ + + Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, + Massachusetts, and the Massachusetts Institute of Technology, Cambridge, + Massachusetts. + + All Rights Reserved + + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose and without fee is hereby granted, provided + that the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting documen- + tation, and that the names of Digital or MIT not be used in advertising + or publicity pertaining to distribution of the software without specific, + written prior permission. + + DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + SOFTWARE. + _________________________________________________________________________ + + + . Some of the code to support the use of maildirsize files for maildir + deliveries is taken from the Courier Imapd source code. This code is + released under the GPL. + _________________________________________________________________________ + +-- +Philip Hazel University of Cambridge Computing Service, diff --git a/OS/Makefile-AIX b/OS/Makefile-AIX new file mode 100644 index 0000000..fc32aa2 --- /dev/null +++ b/OS/Makefile-AIX @@ -0,0 +1,28 @@ +# Exim: OS-specific make file for AIX +# Written by Nick Waterman (nick@cimio.co.uk) +# Modified by PH following a message from Mike Meredith + +# Note that the output of uname -m is probably not what Philip expected, +# so you might end up with more build-AIX-random_number directories than +# you expected if you have too many AIX boxes, but it seems to work... I +# blame IBM. + +# Note that nowadays you have to pay extra for a cc compiler with AIX! + +CC=gcc + +# This needs to be in here rather than os.h-AIX because of regexp stuff. +# basically strchr is a #define, which means "extern char *strchr()" +# ruins things. __STR31__ seems to get around this by magic. The AIX +# include files are quite a confusing maze. +# Mike M says this is not necessary any more; possibly this is related to +# using gcc. Commented out by PH. +#CFLAGS = -D__STR31__ + +CFLAGS = -mcpu=power4 -maix64 -O3 + +# Needed for vfork() and vfork() only? + +LIBS = -lbsd -lm + +# End diff --git a/OS/Makefile-BSDI b/OS/Makefile-BSDI new file mode 100644 index 0000000..d56aa9b --- /dev/null +++ b/OS/Makefile-BSDI @@ -0,0 +1,21 @@ +# Exim: OS-specific make file for BSDI aka BSD/OS. Its antique link editor +# cannot handle the TextPop overriding. + +CFLAGS=-O +CHOWN_COMMAND=/usr/sbin/chown + +HAVE_SA_LEN=YES + +X11=/usr/X11 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +LIBS_EXIMON=-lSM -lICE -lipc -lm +EXIMON_TEXTPOP= + +EXIWHAT_PS_ARG=-ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_KILL_SIGNAL=-USR1 + +# End diff --git a/OS/Makefile-Base b/OS/Makefile-Base new file mode 100644 index 0000000..87a8037 --- /dev/null +++ b/OS/Makefile-Base @@ -0,0 +1,756 @@ +# This file is the basis of the main makefile for Exim and friends. The +# makefile at the top level arranges to build the main makefile by calling +# scripts/Configure-Makefile from within the build directory. This +# concatentates the configuration settings from Local/Makefile and other, +# optional, Local/* files at the front of this file, to create Makefile in the +# build directory. + +SHELL = $(MAKE_SHELL) +SCRIPTS = ../scripts +EDITME = ../Local/Makefile +EXIMON_EDITME = ../Local/eximon.conf + +# The compiler used for linking is normally the same as the compiler used for +# compiling. However, by giving it a different name, we can override it from +# the command line, and this is helpful for certain types of testing. + +LNCC = $(CC) + +# The compile commands can be very long. To make the output look better, +# they are not normally echoed in full. To get full echoing, the caller +# must set FULLECHO='' on the command line and call make with -e. We default +# FULLECHO to '@' to suppress the full echo. Then define an abbreviation. + +FULLECHO = @ +FE = $(FULLECHO) + +# The default target double-checks the existence of $(EDITME) and then arranges +# to touch it if it exists and any of the optional configuration files, which +# depend on the os or the architecture, have been altered. The same sub-target +# does the same thing for the eximon configuration file if it exists. Then +# there is a check that the Makefile (the one built from this file) is +# up-to-date. Then the os-specific source files and the C configuration file +# are set up, and finally it goes to the main Exim target. + +all: allexim +config: $(EDITME) checklocalmake Makefile os.h os.c config.h version.h + +checklocalmake: + @if $(SHELL) $(SCRIPTS)/newer $(EDITME)-$(OSTYPE) $(EDITME) || \ + $(SHELL) $(SCRIPTS)/newer $(EDITME)-$(ARCHTYPE) $(EDITME) || \ + $(SHELL) $(SCRIPTS)/newer $(EDITME)-$(OSTYPE)-$(ARCHTYPE) $(EDITME); \ + then \ + touch $(EDITME); \ + fi + @if $(SHELL) $(SCRIPTS)/newer $(EXIMON_EDITME)-$(OSTYPE) $(EXIMON_EDITME) || \ + $(SHELL) $(SCRIPTS)/newer $(EXIMON_EDITME)-$(ARCHTYPE) $(EXIMON_EDITME) || \ + $(SHELL) $(SCRIPTS)/newer $(EXIMON_EDITME)-$(OSTYPE)-$(ARCHTYPE) $(EXIMON_EDITME); \ + then \ + if [ -f $(EXIMON_EDITME) ]; then touch $(EXIMON_EDITME); fi \ + fi + +$(EDITME): + @echo " " + @echo "*** Please create Local/Makefile by copying src/EDITME and making" + @echo "*** appropriate changes for your site." + @echo " " + @false + +$(EXIMON_EDITME): + @echo " " + @echo "*** Please create Local/eximon.conf by copying exim_monitor/EDITME and making" + @echo "*** appropriate changes for your site." + @echo " " + @test ! -d ../Local && mkdir ../Local + @false + +# Check that the local Makefile is up-to-date + +Makefile: ../OS/Makefile-Base ../OS/Makefile-Default \ + $(SCRIPTS)/Configure $(SCRIPTS)/Configure-Makefile $(EDITME) + @echo " " + @echo "*** Makefile needs rebuilding" + @echo "*** Please run \"make makefile\" at top level" + @echo " " + @false + +# Build (link) the os.h file + +os.h: + $(SHELL) $(SCRIPTS)/Configure-os.h + +# Build the os.c file + +os.c: ../src/os.c + $(SHELL) $(SCRIPTS)/Configure-os.c + +# Build the config.h file. + +config.h: Makefile buildconfig ../src/config.h.defaults $(EDITME) + $(SHELL) $(SCRIPTS)/Configure-config.h "$(MAKE)" + + +# This target is recognized specially by GNU make. It records those targets +# that do not correspond to files that are being built and which should +# therefore always be run, even if the files exist. This shouldn't in fact be a +# problem, but it does no harm. Other make programs will just ignore this. + +.PHONY: all config allexim buildauths buildlookups buildpdkim buildrouters \ + buildtransports checklocalmake clean + + +# This is the real default target for all the various exim binaries and +# scripts, once the configuring stuff is done. + +allexim: $(EXIM_MONITOR) exicyclog exinext exiwhat \ + exigrep eximstats exipick exiqgrep exiqsumm \ + transport-filter.pl convert4r3 convert4r4 \ + exim_checkaccess \ + exim_dbmbuild exim_dumpdb exim_fixdb exim_tidydb exim_lock \ + exim + + +# Targets for special-purpose configuration header builders +buildconfig: buildconfig.c + @echo "$(CC) buildconfig.c" + $(FE)$(CC) $(CFLAGS) $(INCLUDE) -o buildconfig buildconfig.c $(LIBS) + + +# Target for the exicyclog utility script +exicyclog: config ../src/exicyclog.src + @rm -f exicyclog + @sed \ + -e "s?PROCESSED_FLAG?This file has been so processed.?"\ + -e "/^# /p" \ + -e "/^# /d" \ + -e "s?CONFIGURE_FILE_USE_NODE?$(CONFIGURE_FILE_USE_NODE)?" \ + -e "s?CONFIGURE_FILE_USE_EUID?$(CONFIGURE_FILE_USE_EUID)?" \ + -e "s?CONFIGURE_FILE?$(CONFIGURE_FILE)?" \ + -e "s?BIN_DIRECTORY?$(BIN_DIRECTORY)?" \ + -e "s?EXICYCLOG_MAX?$(EXICYCLOG_MAX)?" \ + -e "s?COMPRESS_COMMAND?$(COMPRESS_COMMAND)?" \ + -e "s?COMPRESS_SUFFIX?$(COMPRESS_SUFFIX)?" \ + -e "s?CHGRP_COMMAND?$(CHGRP_COMMAND)?" \ + -e "s?CHMOD_COMMAND?$(CHMOD_COMMAND)?" \ + -e "s?CHOWN_COMMAND?$(CHOWN_COMMAND)?" \ + -e "s?MV_COMMAND?$(MV_COMMAND)?" \ + -e "s?RM_COMMAND?$(RM_COMMAND)?" \ + -e "s?TOUCH_COMMAND?$(TOUCH_COMMAND)?" \ + ../src/exicyclog.src > exicyclog-t + @mv exicyclog-t exicyclog + @chmod a+x exicyclog + @echo ">>> exicyclog script built" + +# Target for the exinext utility script +exinext: config ../src/exinext.src + @rm -f exinext + @sed \ + -e "s?PROCESSED_FLAG?This file has been so processed.?"\ + -e "/^# /p" \ + -e "/^# /d" \ + -e "s?CONFIGURE_FILE_USE_NODE?$(CONFIGURE_FILE_USE_NODE)?" \ + -e "s?CONFIGURE_FILE?$(CONFIGURE_FILE)?" \ + -e "s?BIN_DIRECTORY?$(BIN_DIRECTORY)?" \ + ../src/exinext.src > exinext-t + @mv exinext-t exinext + @chmod a+x exinext + @echo ">>> exinext script built" + +# Target for the exiwhat utility script +exiwhat: config ../src/exiwhat.src + @rm -f exiwhat + @sed \ + -e "s?PROCESSED_FLAG?This file has been so processed.?"\ + -e "/^# /p" \ + -e "/^# /d" \ + -e "s?CONFIGURE_FILE_USE_NODE?$(CONFIGURE_FILE_USE_NODE)?" \ + -e "s?CONFIGURE_FILE?$(CONFIGURE_FILE)?" \ + -e "s?BIN_DIRECTORY?$(BIN_DIRECTORY)?" \ + -e "s?EXIWHAT_PS_CMD?$(EXIWHAT_PS_CMD)?" \ + -e "s?EXIWHAT_PS_ARG?$(EXIWHAT_PS_ARG)?" \ + -e "s?EXIWHAT_KILL_SIGNAL?$(EXIWHAT_KILL_SIGNAL)?" \ + -e "s?EXIWHAT_EGREP_ARG?$(EXIWHAT_EGREP_ARG)?" \ + -e "s?EXIWHAT_MULTIKILL_CMD?$(EXIWHAT_MULTIKILL_CMD)?" \ + -e "s?EXIWHAT_MULTIKILL_ARG?$(EXIWHAT_MULTIKILL_ARG)?" \ + ../src/exiwhat.src > exiwhat-t + @mv exiwhat-t exiwhat + @chmod a+x exiwhat + @echo ">>> exiwhat script built" + +# Target for the exim_checkaccess utility script +exim_checkaccess: config ../src/exim_checkaccess.src + @rm -f exim_checkaccess + @sed \ + -e "s?PROCESSED_FLAG?This file has been so processed.?"\ + -e "/^# /p" \ + -e "/^# /d" \ + -e "s?CONFIGURE_FILE_USE_NODE?$(CONFIGURE_FILE_USE_NODE)?" \ + -e "s?CONFIGURE_FILE?$(CONFIGURE_FILE)?" \ + -e "s?BIN_DIRECTORY?$(BIN_DIRECTORY)?" \ + -e "s?PERL_COMMAND?$(PERL_COMMAND)?" \ + ../src/exim_checkaccess.src > exim_checkaccess-t + @mv exim_checkaccess-t exim_checkaccess + @chmod a+x exim_checkaccess + @echo ">>> exim_checkaccess script built"; echo "" + +# Target for the Exim monitor start-up script +eximon: config ../src/eximon.src ../OS/eximon.conf-Default \ + ../Local/eximon.conf + @rm -f eximon + $(SHELL) $(SCRIPTS)/Configure-eximon + @sed \ + -e "s?PROCESSED_FLAG?This file has been so processed.?"\ + -e "/^# /p" \ + -e "/^# /d" \ + -e "s?CONFIGURE_FILE_USE_NODE?$(CONFIGURE_FILE_USE_NODE)?" \ + -e "s?CONFIGURE_FILE?$(CONFIGURE_FILE)?" \ + -e "s?BIN_DIRECTORY?$(BIN_DIRECTORY)?" \ + -e "s?BASENAME_COMMAND?$(BASENAME_COMMAND)?" \ + -e "s?HOSTNAME_COMMAND?$(HOSTNAME_COMMAND)?" \ + -e "s?X11_LD_LIBRARY?$(X11_LD_LIB)?" \ + ../src/eximon.src >> eximon + @echo ">>> eximon script built"; echo "" + +# Targets for utilities; these are all Perl scripts that have to get the +# location of Perl put in them. A few need other things as well. + +exigrep: Makefile ../src/exigrep.src + @rm -f exigrep + @sed \ + -e "s?PROCESSED_FLAG?This file has been so processed.?"\ + -e "/^# /p" \ + -e "/^# /d" \ + -e "s?PERL_COMMAND?$(PERL_COMMAND)?" \ + -e "s?ZCAT_COMMAND?$(ZCAT_COMMAND)?" \ + -e "s?COMPRESS_SUFFIX?$(COMPRESS_SUFFIX)?" \ + ../src/exigrep.src > exigrep-t + @mv exigrep-t exigrep + @chmod a+x exigrep + @echo ">>> exigrep script built" + +eximstats: Makefile ../src/eximstats.src + @rm -f eximstats + @sed \ + -e "s?PERL_COMMAND?$(PERL_COMMAND)?" \ + ../src/eximstats.src > eximstats-t + @mv eximstats-t eximstats + @chmod a+x eximstats + @echo ">>> eximstats script built" + +exiqgrep: Makefile ../src/exiqgrep.src + @rm -f exiqgrep + @sed \ + -e "s?PROCESSED_FLAG?This file has been so processed.?"\ + -e "/^# /p" \ + -e "/^# /d" \ + -e "s?BIN_DIRECTORY?$(BIN_DIRECTORY)?" \ + -e "s?PERL_COMMAND?$(PERL_COMMAND)?" \ + ../src/exiqgrep.src > exiqgrep-t + @mv exiqgrep-t exiqgrep + @chmod a+x exiqgrep + @echo ">>> exiqgrep script built" + +exiqsumm: Makefile ../src/exiqsumm.src + @rm -f exiqsumm + @sed -e "s?PERL_COMMAND?$(PERL_COMMAND)?" \ + ../src/exiqsumm.src > exiqsumm-t + @mv exiqsumm-t exiqsumm + @chmod a+x exiqsumm + @echo ">>> exiqsumm script built" + +exipick: Makefile ../src/exipick.src + @rm -f exipick + @sed -e "s?PERL_COMMAND?$(PERL_COMMAND)?" \ + -e "s?SPOOL_DIRECTORY?$(SPOOL_DIRECTORY)?" \ + ../src/exipick.src > exipick-t + @mv exipick-t exipick + @chmod a+x exipick + @echo ">>> exipick script built" + +transport-filter.pl: Makefile ../src/transport-filter.src + @rm -f transport-filter.pl + @sed -e "s?PERL_COMMAND?$(PERL_COMMAND)?" \ + ../src/transport-filter.src > transport-filter.pl-t + @mv transport-filter.pl-t transport-filter.pl + @chmod a+x transport-filter.pl + @echo ">>> transport-filter.pl script built" + +convert4r3: Makefile ../src/convert4r3.src + @rm -f convert4r3 + @sed -e "s?PERL_COMMAND?$(PERL_COMMAND)?" \ + ../src/convert4r3.src > convert4r3-t + @mv convert4r3-t convert4r3 + @chmod a+x convert4r3 + @echo ">>> convert4r3 script built" + +convert4r4: Makefile ../src/convert4r4.src + @rm -f convert4r4 + @sed -e "s?PERL_COMMAND?$(PERL_COMMAND)?" \ + ../src/convert4r4.src > convert4r4-t + @mv convert4r4-t convert4r4 + @chmod a+x convert4r4 + @echo ">>> convert4r4 script built" + + +# These are objects of optional features. They are always compiled, but +# if the corresponding #defines are not set, they wind up empty and +# are thrown away by the linker. + +OBJ_WITH_CONTENT_SCAN = malware.o mime.o regex.o spam.o spool_mbox.o +OBJ_WITH_OLD_DEMIME = demime.o +OBJ_EXPERIMENTAL = bmi_spam.o spf.o srs.o dcc.o dmarc.o + +# Targets for final binaries; the main one has a build number which is +# updated each time. We don't bother with that for the auxiliaries. + +OBJ_LOOKUPS = lookups/lf_quote.o lookups/lf_check_file.o lookups/lf_sqlperform.o + +OBJ_EXIM = acl.o child.o crypt16.o daemon.o dbfn.o debug.o deliver.o \ + directory.o dns.o drtables.o enq.o exim.o expand.o filter.o \ + filtertest.o globals.o dkim.o \ + header.o host.o ip.o log.o lss.o match.o moan.o \ + os.o parse.o queue.o \ + rda.o readconf.o receive.o retry.o rewrite.o rfc2047.o \ + route.o search.o sieve.o smtp_in.o smtp_out.o spool_in.o spool_out.o \ + std-crypto.o store.o string.o tls.o tod.o transport.o tree.o verify.o \ + $(OBJ_LOOKUPS) \ + local_scan.o $(EXIM_PERL) $(OBJ_WITH_CONTENT_SCAN) \ + $(OBJ_WITH_OLD_DEMIME) $(OBJ_EXPERIMENTAL) + +exim: buildlookups buildauths pdkim/pdkim.a \ + buildrouters buildtransports \ + $(OBJ_EXIM) version.o + @echo "$(LNCC) -o exim" + $(FE)$(PURIFY) $(LNCC) -o exim $(LFLAGS) $(OBJ_EXIM) version.o \ + routers/routers.a transports/transports.a lookups/lookups.a \ + auths/auths.a pdkim/pdkim.a \ + $(LIBRESOLV) $(LIBS) $(LIBS_EXIM) $(IPV6_LIBS) $(EXTRALIBS) \ + $(EXTRALIBS_EXIM) $(DBMLIB) $(LOOKUP_LIBS) $(AUTH_LIBS) \ + $(PERL_LIBS) $(TLS_LIBS) $(PCRE_LIBS) $(LDFLAGS) + @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ + echo $(STRIP_COMMAND) exim; \ + $(STRIP_COMMAND) exim; \ + fi + $(EXIM_CHMOD) + @echo " " + @echo ">>> exim binary built" + @echo " " + +# The utility for dumping the contents of an exim database + +OBJ_DUMPDB = exim_dumpdb.o util-os.o util-store.o + +exim_dumpdb: $(OBJ_DUMPDB) + @echo "$(LNCC) -o exim_dumpdb" + $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_dumpdb $(LFLAGS) $(OBJ_DUMPDB) \ + $(LIBS) $(EXTRALIBS) $(DBMLIB) + @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ + echo $(STRIP_COMMAND) exim_dumpdb; \ + $(STRIP_COMMAND) exim_dumpdb; \ + fi + @echo ">>> exim_dumpdb utility built" + @echo " " + +# The utility for interrogating/fixing the contents of an exim database + +OBJ_FIXDB = exim_fixdb.o util-os.o util-store.o + +exim_fixdb: $(OBJ_FIXDB) buildauths + @echo "$(LNCC) -o exim_fixdb" + $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_fixdb $(LFLAGS) $(OBJ_FIXDB) \ + auths/auths.a $(LIBS) $(EXTRALIBS) $(DBMLIB) + @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ + echo $(STRIP_COMMAND) exim_fixdb; \ + $(STRIP_COMMAND) exim_fixdb; \ + fi + @echo ">>> exim_fixdb utility built" + @echo " " + +# The utility for tidying the contents of an exim database + +OBJ_TIDYDB = exim_tidydb.o util-os.o util-store.o + +exim_tidydb: $(OBJ_TIDYDB) + @echo "$(LNCC) -o exim_tidydb" + $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_tidydb $(LFLAGS) $(OBJ_TIDYDB) \ + $(LIBS) $(EXTRALIBS) $(DBMLIB) + @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ + echo $(STRIP_COMMAND) exim_tidydb; \ + $(STRIP_COMMAND) exim_tidydb; \ + fi + @echo ">>> exim_tidydb utility built" + @echo " " + +# The utility for building dbm files + +exim_dbmbuild: exim_dbmbuild.o + @echo "$(LNCC) -o exim_dbmbuild" + $(FE)$(LNCC) -o exim_dbmbuild $(LFLAGS) exim_dbmbuild.o \ + $(LIBS) $(EXTRALIBS) $(DBMLIB) + @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ + echo $(STRIP_COMMAND) exim_dbmbuild; \ + $(STRIP_COMMAND) exim_dbmbuild; \ + fi + @echo ">>> exim_dbmbuild utility built" + @echo " " + +# The utility for locking a mailbox while messing around with it + +exim_lock: exim_lock.c + @echo "$(CC) exim_lock.c" + $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) exim_lock.c + @echo "$(LNCC) -o exim_lock" + $(FE)$(LNCC) -o exim_lock $(LFLAGS) exim_lock.o \ + $(LIBS) $(EXTRALIBS) + @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ + echo $(STRIP_COMMAND) exim_lock; \ + $(STRIP_COMMAND) exim_lock; \ + fi + @echo ">>> exim_lock utility built" + @echo " " + +# The X-based Exim monitor program's binary part. There's a macro for cutting +# out the modified TextPop module, because some antique link editors cannot +# handle the fact that it is redefining things that are found later in the +# Xaw library. + +# Object modules that are the unique Eximon modules + +MONBIN = em_StripChart.o $(EXIMON_TEXTPOP) em_globals.o em_init.o \ + em_log.o em_main.o em_menu.o em_queue.o em_strip.o \ + em_text.o em_xs.o + +# The complete modules list also includes some specially compiled versions of +# code from the main Exim source tree. + +OBJ_MONBIN = util-spool_in.o util-store.o util-string.o tod.o tree.o $(MONBIN) + +eximon.bin: $(EXIMON_EDITME) eximon $(OBJ_MONBIN) \ + ../exim_monitor/em_version.c + @echo "$(CC) exim_monitor/em_version.c" + $(FE)$(CC) -o em_version.o -c \ + $(CFLAGS) $(XINCLUDE) -I. ../exim_monitor/em_version.c + @echo "$(LNCC) -o eximon.bin" + $(FE)$(PURIFY) $(LNCC) -o eximon.bin em_version.o $(LFLAGS) $(XLFLAGS) \ + $(OBJ_MONBIN) -lXaw -lXmu -lXt -lXext -lX11 $(PCRE_LIBS) \ + $(LIBS) $(LIBS_EXIMON) $(EXTRALIBS) $(EXTRALIBS_EXIMON) -lc + @if [ x"$(STRIP_COMMAND)" != x"" ]; then \ + echo $(STRIP_COMMAND) eximon.bin; \ + $(STRIP_COMMAND) eximon.bin; \ + fi + @echo ">>> exim monitor binary built" + @echo " " + + +# Compile step for most of the exim modules. HDRS is a list of headers +# which cause everthing to be rebuilt. PHDRS is the same, for the use +# of routers, transports, and authenticators. I can't find a way of doing this +# in one. This list is overkill, but it doesn't really take much time to +# rebuild Exim on a modern computer. + +HDRS = config.h dbfunctions.h dbstuff.h exim.h functions.h globals.h local_scan.h macros.h mytypes.h structs.h +PHDRS = ../config.h ../dbfunctions.h ../dbstuff.h ../exim.h ../functions.h ../globals.h ../local_scan.h ../macros.h ../mytypes.h ../structs.h + +.SUFFIXES: .o .c +.c.o:; @echo "$(CC) $*.c" + $(FE)$(CC) -c $(CFLAGS) -I. $(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE) $*.c + +# Update Exim's version information and build the version object. + +version.h:: + @../scripts/reversion + +cnumber.h: version.h + +version.o: $(HDRS) cnumber.h version.h version.c + +# This is the dummy module for use by test compiles of individual modules. It +# contains functions such as log_write() that may be called from bits of Exim +# in the tested code. + +dummies.o: dummies.c + +# Compile instructions for perl.o for when EXIM_PERL is set + +perl.o: $(HDRS) perl.c + @echo "$(PERL_CC) perl.c" + $(FE)$(PERL_CC) $(PERL_CCOPTS) $(CFLAGS) $(INCLUDE) -c perl.c + +# Compile instructions for the database utility modules + +exim_dumpdb.o: $(HDRS) exim_dbutil.c + @echo "$(CC) -DEXIM_DUMPDB exim_dbutil.c" + $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) \ + -DCOMPILE_UTILITY \ + -DEXIM_DUMPDB \ + -o exim_dumpdb.o exim_dbutil.c + +exim_fixdb.o: $(HDRS) exim_dbutil.c + @echo "$(CC) -DEXIM_FIXDB exim_dbutil.c" + $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) \ + -DCOMPILE_UTILITY \ + -DEXIM_FIXDB \ + -o exim_fixdb.o exim_dbutil.c + +exim_tidydb.o: $(HDRS) exim_dbutil.c + @echo "$(CC) -DEXIM_TIDYDB exim_dbutil.c" + $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) \ + -DCOMPILE_UTILITY \ + -DEXIM_TIDYDB \ + -o exim_tidydb.o exim_dbutil.c + +# Compile instructions for exim_dbmbuild + +exim_dbmbuild.o: $(HDRS) exim_dbmbuild.c + @echo "$(CC) exim_dbmbuild.c" + $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) -o exim_dbmbuild.o exim_dbmbuild.c + +# Utilities use special versions of some modules - typically with debugging +# calls cut out. + +util-spool_in.o: $(HDRS) spool_in.c + @echo "$(CC) -DCOMPILE_UTILITY spool_in.c" + $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) -DCOMPILE_UTILITY -o util-spool_in.o spool_in.c + +util-store.o: $(HDRS) store.c + @echo "$(CC) -DCOMPILE_UTILITY store.c" + $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) -DCOMPILE_UTILITY -o util-store.o store.c + +util-string.o: $(HDRS) string.c + @echo "$(CC) -DCOMPILE_UTILITY string.c" + $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) -DCOMPILE_UTILITY -o util-string.o string.c + +util-os.o: $(HDRS) os.c + @echo "$(CC) -DCOMPILE_UTILITY os.c" + $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) \ + -DCOMPILE_UTILITY \ + -DOS_LOAD_AVERAGE \ + -DFIND_RUNNING_INTERFACES \ + -o util-os.o os.c + +# The local scan module depends only on its own special header, and is compiled +# from a source whose location is set by configuration. + +local_scan.o: config local_scan.h ../$(LOCAL_SCAN_SOURCE) + @echo "$(CC) local_scan.c" + $(FE)$(CC) -c $(CFLAGS) -I. $(INCLUDE) -o local_scan.o ../$(LOCAL_SCAN_SOURCE) + +# Dependencies for the "ordinary" exim modules + +acl.o: $(HDRS) acl.c +child.o: $(HDRS) child.c +crypt16.o: $(HDRS) crypt16.c +daemon.o: $(HDRS) daemon.c +dbfn.o: $(HDRS) dbfn.c +debug.o: $(HDRS) debug.c +deliver.o: $(HDRS) deliver.c +directory.o: $(HDRS) directory.c +dns.o: $(HDRS) dns.c +enq.o: $(HDRS) enq.c +exim.o: $(HDRS) exim.c +expand.o: $(HDRS) expand.c +filter.o: $(HDRS) filter.c +filtertest.o: $(HDRS) filtertest.c +globals.o: $(HDRS) globals.c +header.o: $(HDRS) header.c +host.o: $(HDRS) host.c +ip.o: $(HDRS) ip.c +log.o: $(HDRS) log.c +lss.o: $(HDRS) lss.c +match.o: $(HDRS) match.c +moan.o: $(HDRS) moan.c +os.o: $(HDRS) os.c +parse.o: $(HDRS) parse.c +queue.o: $(HDRS) queue.c +rda.o: $(HDRS) rda.c +readconf.o: $(HDRS) readconf.c +receive.o: $(HDRS) receive.c +retry.o: $(HDRS) retry.c +rewrite.o: $(HDRS) rewrite.c +rfc2047.o: $(HDRS) rfc2047.c +route.o: $(HDRS) route.c +search.o: $(HDRS) search.c +sieve.o: $(HDRS) sieve.c +smtp_in.o: $(HDRS) smtp_in.c +smtp_out.o: $(HDRS) smtp_out.c +spool_in.o: $(HDRS) spool_in.c +spool_out.o: $(HDRS) spool_out.c +std-crypto.o: $(HDRS) std-crypto.c +store.o: $(HDRS) store.c +string.o: $(HDRS) string.c +tls.o: $(HDRS) tls.c tls-gnu.c tlscert-gnu.c tls-openssl.c tlscert-openssl.c +tod.o: $(HDRS) tod.c +transport.o: $(HDRS) transport.c +tree.o: $(HDRS) tree.c +verify.o: $(HDRS) verify.c +dkim.o: $(HDRS) dkim.c + +# Dependencies for WITH_CONTENT_SCAN modules + +malware.o: $(HDRS) malware.c +mime.o: $(HDRS) mime.c +regex.o: $(HDRS) regex.c +spam.o: $(HDRS) spam.c +spool_mbox.o: $(HDRS) spool_mbox.c + + +# Dependencies for WITH_OLD_DEMIME modules + +demime.o: $(HDRS) demime.c + + +# Dependencies for EXPERIMENTAL_* modules + +bmi_spam.o: $(HDRS) bmi_spam.c +spf.o: $(HDRS) spf.h spf.c +srs.o: $(HDRS) srs.h srs.c +dcc.o: $(HDRS) dcc.h dcc.c +dmarc.o: $(HDRS) dmarc.h dmarc.c + +# The module containing tables of available lookups, routers, auths, and +# transports must be rebuilt if any of them are. However, because the makefiles +# for the drivers are always run, we don't actually put the dependencies here, +# because if we do, some version of "make" (e.g. IRIX) insist on rebuilding +# drtables.o even though the .a files haven't in fact been updated. Instead +# it is arranged that the lower-level makefiles remove drtables.o when they +# rebuild the .a files. + +drtables.o: $(HDRS) drtables.c + +# We depend upon object files built as part of building the lookups library +# When using parallel make, we don't have the dependency to force building +# in the sub-directory unless we force that dependency: + +$(OBJ_LOOKUPS): buildlookups + +# The exim monitor's private modules - the sources live in a private +# subdirectory. The final binary combines the private modules with some +# modules from the main exim binary. + +em_StripChart.o: ../exim_monitor/em_StripChart.c +em_TextPop.o: ../exim_monitor/em_TextPop.c +em_globals.o: ../exim_monitor/em_globals.c ../exim_monitor/em_hdr.h +em_init.o: ../exim_monitor/em_init.c ../exim_monitor/em_hdr.h +em_log.o: ../exim_monitor/em_log.c ../exim_monitor/em_hdr.h +em_main.o: ../exim_monitor/em_main.c ../exim_monitor/em_hdr.h +em_menu.o: ../exim_monitor/em_menu.c ../exim_monitor/em_hdr.h +em_queue.o: ../exim_monitor/em_queue.c ../exim_monitor/em_hdr.h +em_strip.o: ../exim_monitor/em_strip.c ../exim_monitor/em_hdr.h +em_text.o: ../exim_monitor/em_text.c ../exim_monitor/em_hdr.h +em_xs.o: ../exim_monitor/em_xs.c ../exim_monitor/em_hdr.h +em_version.o: ../exim_monitor/em_version.c ../exim_monitor/em_hdr.h +$(MONBIN): $(HDRS) + @echo "$(CC) exim_monitor/`echo $@ | sed 's/o$$/c/'`" + $(FE)$(CC) -o $@ -c $(CFLAGS) -I. -I../exim_monitor $(INCLUDE) $(XINCLUDE) \ + ../exim_monitor/`echo $@ | sed 's/o$$/c/'` + + +# Targets for the various libraries that Exim uses. + +# The lookups library. + +buildlookups: config + @cd lookups && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \ + CFLAGS_DYNAMIC="$(CFLAGS_DYNAMIC)" HDRS="../version.h $(PHDRS)" \ + FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" \ + INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE) $(LOOKUP_INCLUDE)" + @echo " " + +# The routers library. + +buildrouters: config + @cd routers && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \ + FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \ + INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)" + @echo " " + +# The transports library. + +buildtransports: config + @cd transports && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \ + FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \ + INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)" + @echo " " + +# The library of authorization modules + +buildauths: config + @cd auths && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \ + FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \ + INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)" + @echo " " + +# The PDKIM library + +buildpdkim: pdkim/pdkim.a +pdkim/pdkim.a: config + @cd pdkim && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \ + FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \ + INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)" + @echo " " + +# The "clean", "install", and "makefile" targets just pass themselves back to +# the main Exim makefile. These targets will be obeyed only if "make" is obeyed +# for them in the build directory. + +clean install makefile:; cd ..; $(MAKE) $(MFLAGS) build=$(build) $@ + +# Targets for building stand-alone testing programs for basic testing of +# some of the building blocks. These are not integrated with the makefile- +# building targets. If you change something that is going to cause the +# makefile to be rebuilt, you must run "make makefile" before running one +# of these. + +# The testing programs use different versions of some modules - usually +# with bits cut out that are not relevant to the test in hand. For those +# that are used by several tests, we use a different name. + +sa-globals.o: $(HDRS) globals.c + $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -o sa-globals.o globals.c + +sa-os.o: $(HDRS) os.c + $(CC) -c $(CFLAGS) $(INCLUDE) \ + -DFIND_RUNNING_INTERFACES \ + -o sa-os.o os.c + +# These are the test targets themselves + +test_dbfn: config.h dbfn.c dummies.o sa-globals.o sa-os.o store.o \ + string.o tod.o version.o + $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE dbfn.c + $(LNCC) -o test_dbfn $(LFLAGS) dbfn.o \ + dummies.o sa-globals.o sa-os.o store.o string.o \ + tod.o version.o $(LIBS) $(DBMLIB) + rm -f dbfn.o + +test_host: config.h child.c host.c dns.c dummies.c sa-globals.o os.o \ + store.o string.o tod.o tree.o + $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST child.c + $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST host.c + $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST dns.c + $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST dummies.c + $(LNCC) -o test_host $(LFLAGS) \ + host.o child.o dns.o dummies.o sa-globals.o os.o store.o string.o \ + tod.o tree.o $(LIBS) $(LIBRESOLV) + rm -f child.o dummies.o host.o dns.o + +test_os: os.h os.c dummies.o sa-globals.o store.o string.o tod.o + $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE os.c + $(LNCC) -o test_os $(LFLAGS) os.o dummies.o \ + sa-globals.o store.o string.o tod.o $(LIBS) + rm -f os.o + +test_parse: config.h parse.c dummies.o sa-globals.o \ + store.o string.o tod.o version.o + $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE parse.c + $(LNCC) -o test_parse $(LFLAGS) parse.o \ + dummies.o sa-globals.o store.o string.o tod.o version.o + rm -f parse.o + +test_string: config.h string.c dummies.o sa-globals.o store.o tod.o + $(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE string.c + $(LNCC) -o test_string $(LFLAGS) -DSTAND_ALONE string.o \ + dummies.o sa-globals.o store.o tod.o $(LIBS) + rm -f string.o + +# End diff --git a/OS/Makefile-CYGWIN b/OS/Makefile-CYGWIN new file mode 100644 index 0000000..774fa4f --- /dev/null +++ b/OS/Makefile-CYGWIN @@ -0,0 +1,114 @@ +# OS-specific file for Cygwin. + +# This file provided by Pierre A. Humblet + +HAVE_ICONV = yes +CFLAGS= -g -Wall -O2 +LIBS= -lcrypt -lresolv +LIBS_EXIM= -liconv +EXIWHAT_PS_ARG=-as +EXIWHAT_KILL_SIGNAL=-USR1 +EXIWHAT_EGREP_ARG='/(EXIM|exim)[0-9. -]*$$' + +DBMLIB=-lgdbm +USE_GDBM=YES + +# Some OS add a suffix to executables +EXE = .exe + +# To add a resource file with an icon +LIBS_EXIM +=../Local/exim_res.o + +# To produce a linker map +#LIBS_EXIM+=-Wl,-Map,Exim.Map + + +################################################## +# The following is normaly set in local/Makefile. +# Makefile.cygwin provides defaults with which the +# precompiled version is built +################################################## + +BIN_DIRECTORY=/usr/bin +CONFIGURE_FILE=/etc/exim.conf +EXIM_USER=18 # This changes if user exim exists +EXIM_GROUP=544 # Administrators +SPOOL_DIRECTORY=/var/spool/exim +LOG_FILE_PATH=/var/log/exim/exim_%s.log +TIMEZONE_DEFAULT = "" + +AUTH_CRAM_MD5=yes +AUTH_PLAINTEXT=yes +AUTH_SPA=yes + +SUPPORT_TLS=yes +TLS_LIBS=-lssl -lcrypto + +ROUTER_ACCEPT=yes +ROUTER_DNSLOOKUP=yes +ROUTER_IPLITERAL=yes +ROUTER_MANUALROUTE=yes +ROUTER_QUERYPROGRAM=yes +ROUTER_REDIRECT=yes + +TRANSPORT_APPENDFILE=yes +TRANSPORT_AUTOREPLY=yes +TRANSPORT_PIPE=yes +TRANSPORT_SMTP=yes + +SUPPORT_MAILDIR=yes +SUPPORT_MAILSTORE=yes +SUPPORT_MBX=yes + +LOOKUP_DBM=yes +LOOKUP_LSEARCH=yes + +# LOOKUP_CDB=yes +LOOKUP_DNSDB=yes +LOOKUP_DSEARCH=yes +LOOKUP_LDAP=yes +# LOOKUP_MYSQL=yes +# LOOKUP_NIS=yes +# LOOKUP_NISPLUS=yes +# LOOKUP_ORACLE=yes +LOOKUP_PASSWD=yes +# LOOKUP_PGSQL=yes +# LOOKUP_WHOSON=yes + +LDAP_LIB_TYPE=OPENLDAP2 +LOOKUP_LIBS=-lldap -llber + +# WITH_OLD_DEMIME=yes +WITH_CONTENT_SCAN=yes + +# It is important to define these variables but the values are always overridden +CONFIGURE_OWNER=18 +CONFIGURE_GROUP=544 + +EXICYCLOG_MAX=10 + +COMPRESS_COMMAND=/usr/bin/gzip +COMPRESS_SUFFIX=gz +ZCAT_COMMAND=/usr/bin/zcat + +# EXIM_PERL=perl.o + +# Comment the two lines below if you do not have PAM, e.g. from +# ftp://ftp.uni-erlangen.de/pub/pc/gnuwin32/cygwin/porters/Humblet_Pierre_A +SUPPORT_PAM=yes +CFLAGS += -DINCLUDE_PAM -I ../pam -I ../../pam + +APPENDFILE_MODE = 0644 # default if no ntsec +APPENDFILE_DIRECTORY_MODE = 0777 +APPENDFILE_LOCKFILE_MODE = 0666 +EXIMDB_DIRECTORY_MODE = 0777 +EXIMDB_MODE = 0666 +EXIMDB_LOCKFILE_MODE = 0666 +INPUT_DIRECTORY_MODE = 0777 +LOG_DIRECTORY_MODE = 0777 +LOG_MODE = 0666 +MSGLOG_DIRECTORY_MODE = 0777 +SPOOL_DIRECTORY_MODE = 0777 +SPOOL_MODE = 0666 + +# End diff --git a/OS/Makefile-DGUX b/OS/Makefile-DGUX new file mode 100644 index 0000000..667c63f --- /dev/null +++ b/OS/Makefile-DGUX @@ -0,0 +1,32 @@ +# Exim: OS-specific make file for DGUX +# +# Written by Ken Bailey (K.Bailey@rbgkew.org.uk) Feb 1998 +# on dgux R4.11MU04 generic AViiON mc88100 +# with no X + +# Minor tidies to remove settings that are actually the default, +# in line with the style of other system files - PH. + +BASENAME_COMMAND=/bin/basename +CHOWN_COMMAND=/bin/chown +CHGRP_COMMAND=/bin/chgrp +CHMOD_COMMAND=/bin/chmod + +# PERL +# Perl is not necessary for running Exim itself, but some Perl utilities +# are provided for processing the logs. Perl 5 is assumed. +# DG ship perl version 4.036 in /bin/perl so need to use locally installed perl + +PERL_COMMAND=/usr/local/bin/perl + +# dg's version of gcc likes O2 + +CFLAGS=-O2 + +RANLIB=@true +LIBS=-lsocket -lnsl -lm +LIBRESOLV=-lresolv +DBMLIB=-ldbm + +# End + diff --git a/OS/Makefile-Darwin b/OS/Makefile-Darwin new file mode 100644 index 0000000..be0d952 --- /dev/null +++ b/OS/Makefile-Darwin @@ -0,0 +1,29 @@ +# Exim: OS-specific make file for Darwin (Mac OS X). + +CC=cc + +BASENAME_COMMAND=look_for_it +CHOWN_COMMAND=/usr/sbin/chown +CHMOD_COMMAND=/bin/chmod + +HAVE_SA_LEN=YES + +# Removed -DBIND_8_COMPAT for 4.61 +# CFLAGS=-O -no-cpp-precomp -DBIND_8_COMPAT + +CFLAGS=-O -no-cpp-precomp +LIBRESOLV=-lresolv + +USE_DB = yes +DBMLIB = + +X11=/usr/X11R6 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +EXIWHAT_PS_ARG=ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_KILL_SIGNAL=-USR1 + +# End diff --git a/OS/Makefile-Default b/OS/Makefile-Default new file mode 100644 index 0000000..60d5ea8 --- /dev/null +++ b/OS/Makefile-Default @@ -0,0 +1,329 @@ +################################################## +# The Exim mail transport agent # +################################################## + +# Generic default make file containing settings that relate to the OS or +# to selectable features within the OS. The configuration options for Exim +# itself live in Local/Makefile, which is constructed by editing src/EDITME. + +# These settings are basic defaults which may be overridden, either by the +# generic OS-specific files, or by site-specific files. Do not edit this file. +# Instead, edit or create suitable OS-specific and/or site specific files. +# See the manual for details. + + +# MAKE_SHELL contains the name of the shell to be used for executing commands +# from the make files. Normally /bin/sh should be used. + +MAKE_SHELL=/bin/sh + + +# BASENAME_COMMAND contains the path to the "basename" command, which varies +# from OS to OS. This is used when building the Exim monitor script only. (See +# also HOSTNAME_COMMAND.) If BASENAME_COMMAND is set to "look_for_it" then the +# script checks for /usr/bin/basename and /bin/basename, and if neither is +# found, it uses /usr/ucb/basename. This copes with Solaris 2 and Linux, both +# of which come in different versions. + +BASENAME_COMMAND=/usr/bin/basename + + +# If you set STRIP_COMMAND to the path of the "strip" command, it will be run +# on every binary that is built. It is left unset by default, which leaves +# the binaries unstripped. + +# STRIP_COMMAND=/usr/bin/strip + + +# Some of the following commands live in different places in different OS. We +# include them all here for generality. + +CHOWN_COMMAND=/usr/bin/chown +CHGRP_COMMAND=/usr/bin/chgrp +CHMOD_COMMAND=/usr/bin/chmod +MV_COMMAND=/bin/mv +RM_COMMAND=/bin/rm +TOUCH_COMMAND=/usr/bin/touch + + +# Some operating systems have different ways of building libraries of +# functions. This macro defines the command to do this, defaulting to +# the "ar" command with options "cq". + +AR=ar cq + + +# Not all operating systems have the iconv() function. Those that do have +# +# HAVE_ICONV=yes +# +# in their OS-specific Makefiles. On those that don't it is possible to +# install an independent implementation of iconv(). If you've done this, +# add "HAVE_ICONV=yes" to your Local/Makefile. + + +# Perl is not necessary for running Exim itself, except when EXIM_PERL +# is set to cause Perl embedding. However, some Perl utilities are provided +# for processing the logs. Perl 5 is assumed. + +PERL_COMMAND=/usr/bin/perl + + +# CC contains the name of the C compiler to be used. + +CC=gcc + + +# CFLAGS contains flags to be passed to the compiler. Nothing is defaulted +# here; instead each OS-dependent Makefile contains a default setting. + +# CFLAGS=-O + + +# LFLAGS contains flags to be passed to the link editor. Nothing is defaulted +# here; instead each OS-dependent Makefile contains a default setting if one +# is needed. + +# LFLAGS= + + +# PCRE_LIBS contains the library to be linked for PCRE + +PCRE_LIBS=-lpcre + + +# LIBS and EXTRALIBS contain library settings that are used on linking +# commands to build binaries. The OS-dependent Makefile may contain a default +# setting for LIBS, leaving EXTRALIBS available for adding further libraries +# that are required for optional extras. + +# LIBS= +# EXTRALIBS= + + +# LIBS_EXIM and EXTRALIBS_EXIM contain library settings that are used +# only when linking the Exim binary. They are not used for other binaries. +# One possible use is for the TCP wrappers library. + +# LIBS_EXIM= +# EXTRALIBS_EXIM= + + +# LIBS_EXIMON and EXTRALIBS_EXIMON contain library settings that are +# used only when linking the Exim monitor binary. They are not used for +# other binaries. + +# LIBS_EXIMON= +# EXTRALIBS_EXIMON= + + +# The error name for quota exceeded varies among operating systems, and +# even, unfortunately, in different versions of the same operating system. +# EDQUOT was not in Sys V, but is in SPEC 1170, apparently. It was used +# in SunOS4, but got taken out for SunOS5, where ENOSPC was given if a quota +# was exceeded. However, it got put back into SunOS5 with a patch to 5.4 in +# order to comply with SPEC 1170. Thus even different patch levels of the same +# system (SunOS5) may use different numbers. +# +# If you don't have quotas or are not interested in handling quota errors +# specially, just set this variable to 0. If it is not set, it defaults to +# EDQUOT if that is defined for the OS; otherwise it defaults to ENOSPC. + +# ERRNO_QUOTA=EDQUOT + + +# The exiwhat utility script finds all the processes running Exim, and sends +# them a SIGUSR1 signal to get them to write their status to a file. There are +# two ways in which this can be done: +# +# (1) If the OS has a command to find processes and signal them, that can be +# used. Linux has "killall"; Solaris has "pkill". (Note: "killall" on Solaris +# does something very different - and disastrous.) The following are set in the +# OS-specific Makefiles for those OS where this can be done: + +# EXIWHAT_MULTIKILL_CMD= +# EXIWHAT_MULTIKILL_ARG= + +# (2) For other operating systems, exiwhat calls the ps command and egreps the +# output in order to find all the processes running Exim. The arguments for the +# various commands needed to do this vary from OS to OS. These defaults work on +# Solaris 2, HPUX, and IRIX. The OS-specific Makefiles have different versions +# for other systems, and you can override with your own requirements in your +# private Makefiles in the Local directory. The most commonly found +# alternatives are -ax instead of -e for the ps argument, and / instead of a +# blank before the name exim for the egrep argument on systems whose ps output +# shows the full path name. The quotes for the egrep argument are specified +# here so that leading white space can be used. This value should always be +# given in single quotes. + +EXIWHAT_PS_CMD=/bin/ps +EXIWHAT_PS_ARG=-e +EXIWHAT_EGREP_ARG=' exim( |$$|-)' + +# For both kinds of exiwhat usage, the next setting specifies the signal that +# is sent. + +EXIWHAT_KILL_SIGNAL=-USR1 + + +# IPv6 is gradually spreading more and more widely. Most operating systems seem +# to support it nowadays. If you set this option, IPv6 support will be included +# in the Exim binary. As well as the basic enabling option, there are +# parameters for include and library directories that may be needed for IPv6 on +# some systems, where the support is not yet in the standard library. + +# HAVE_IPV6=YES +# IPV6_INCLUDE=-I /usr/ipv6/include +# IPV6_LIBS=-L/usr/ipv6/libs -linet6 + +# Exim uses the function getaddrinfo() for converting IPv6 addresses in text +# form to binary. Apparently some operating systems do not support this, or not +# correctly, and require the use of the function inet_pton() instead. The +# following setting enables this. Note, however, the inet_pton() has reduced +# functionality compared with getaddrinfo(). In particular, it does not +# recognize the percent convention for identifying scopes (interfaces) that is +# used by some operating systems. + +# IPV6_USE_INET_PTON=yes + +# Setting the next option brings in support for A6 DNS records for IPV6. These +# were at one time expected to supplant AAAA records, but were eventually +# rejected. The code remains in Exim, but has not been compiled or tested for +# quite some time. Do not set this unless you know what you are doing. + +# SUPPORT_A6=yes + + +# HOSTNAME_COMMAND contains the path to the "hostname" command, which varies +# from OS to OS. This is used when building the Exim monitor script only. (See +# also BASENAME_COMMAND.) If HOSTNAME_COMMAND is set to "look_for_it" then the +# script checks for /usr/bin/hostname and /bin/hostname, and if neither is +# found, it uses /usr/ucb/basename. This copes with Solaris 2, which comes in +# different versions. + +HOSTNAME_COMMAND=/bin/hostname + + +# INCLUDE contains arbitrary include parameters that you may need to use +# when building exim. It is added to every compile command. + +# INCLUDE=-I /some/special/include-directory + + +# Some OS require a separate library to be quoted when linking programs that +# call name resolver functions. This can be set in LIBRESOLV, which is left +# unset here, but is set is some of the OS-specific Makefiles. + +# LIBRESOLV= + + +# Additional libraries and include directories may be required for some +# lookup styles, e.g. LDAP or SQL. LOOKUP_LIBS is included only on the +# command for linking Exim itself, not on any auxiliary programs. You +# don't need to set LOOKUP_INCLUDE if the relevant directories are already +# specified in INCLUDE. + +# LOOKUP_INCLUDE=-I /usr/local/ldap/include -I /usr/local/sql/include +# LOOKUP_LIBS=-L/usr/local/lib -lldap -llber + + +# RANLIB should be set to something that does nothing on systems that do not +# have the ranlib command or do not need to run it on library files. + +RANLIB=ranlib + + +# EXIM_CHMOD is available to specify a command that is automatically applied +# to the Exim binary immediately it is compiled. (I find this useful when +# building test versions.) + +EXIM_CHMOD=@true + + +# LOCAL_SCAN_SOURCE defines the file in which the function local_scan() is +# defined. This provides the administrator with a hook for including C code +# for scanning incoming mails. The path that is defined must be relative to +# the Exim distribution directory. For example + +# LOCAL_SCAN_SOURCE=Local/local_scan.c + +# The default setting points to a template function that doesn't actually do +# any scanning, but just accepts the message. + +LOCAL_SCAN_SOURCE=src/local_scan.c + +# If you want to specify options for your local_scan() that can be set from +# the main Exim configuration file, you need to uncomment the following line, +# and then provide a table of options in your local_scan() source, as described +# in the reference manual. + +# LOCAL_SCAN_HAS_OPTIONS=yes + + +############################################################################# +# The following are all concerned with configuring the way Exim handles its +# database (hints) and other dbm files. + +# Some systems require a separate library to be supplied when linking programs +# that make use of DBM library calls. This can be set in DBMLIB, which is unset +# by default, but is set in some of the OS-specific Makefiles. Setting it in +# your Local/Makefile will override any other setting. + +# DBMLIB= + + +# When Exim is attempting to lock one of its database (hints) files, it +# applies a timeout which can be altered here. + +# EXIMDB_LOCK_TIMEOUT=60 + + +# By default, Exim uses traditional ndbm function calls to handle its indexed +# hints databases. On systems that have Berkeley db installed, this still +# works via the compatibility interface. However, by defining USE_DB you can +# make it use native db function calls. + +# USE_DB=YES + +# Similarly, if you are using gdbm, Exim will by default use the ndbm +# compatibility interface. However, by defining USE_GDBM you can make it +# use the native gdbm function calls. + +# USE_GDBM=YES + + +############################################################################# +# The following definitions are relevant only when compiling the Exim monitor +# program, which requires an X11 display. See the varible EXIM_MONITOR in +# src/EDITME for how to suppress this compilation. + +# X11 contains the location of the X11 libraries and include files. + +X11=/usr/X11R6 + +# XINCLUDE contains options for header inclusion when compiling functions +# that call X11 functions. + +XINCLUDE=-I$(X11)/include + +# XLFLAGS contains flags to be passed to the linker when linking the monitor. + +XLFLAGS=-L$(X11)/lib + +# X11_LD_LIB contains the name of the X11 library that is to be added to +# LD_LIBRARY_PATH when running the monitor program. + +X11_LD_LIB=$(X11)/lib + +# A modified version of the Athena TextPop module is supplied with Exim. The +# modification is to remove the "replace" part of the "search and replace" +# operation because it isn't wanted. TextPop is only one of a number of +# modules that make up the Text widget. Some antique link editors cannot handle +# the case of a replacement module for one of a set of modules. To allow +# the monitor to be linked in such cases, set the value of EXIMON_TEXTPOP +# to be empty. The search operations will then contain a useless "replace" +# option, which is untidy, but does no harm. + +EXIMON_TEXTPOP=em_TextPop.o + +# End diff --git a/OS/Makefile-DragonFly b/OS/Makefile-DragonFly new file mode 100644 index 0000000..c49c59f --- /dev/null +++ b/OS/Makefile-DragonFly @@ -0,0 +1,31 @@ +# Exim: OS-specific make file for DragonFly +# There's no setting of CFLAGS here, to allow the system default +# for "make" to be the default. + +CHOWN_COMMAND=/usr/sbin/chown +CHMOD_COMMAND=/bin/chmod + +HAVE_SA_LEN=YES + +# crypt() is in a separate library +LIBS=-lcrypt -lm + +# DragonFly always ships with Berkeley DB +USE_DB=yes + +# X11 may be under /usr/pkg/xorg/ for example. +# X11=/usr/X11R6 +X11=$(X11BASE) + +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib +XLFLAGS+=-Wl,-rpath,${X11BASE}/lib +X11_LD_LIB=$(X11)/lib + +EXIWHAT_PS_ARG=-ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_MULTIKILL_CMD='killall -m' +EXIWHAT_MULTIKILL_ARG='^exim($$|-[0-9.]+-[0-9]+$$)' +EXIWHAT_KILL_SIGNAL=-USR1 + +# End diff --git a/OS/Makefile-FreeBSD b/OS/Makefile-FreeBSD new file mode 100644 index 0000000..ebb116b --- /dev/null +++ b/OS/Makefile-FreeBSD @@ -0,0 +1,50 @@ +# Exim: OS-specific make file for FreeBSD +# There's no setting of CFLAGS here, to allow the system default +# for "make" to be the default. + +CHOWN_COMMAND=/usr/sbin/chown +STRIP_COMMAND=/usr/bin/strip +CHMOD_COMMAND=/bin/chmod + +HAVE_SA_LEN=YES + +# crypt() is in a separate library +LIBS=-lcrypt -lm -lutil + +# Dynamicly loaded modules need to be built with -fPIC +CFLAGS_DYNAMIC=-shared -rdynamic -fPIC + +# FreeBSD always ships with Berkeley DB +USE_DB=yes + +# This code for building outside ports suggested by Richard Clayton +.ifdef X11BASE +X11=${X11BASE} +.elifdef LOCALBASE +X11=$(LOCALBASE) +.else +X11=/usr/local +.endif + +# nb: FreeBSD is entirely elf; objformat was removed prior to FreeBSD 7 +# http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/objformat/Attic/objformat.c +# deleted Jan 2007. +# +# So if this fails, you're on an ancient unsupported FreeBSD release *and* +# running GUI software, which seems both unusual and unwise. +# +# http://www.freebsd.org/doc/handbook/binary-formats.html suggests that the +# switch to default to ELF came with FreeBSD 3. elf(5) claims ELF support +# introduced in FreeBSD 2.2.6. +# +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib -Wl,-rpath,${X11}/lib +X11_LD_LIB=$(X11)/lib + +EXIWHAT_PS_ARG=-ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_MULTIKILL_CMD='killall -m' +EXIWHAT_MULTIKILL_ARG='^exim($$|-[0-9.]+-[0-9]+$$)' +EXIWHAT_KILL_SIGNAL=-USR1 + +# End diff --git a/OS/Makefile-GNU b/OS/Makefile-GNU new file mode 100644 index 0000000..e464341 --- /dev/null +++ b/OS/Makefile-GNU @@ -0,0 +1,29 @@ +# Exim: OS-specific make file for GNU and variants. + +HAVE_ICONV=yes + +BASENAME_COMMAND=look_for_it +CHOWN_COMMAND=look_for_it +CHGRP_COMMAND=look_for_it +CHMOD_COMMAND=look_for_it + +CFLAGS ?= -O -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE + +DBMLIB = -ldb +USE_DB = yes + +LIBS = -lnsl -lcrypt -lm +LIBRESOLV = -lresolv + +X11=/usr/X11R6 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +EXIWHAT_PS_ARG=ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_MULTIKILL_CMD=killall +EXIWHAT_MULTIKILL_ARG=exim +EXIWHAT_KILL_SIGNAL=-USR1 + +# End diff --git a/OS/Makefile-GNUkFreeBSD b/OS/Makefile-GNUkFreeBSD new file mode 100644 index 0000000..8019281 --- /dev/null +++ b/OS/Makefile-GNUkFreeBSD @@ -0,0 +1,29 @@ +# Exim: OS-specific make file for GNU and variants. + +HAVE_ICONV=yes + +BASENAME_COMMAND=look_for_it +CHOWN_COMMAND=look_for_it +CHGRP_COMMAND=look_for_it +CHMOD_COMMAND=look_for_it + +CFLAGS ?= -O -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE + +DBMLIB = -ldb +USE_DB = yes + +LIBS = -lnsl -lcrypt -lm +LIBRESOLV = -lresolv + +X11=/usr/X11R6 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +EXIWHAT_PS_ARG=ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_MULTIKILL_CMD=killall +EXIWHAT_MULTIKILL_ARG=exim4 +EXIWHAT_KILL_SIGNAL=-USR1 + +# End diff --git a/OS/Makefile-GNUkNetBSD b/OS/Makefile-GNUkNetBSD new file mode 100644 index 0000000..8019281 --- /dev/null +++ b/OS/Makefile-GNUkNetBSD @@ -0,0 +1,29 @@ +# Exim: OS-specific make file for GNU and variants. + +HAVE_ICONV=yes + +BASENAME_COMMAND=look_for_it +CHOWN_COMMAND=look_for_it +CHGRP_COMMAND=look_for_it +CHMOD_COMMAND=look_for_it + +CFLAGS ?= -O -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE + +DBMLIB = -ldb +USE_DB = yes + +LIBS = -lnsl -lcrypt -lm +LIBRESOLV = -lresolv + +X11=/usr/X11R6 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +EXIWHAT_PS_ARG=ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_MULTIKILL_CMD=killall +EXIWHAT_MULTIKILL_ARG=exim4 +EXIWHAT_KILL_SIGNAL=-USR1 + +# End diff --git a/OS/Makefile-HI-OSF b/OS/Makefile-HI-OSF new file mode 100644 index 0000000..da3d487 --- /dev/null +++ b/OS/Makefile-HI-OSF @@ -0,0 +1,8 @@ +# Exim: OS-specific make file for HI-OSF/1-MJ and HI-UX/MPP + +CC=cc +CFLAGS=-O +RANLIB=@true +EXIWHAT_EGREP_ARG='/exim( |$$)' + +# End diff --git a/OS/Makefile-HI-UX b/OS/Makefile-HI-UX new file mode 100644 index 0000000..870ee84 --- /dev/null +++ b/OS/Makefile-HI-UX @@ -0,0 +1,12 @@ +# Exim: OS-specific make file for HI-UX + +CC=cc -Aa -D_HIUX_SOURCE +HAVE_SETRESUID=YES +HAVE_SETEUID=NO +XINCLUDE=-I/usr/include/X11R5 +XLFLAGS=-L/usr/lib/X11R5 +DBMLIB = -lndbm +NEED_H_ERRNO=1 +RANLIB=@true + +# End diff --git a/OS/Makefile-HP-UX b/OS/Makefile-HP-UX new file mode 100644 index 0000000..073d67a --- /dev/null +++ b/OS/Makefile-HP-UX @@ -0,0 +1,25 @@ +# Exim: OS-specific make file for HP-UX later than 9 + +# HP ANSI C compiler +#CC=cc +#CFLAGS=+O2 +Onolimit -z -D_XOPEN_SOURCE_EXTENDED +# Users of the A.06.00 compiler might need to use +O1 rather than +O2 as +# there have been some problems reported with this compiler with +O2 set. + +# gcc +CFLAGS=-O -D_XOPEN_SOURCE_EXTENDED +LDFLAGS=-Wl,-z +LIBS=-lm + +BASENAME_COMMAND=/bin/basename +HAVE_ICONV=yes +HAVE_SETRESUID=YES +HAVE_SETEUID=NO +XINCLUDE=-I/usr/include/X11R6 -I/usr/contrib/X11R6/include +XLFLAGS=-L/usr/lib/X11R6 -L/usr/contrib/X11R6/lib +X11_LD_LIB=/usr/contrib/X11R6/lib +EXIMON_TEXTPOP= +DBMLIB=-lndbm +RANLIB=@true + +# End diff --git a/OS/Makefile-HP-UX-9 b/OS/Makefile-HP-UX-9 new file mode 100644 index 0000000..1530009 --- /dev/null +++ b/OS/Makefile-HP-UX-9 @@ -0,0 +1,15 @@ +# Exim: OS-specific make file for HP-UX 9 + +CFLAGS=-O +BASENAME_COMMAND=/bin/basename +HAVE_ICONV=yes +HAVE_SETRESUID=YES +HAVE_SETEUID=NO +XINCLUDE=-I/usr/include/X11R5 +XLFLAGS=-L/usr/lib/X11R5 -L/usr/contrib/X11R5/lib +X11_LD_LIB=/usr/contrib/X11R5/lib +EXIMON_TEXTPOP= +DBMLIB=-lndbm +RANLIB=@true + +# End diff --git a/OS/Makefile-IRIX b/OS/Makefile-IRIX new file mode 100644 index 0000000..7b95783 --- /dev/null +++ b/OS/Makefile-IRIX @@ -0,0 +1,12 @@ +# Exim: OS-specific make file for IRIX + +HAVE_ICONV=yes +BASENAME_COMMAND=/sbin/basename +HOSTNAME_COMMAND=/usr/bsd/hostname +CFLAGS=-OPT:Olimit=1500 +LIBS=-lmld -lm +XINCLUDE=-I/usr/include/X11 +vfork=fork +RANLIB=@true + +# End diff --git a/OS/Makefile-IRIX6 b/OS/Makefile-IRIX6 new file mode 100644 index 0000000..be01138 --- /dev/null +++ b/OS/Makefile-IRIX6 @@ -0,0 +1,13 @@ +# Exim: OS-specific make file for IRIX6 on 64-bit systems + +HAVE_ICONV=yes +HOSTNAME_COMMAND=/usr/bsd/hostname +CFLAGS=-O2 -n32 -OPT:Olimit=4000 +LFLAGS=-n32 +LIBS=-lelf -lm +XINCLUDE=-I/usr/include/X11 +XLFLAGS= +vfork=fork +RANLIB=@true + +# End diff --git a/OS/Makefile-IRIX632 b/OS/Makefile-IRIX632 new file mode 100644 index 0000000..b567fc6 --- /dev/null +++ b/OS/Makefile-IRIX632 @@ -0,0 +1,16 @@ +# Exim: OS-specific make file for IRIX 6 on 32-bit systems. +# There seems to be some variation. The commented settings show +# some alternatives. + +HAVE_ICONV=yes +HOSTNAME_COMMAND=/usr/bsd/hostname +#CFLAGS=-OPT:Olimit=1500 -32 -mips2 +CFLAGS=-32 +LFLAGS=-32 +#LIBS=-lmld +LIBS=-lelf -lm +XINCLUDE=-I/usr/include/X11 +vfork=fork +RANLIB=@true + +# End diff --git a/OS/Makefile-IRIX65 b/OS/Makefile-IRIX65 new file mode 100644 index 0000000..50e7745 --- /dev/null +++ b/OS/Makefile-IRIX65 @@ -0,0 +1,16 @@ +# Exim: OS-specific make file for IRIX 6.5 + +HAVE_ICONV=yes +HOSTNAME_COMMAND=/usr/bsd/hostname +CC=cc +CFLAGS=-O2 -OPT:Olimit=0 +# CFLAGS=-O2 # override with this (in your Local/Makefile) if using gcc +LFLAGS=-Wl,-LD_MSG:off=85 +LFLAGS= +# nlist has moved from libmld to libelf +LIBS=-lelf -lm +XINCLUDE=-I/usr/include/X11 +vfork=fork +RANLIB=@true + +# End diff --git a/OS/Makefile-Linux b/OS/Makefile-Linux new file mode 100644 index 0000000..990f884 --- /dev/null +++ b/OS/Makefile-Linux @@ -0,0 +1,36 @@ +# Exim: OS-specific make file for Linux. This is for modern Linuxes, +# which use libc6. +# +# For Linux, we assume GNU Make; at time of writing, the only extension +# used is ?= which is actually portable to other maintained Make variants, +# just is not POSIX. + +HAVE_ICONV=yes + +BASENAME_COMMAND=look_for_it +CHOWN_COMMAND=look_for_it +CHGRP_COMMAND=look_for_it +CHMOD_COMMAND=look_for_it + +# Preserve CFLAGS and CFLAGS_DYNAMIC from the caller/environment +CFLAGS ?= -O -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE +CFLAGS_DYNAMIC ?= -shared -rdynamic + +DBMLIB = -ldb +USE_DB = yes + +LIBS = -lnsl -lcrypt -lm +LIBRESOLV = -lresolv + +X11=/usr/X11R6 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +EXIWHAT_PS_ARG=ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_MULTIKILL_CMD=killall +EXIWHAT_MULTIKILL_ARG=exim +EXIWHAT_KILL_SIGNAL=-USR1 + +# End diff --git a/OS/Makefile-NetBSD b/OS/Makefile-NetBSD new file mode 100644 index 0000000..35d03a2 --- /dev/null +++ b/OS/Makefile-NetBSD @@ -0,0 +1,27 @@ +# Exim: OS-specific make file for NetBSD (ELF object format) + +CHOWN_COMMAND=/usr/sbin/chown +CHMOD_COMMAND=/bin/chmod + +CFLAGS ?= -O2 + +HAVE_SA_LEN=YES +HAVE_IPV6=YES +LIBS=-lcrypt -lm + +X11=/usr/X11R6 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +EXIWHAT_PS_ARG=-ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_KILL_SIGNAL=-USR1 + +# NetBSD always ships with Berkeley DB +USE_DB=yes + +# NetBSD ELF linker needs a -R flag. +XLFLAGS+=-Wl,-R$(X11)/lib/ + +# End diff --git a/OS/Makefile-NetBSD-a.out b/OS/Makefile-NetBSD-a.out new file mode 100644 index 0000000..e210efd --- /dev/null +++ b/OS/Makefile-NetBSD-a.out @@ -0,0 +1,24 @@ +# Exim: OS-specific make file for NetBSD (a.out/COFF object format) + +CHOWN_COMMAND=/usr/sbin/chown +CHMOD_COMMAND=/bin/chmod + +CFLAGS ?= -O2 + +HAVE_SA_LEN=YES +HAVE_IPV6=YES +LIBS=-lcrypt -lm + +X11=/usr/X11R6 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +EXIWHAT_PS_ARG=-ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_KILL_SIGNAL=-USR1 + +# NetBSD always ships with Berkeley DB +USE_DB=yes + +# End diff --git a/OS/Makefile-OSF1 b/OS/Makefile-OSF1 new file mode 100644 index 0000000..811ca07 --- /dev/null +++ b/OS/Makefile-OSF1 @@ -0,0 +1,10 @@ +# Exim: OS-specific make file for OSF1 + +CFLAGS=-O +LIBS=-liconv -lm +HAVE_CRYPT16=yes +HAVE_ICONV=yes +HOSTNAME_COMMAND=/usr/bin/hostname +EXIWHAT_EGREP_ARG='/exim( |$$)' + +# End diff --git a/OS/Makefile-OpenBSD b/OS/Makefile-OpenBSD new file mode 100644 index 0000000..1022abb --- /dev/null +++ b/OS/Makefile-OpenBSD @@ -0,0 +1,28 @@ +# Exim: OS-specific make file for OpenBSD + +CHOWN_COMMAND=/usr/sbin/chown +CHGRP_COMMAND=/usr/sbin/chgrp +CHMOD_COMMAND=/bin/chmod + +CFLAGS=-O2 -Wall + +LIBS=-lm + +HAVE_SA_LEN=YES + +X11=/usr/X11R6 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib + +EXIWHAT_MULTIKILL_CMD=pkill +EXIWHAT_MULTIKILL_ARG='exim( |$$|-)' +EXIWHAT_PS_ARG=-ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_KILL_SIGNAL=-USR1 + +HAVE_IPV6=YES + +# OpenBSD always ships with Berkeley DB +USE_DB=yes + +# End diff --git a/OS/Makefile-OpenUNIX b/OS/Makefile-OpenUNIX new file mode 100644 index 0000000..e4d7261 --- /dev/null +++ b/OS/Makefile-OpenUNIX @@ -0,0 +1,17 @@ +# Exim: OS-specific make file for OpenUNIX + +CC=/usr/bin/cc +CFLAGS=-O -I/usr/local/include +LFLAGS=-L/usr/local/lib + +LIBS=-lsocket -lnsl -lelf -lgen -lresolv -lm +EXTRALIBS_EXIMON=-lICE -lSM + +RANLIB=@true +ERRNO_QUOTA=0 + +X11=/usr/lib/X11 +XINCLUDE=-I/usr/include/X11 +XLFLAGS=-L/usr/lib -L$(X11)/lib + +# End diff --git a/OS/Makefile-QNX b/OS/Makefile-QNX new file mode 100644 index 0000000..3cf81c4 --- /dev/null +++ b/OS/Makefile-QNX @@ -0,0 +1,30 @@ +# Exim: OS-specific makefile for QNX + +BASENAME_COMMAND=/bin/basename +MAKE_SHELL=/usr/bin/bash + +CHOWN_COMMAND=/bin/chown +CHGRP_COMMAND=/bin/chgrp +CHMOD_COMMAND=/bin/chmod +HOSTNAME_COMMAND=/bin/hostname +MV_COMMAND=/bin/mv +PERL_COMMAND=/usr/bin/perl +RM_COMMAND=/bin/rm + +AR=ar -rc + +CC=cc +CFLAGS=-Otax +LIBIDENTCFLAGS= + +RANLIB=@true +DBMLIB=-ldb +USE_DB=yes +LIBS=-lsocket -lm + +X11=/usr/X11R6 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +# End diff --git a/OS/Makefile-SCO b/OS/Makefile-SCO new file mode 100644 index 0000000..baa61d8 --- /dev/null +++ b/OS/Makefile-SCO @@ -0,0 +1,28 @@ +# Exim: OS-specific make file for SCO + +# It was reported that some versions of gcc (e.g. 2.8.1) require this to be +# CFLAGS=-melf + +CFLAGS=-b elf + +RANLIB=@true +DBMLIB=-lndbm +ERRNO_QUOTA=0 +LIBS=-lsocket -lm +HAVE_ICONV=yes + +X11=/usr/lib/X11 +XINCLUDE=-I/usr/include/X11 +XLFLAGS=-L/usr/lib -L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +# Changes from Frank Bernhardt (30/09/04) + +BASENAME_COMMAND=/bin/basename +CHOWN_COMMAND=/bin/chown +CHGRP_COMMAND=/bin/chgrp +CHMOD_COMMAND=/bin/chmod +HOSTNAME_COMMAND=/usr/bin/hostname +TOUCH_COMMAND=/bin/touch + +# End diff --git a/OS/Makefile-SCO_SV b/OS/Makefile-SCO_SV new file mode 100644 index 0000000..249b81a --- /dev/null +++ b/OS/Makefile-SCO_SV @@ -0,0 +1,34 @@ +# Exim: OS-specific make file for SCO_SV release 5 (tested on 5.0.5 & 5.0.5) +# (see the UNIX_SV files for SCO 4.2) +# Supplied by: Tony Earnshaw + +# Note that 'gcc -melf -m486' applies to gcc 2.7.2 and higher; +# 2.7.1 and SCO's SDK need '-belf'. + +# Removed -lwrap (PH 27/7/00) because not all systems have it + +CFLAGS=-melf -O3 -m486 +LFLAGS=-L/lib -L/usr/lib -L/usr/local/lib +LIBS=-ltinfo -lsocket -lm + +HAVE_ICONV=yes + +RANLIB=@true +DBMLIB=-lndbm +ERRNO_QUOTA=0 + +X11=/usr/lib/X11 +XINCLUDE=-I/usr/include/X11 +XLFLAGS=-L/usr/lib -L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +# Changes from Frank Bernhardt (30/9/04) + +BASENAME_COMMAND=/bin/basename +CHOWN_COMMAND=/bin/chown +CHGRP_COMMAND=/bin/chgrp +CHMOD_COMMAND=/bin/chmod +HOSTNAME_COMMAND=/usr/bin/hostname +TOUCH_COMMAND=/bin/touch + +# End diff --git a/OS/Makefile-SunOS4 b/OS/Makefile-SunOS4 new file mode 100644 index 0000000..c876998 --- /dev/null +++ b/OS/Makefile-SunOS4 @@ -0,0 +1,16 @@ +# Exim: OS-specific make file for SunOS4 + +CFLAGS=-O + +CHOWN_COMMAND=/usr/etc/chown +HOSTNAME_COMMAND=/usr/bin/hostname +EXIT_FAILURE=1 +EXIT_SUCCESS=0 +LIBRESOLV=-lresolv +XINCLUDE=-I/usr/include/X11 + +EXIWHAT_PS_ARG=-ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_KILL_SIGNAL=-30 + +# End diff --git a/OS/Makefile-SunOS5 b/OS/Makefile-SunOS5 new file mode 100644 index 0000000..e60a6c0 --- /dev/null +++ b/OS/Makefile-SunOS5 @@ -0,0 +1,22 @@ +# Exim: OS-specific make file for SunOS5 + +CFLAGS=-O + +HAVE_ICONV=yes + +BASENAME_COMMAND=look_for_it +HOSTNAME_COMMAND=look_for_it + +RANLIB=@true +LIBS=-lsocket -lnsl -lkstat -lm +LIBRESOLV=-lresolv + +EXIWHAT_MULTIKILL_CMD=pkill +EXIWHAT_MULTIKILL_ARG='exim( |$$|-)' + +X11=/usr/openwin +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib -R$(X11)/lib +X11LIB=$(X11)/lib + +# End diff --git a/OS/Makefile-SunOS5-hal b/OS/Makefile-SunOS5-hal new file mode 100644 index 0000000..05ea893 --- /dev/null +++ b/OS/Makefile-SunOS5-hal @@ -0,0 +1,18 @@ +# Exim: OS-specific make file for SunOS5 on a HAL + +# Note: The HAL runs a standard SunOS5 except that it has a 64 bit C +# compiler called hcc. To make things work pass the -KV7 flag to force +# 32bit compilation - this is necessary to interwork with some libraries. + +CC=hcc +CFLAGS=-O -KV7 +LIBIDENTCFLAGS="-KV7 -O -DHAVE_ANSIHEADERS" +LIBIDENTNAME=sunos5 +RANLIB=@true +LIBS=-lsocket -lnsl -lkstat -lm +LIBRESOLV=-lresolv +X11=/usr/X11R6 +XINCLUDE=-I$(X11)/include +XLFLAGS=-L$(X11)/lib -R$(X11)/lib + +# End diff --git a/OS/Makefile-ULTRIX b/OS/Makefile-ULTRIX new file mode 100644 index 0000000..9e912b3 --- /dev/null +++ b/OS/Makefile-ULTRIX @@ -0,0 +1,18 @@ +# Exim: OS-specific make file for Ultrix + +MAKE_SHELL=/usr/bin/sh5 + +CFLAGS=-O + +# This can either be /usr/include/X11 or /usr/include/mit depending on +# the particular version of ULTRIX. + +XINCLUDE=-I/usr/include/X11 -I/usr/include/mit + +DBMLIB=-lgdbm + +EXIWHAT_PS_ARG=-ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_KILL_SIGNAL=-USR1 + +# End diff --git a/OS/Makefile-UNIX_SV b/OS/Makefile-UNIX_SV new file mode 100644 index 0000000..bfcfae1 --- /dev/null +++ b/OS/Makefile-UNIX_SV @@ -0,0 +1,24 @@ +# Exim: OS-specific make file for SCO SVR4.2MP (and maybe Unixware) +# +# *** Note that for SCO 5 the configuration file is called SCO_SV, +# *** and that Unixware7 has its own configuration. This is an old +# *** file that is retained for compatibility. +# +# Note that SCO does not include dbm/ndbm with their standard compiler +# (it is available with /usr/ucb/cc, but that has bugs of its own). You +# should install gcc and gdbm, then execute 'make install-compat' in the +# gdbm source directory. + +CC=gcc -I/usr/local/include +CFLAGS=-O + +RANLIB=@true +DBMLIB=-lgdbm -L/usr/local/lib +ERRNO_QUOTA=0 +LIBS=-lsocket -lelf -lgen -lnsl -lresolv -lm + +X11=/usr/lib/X11 +XINCLUDE=-I/usr/include/X11 +XLFLAGS=-L/usr/lib -L$(X11)/lib + +# End diff --git a/OS/Makefile-USG b/OS/Makefile-USG new file mode 100644 index 0000000..753a2d7 --- /dev/null +++ b/OS/Makefile-USG @@ -0,0 +1,33 @@ +# Exim: OS-specific make file for Unixware 2.x +# +# Note that Unixware does not include db/dbm/ndbm with their standard compiler +# (it is available with /usr/ucb/cc, but that has bugs of its own). You +# should install gcc and Berkeley DB (or another dbm library if you really +# insist). If you use a different dbm library you will need to override +# DBMLIB below. +# +# DB 1.85 and 2.x can be found at http://www.sleepycat.com/. +# They have different characteristics. See the discussion of dbm libraries +# in doc/dbm.discuss.txt in the Exim distribution. +# +# DB needs to be compiled with gcc and you need a 'cc' in your path +# before the Unixware CC to compile it. +# +# Don't bother even starting to install exim on Unixware unless +# you have installed gcc and use it for everything. + +CC=gcc -I/usr/local/include +CFLAGS=-O + +RANLIB=@true +DBMLIB=-ldb -L/usr/local/lib +USE_DB=YES +ERRNO_QUOTA=0 +LIBS=-lsocket -lelf -lgen -lnsl -lresolv -lm + +X11=/usr/lib/X11 +XINCLUDE=-I/usr/include/X11 +XLFLAGS=-L/usr/lib -L$(X11)/lib +X11_LD_LIB=$(X11)/lib + +# End diff --git a/OS/Makefile-Unixware7 b/OS/Makefile-Unixware7 new file mode 100644 index 0000000..88a8838 --- /dev/null +++ b/OS/Makefile-Unixware7 @@ -0,0 +1,32 @@ +# Exim: OS-specific make file for Unixware7 +# Based on information from James FitzGibbon + +# If you want to use libbind, you need to +# add -I/usr/local/bind/include to CFLAGS +# add -L/usr/local/bind/lib to LFLAGS +# remove -lresolv from LIBS +# add LOOKUP_LIBS=-lbind +# The new settings should go in your Local/Makefile rather than here; then +# they will be usable for subsequent Exim releases. + +CC=/usr/bin/cc +CFLAGS=-O -I/usr/local/include +LFLAGS=-L/usr/local/lib + +HAVE_ICONV=yes + +LIBS=-lsocket -lnsl -lelf -lgen -lresolv -lm + +# Removed on the advice of Larry Rosenman +# EXTRALIBS=-lwrap + +EXTRALIBS_EXIMON=-lICE -lSM + +RANLIB=@true +ERRNO_QUOTA=0 + +X11=/usr/lib/X11 +XINCLUDE=-I/usr/include/X11 +XLFLAGS=-L/usr/lib -L$(X11)/lib + +# End diff --git a/OS/Makefile-mips b/OS/Makefile-mips new file mode 100644 index 0000000..ff33139 --- /dev/null +++ b/OS/Makefile-mips @@ -0,0 +1,16 @@ +# Exim: OS-specific make file for RiscOS4bsd + +HOSTNAME_COMMAND=/usr/ucb/hostname +EXIT_FAILURE=1 +EXIT_SUCCESS=0 +LIBRESOLV=-lresolv +LIBS=-liberty -lm +XINCLUDE=-I/usr/X11R6/include + +CFLAGS=-O + +EXIWHAT_PS_ARG=-ax +EXIWHAT_EGREP_ARG='/exim( |$$)' +EXIWHAT_KILL_SIGNAL=-30 + +# End diff --git a/OS/eximon.conf-Default b/OS/eximon.conf-Default new file mode 100644 index 0000000..2f874ef --- /dev/null +++ b/OS/eximon.conf-Default @@ -0,0 +1,41 @@ +# Exim: Default settings for the eximon script which fires up the Exim monitor. +# These can be overridden by OS-specific scripts and local installation +# scripts, and also at run time by shell variables. + +# The name of the eximon binary, usually the same as the eximon script, +# with .bin stuck on the end. + +EXIMON_BINARY="${EXIMON_BINARY-$0.bin}" + +# The remaining parameters are values likely to be changed to suit the +# user's taste. They are documented in the EDITME file. + +WINDOW_TITLE=${EXIMON_WINDOW_TITLE-'"${hostname} eximon"'} + +ACTION_OUTPUT=${EXIMON_ACTION_OUTPUT-no} +ACTION_QUEUE_UPDATE=${EXIMON_ACTION_QUEUE_UPDATE-yes} +BODY_MAX=${EXIMON_BODY_MAX-20000} +LOG_DEPTH=${EXIMON_LOG_DEPTH-300} +LOG_WIDTH=${EXIMON_LOG_WIDTH-${EXIMON_WIDTH-950}} +LOG_BUFFER=${EXIMON_LOG_BUFFER-20K} +LOG_FONT=${EXIMON_LOG_FONT--misc-fixed-medium-r-normal-*-14-140-*-*-*-*-iso8859-1} +LOG_STRIPCHARTS='/ <= /in/ + / => /out/ + / => .+ R=local/local/ + / => .+ T=[^ ]*smtp/smtp/' +MENU_EVENT=${EXIMON_MENU_EVENT-'Shift'} +MIN_HEIGHT=${EXIMON_MIN_HEIGHT-162} +MIN_WIDTH=${EXIMON_MIN_WIDTH-103} +QUEUE_DEPTH=${EXIMON_QUEUE_DEPTH-200} +QUEUE_WIDTH=${EXIMON_QUEUE_WIDTH-${EXIMON_WIDTH-950}} +QUEUE_FONT=${EXIMON_QUEUE_FONT-${LOG_FONT}} +QUEUE_MAX_ADDRESSES=${EXIMON_QUEUE_MAX_ADDRESSES-10} +QUEUE_INTERVAL=${EXIMON_QUEUE_INTERVAL-300} +QUEUE_STRIPCHART_NAME=${EXIMON_QUEUE_STRIPCHART_NAME-queue} +SIZE_STRIPCHART=${EXIMON_SIZE_STRIPCHART} +SIZE_STRIPCHART_NAME=${EXIMON_SIZE_STRIPCHART_NAME} +START_SMALL=${EXIMON_START_SMALL-no} +STRIPCHART_INTERVAL=${EXIMON_STRIPCHART_INTERVAL-60} +TEXT_DEPTH=${EXIMON_TEXT_DEPTH-200} + +# End diff --git a/OS/os.Configuring b/OS/os.Configuring new file mode 100644 index 0000000..465bc26 --- /dev/null +++ b/OS/os.Configuring @@ -0,0 +1,215 @@ +Configuring Exim for different Operating Systems +------------------------------------------------ + +These notes describe the way in which Exim is configured at the C program level +for different operating systems. The normal configuration options that apply +independently of the operating system are specified by creating files in the +Local directory, as described in chapter 4 of the manual. + +These notes cover the os.* files in the OS directory, and contain information +for people who want to port the program to some new OS, or to modify the +configuration for an existing port. If you are just wanting to compile Exim on +a system that it already knows about, you do not need to read further unless +there are problems. + +The os.c- files +----------------------- + +There may be an os.c- file for each operating system, but for many of +them it is not necessary. No error occurs is there isn't one. There is a +generic file called os.c which contains code that is common to two or more OS +for setting a restarting or a non-restarting signal, for computing the load +average, and for finding all the network interface addresses. A few OS have +their own individual code for one or more of these. When they do, the code is +put into an os.c- file, which also defines a macro such as +OS_RESTARTING_SIGNAL (for example) to cut out the common code in the generic +os.c. + +The os.h- files +----------------------- + +For each OS that Exim knows about, there is an os.h- file, where + is the OS name. The relevant file is included as a C header file for +all Exim compilation by pointing a symbolic link called os.h at it from the +build directory. The settings are as follows: + +The select() function +--------------------- + +There is a difference in the data type for the second argument to the select() +function in some OS. The macro SELECT_ARG2_TYPE can be used to define the type. +If it is not defined in os.h, then it is defaulted to fs_set in exim.h. + +The dn_expand() function +------------------------ + +There is a difference in the data type for the fourth argument to the +dn_expand() function in some OS. The macro DN_EXPAND_ARG4_TYPE can be used to +define the type. If it is not defined in os.h, then it is defaulted to char * +in exim.h. + +The h_errno variable +-------------------- + +If NEED_H_ERRNO is defined, then a definition of the form + +extern int h_errno + +is included in the compiled code of Exim. + +The strerror() function +----------------------- + +Most systems provide the ANSI standard strerror() function; older systems may +instead have an errlist[] variable in which to look up error texts. Defining +STRERROR_FROM_ERRLIST causes Exim to build its own strerror() function that +mimics the ANSI function by lookup up the error code in errlist. + +Truncating files +---------------- + +The fcntl() option for truncating the length of a file is called F_FREESP in +most systems; in some, however, it is called O_TRUNC. Some os.h files define +F_FREESP to be O_TRUNC for this reason. + +Finding local interfaces +------------------------ + +The SIOCGIFCONF ioctl for finding local interfaces behaves differently on BSD +systems. It returns a vector of ifreq blocks containing sockaddr structures +that can be longer than their sizeof definition, making the returned ifreq +blocks longer than their sizeof definitions. BSD sockaddrs structures contain +an sa_len field giving the actual size. To cope with difference, there is a +macro called HAVE_SA_LEN. If it is defined, code that works on BSD systems is +used. Otherwise, the objects returned by SIOCGIFCONF are assumed to be of +length sizeof(struct ifreq). + +On some operating systems, the SIOCGIFCONF ioctl returns the IP addresses +with the list of interfaces, and there is no need to call SIOCGIFADDR for each +individual address. Mostly, making the second call does no harm, but on Linux +when there are IP aliases, it causes things to go wrong. This also happens on +BSDI and GNU Hurd. Therefore, there is now a macro to cut it out, called +SIOCGIFCONF_GIVES_ADDR. + +Note that, if IPv6 support is configured, Exim cannot find the IPv6 addresses +on local interfaces by itself. You need to set the local_interfaces option in +this situation. + +Computing load averages +----------------------- + +There are several different ways that load averages are computed. One-off code +is put in the os.c-, but several OS use similar methods, and these +are coded in the generic os.c, using a number of parameters to make variations +between OS. + +Sometimes the load average is not available to unprivileged callers. If +LOAD_AVG_NEEDS_ROOT is set, Exim ensures that it is root before trying to +obtain a load average value. + +(1) If HAVE_BSD_GETLOADAVG is defined, Exim uses a simple call to the +getloadavg() function. + +(2) If HAVE_KSTAT is defined, Exim uses the kstat package as found in Solaris 2 +(but nowhere else as yet). It uses some supplementary definitions: + + LOAD_AVG_KSTAT the kstat to use + LOAD_AVG_KSTAT_MODULE the module to access + LOAD_AVG_KSTAT_SYMBOL the symbol containing the value we want + LOAD_AVG_KSTAT_FIELD the field identity + +(3) If HAVE_DEV_KMEM is defined, Exim reads load average values from the +/dev/kmem device. It uses some supplementary definitions: + + LOAD_AVG_TYPE the data type + LOAD_AVG_SYMBOL the symbol to look up + KERNEL_PATH the name of the kernel + FSCALE a scaling factor + +Sometimes FSCALE is defined in system headers so need not be defined in the +os.h- file. + +Glibc systems and IP options +---------------------------- + +The code for inspecting IP options is the same in all OS except for systems +using glibc (e.g. Linux), which uses a different structure to return data from +getsockopt(). To handle this, there is a macro called + + GLIBC_IP_OPTIONS + +which should be set for Linux (in os.h-Linux) and any other operating system +that uses glibc. + +Options for statvfs() +--------------------- + +The following settings apply to the compilation of the Exim monitor as well as +to the main Exim binary. + +#undefine HAVE_STATFS + +Exim has options for checking the amount of space in the spool partition +before accepting a message, and the monitor has the ability to display a +stripchart of the percentage fullness of a particular disc partition, usually +/var/spool/mail. The standard way of finding out the data is to call the +statvfs() function, but some operating systems use statfs() and some may not +have the ability at all. The Exim code uses STATVFS() for this function and +this gets defined appropriately. HAVE_STATFS is defined before including the +os.h file; undefining it suppresses the code for checking a partition in the +main binary, and for monitoring disc partition in the monitor. + +When HAVE_STATFS is defined, the distinction between statvfs() and statfs() is +made by checking HAVE_SYS_STATVFS_H. If it is defined, then sys/statvfs.h is +included. Otherwise, STATVFS() is defined as a macro for statfs(), and some +further includes are done, according to the following definitions: + +#define HAVE_SYS_MOUNT_H +#define HAVE_VFS_H + +Each of those definitions causes the inclusion of the corresponding system +header file in the Exim monitor compilation. For example, the first one causes + +#include + +to be obeyed. Different systems may require different combinations of these +headers. + +The sys/resource.h header +------------------------- + +One OS does not have the sys/resource.h header. If NO_SYS_RESOURCE_H is defined +in an os.h- file, then the #include for this header is skipped in +exim.h. + +Support for login_cap functions +------------------------------- + +Some of the BSD systems support functions for controlling the resources that +user processes can use (e.g. login_getpwclass). If HAVE_SETCLASSRESOURCES is +defined, Exim supports this feature for running pipe deliveries, using the +setclassresources() function. + +The crypt_h header +------------------ + +Some OS require crypt.h to be included to get a prototype for the crypt() +function. This is needed only when compiling with AUTH support. If CRYPT_H is +defined, then this header is included. + +mmap() support +-------------- + +The CDB support includes the option of handling file operations by using +mmap()/munmap(). This gives a reasonable performance increase which will +probably scale over multiple processes (since the files are mapped read-only +shared). The vast majority of modern operating systems will support mmap +(certainly in the simplified way that it is being used here). For example any +BSD 4.x derived or POSIX compliant system will support it, as will pretty much +any system using dynamically shared link libraries. + +If the OS is believed to support mmap() then the symbol HAVE_MMAP is defined. +Not all systems that support mmap will have had their config files updated to +reflect this. Currently Linux, Sun, BSD and SGI/mips systems have been updated. + +*** End *** diff --git a/OS/os.c-GNU b/OS/os.c-GNU new file mode 100644 index 0000000..e5d6ff6 --- /dev/null +++ b/OS/os.c-GNU @@ -0,0 +1,55 @@ +/************************************************* +* Exim - an Internet mail transport agent * +*************************************************/ + +/* See the file NOTICE for conditions of use and distribution. */ + +/* GNU-specific code. This is concatenated onto the generic src/os.c file. +GNU/Hurd has approximately the same way to determine the load average as NeXT, +so a variant of this could also be in the generic os.c file. See the GNU EMacs +getloadavg.c file, from which this snippet was derived. getloadavg.c from Emacs +is copyrighted by the FSF under the terms of the GPLv2 or any later version. +Changes are hereby placed under the same license, as requested by the GPL. */ + +#ifndef OS_LOAD_AVERAGE +#define OS_LOAD_AVERAGE + +#include + +static processor_set_t default_set; +static int getloadavg_initialized; + +int +os_getloadavg (void) +{ +host_t host; +struct processor_set_basic_info info; +unsigned info_count; + +if (!getloadavg_initialized) + { + if (processor_set_default (mach_host_self(), &default_set) == KERN_SUCCESS) + getloadavg_initialized = 1; + } + +if (getloadavg_initialized) + { + info_count = PROCESSOR_SET_BASIC_INFO_COUNT; + if (processor_set_info(default_set, PROCESSOR_SET_BASIC_INFO, &host, + (processor_set_info_t)&info, &info_count) != KERN_SUCCESS) + getloadavg_initialized = 0; + else + { + #if LOAD_SCALE == 1000 + return info.load_average; + #else + return (int) (((double) info.load_average * 1000) / LOAD_SCALE)); + #endif + } + } + +return -1; +} +#endif /* OS_LOAD_AVERAGE */ + +/* End of os.c-GNU */ diff --git a/OS/os.c-HI-OSF b/OS/os.c-HI-OSF new file mode 100644 index 0000000..5e3d336 --- /dev/null +++ b/OS/os.c-HI-OSF @@ -0,0 +1,35 @@ +/************************************************* +* Exim - an Internet mail transport agent * +*************************************************/ + +/* Copyright (c) University of Cambridge 2001 */ +/* See the file NOTICE for conditions of use and distribution. */ + +/* HI-OSF-specific code. This is concatenated onto the generic +src/os.c file. OSF has an apparently unique way of getting the +load average, so we provide a unique function here, and define +OS_LOAD_AVERAGE to stop src/os.c trying to provide the function. */ + +#ifndef OS_LOAD_AVERAGE +#define OS_LOAD_AVERAGE + +#include + +int +os_getloadavg(void) +{ +double avg; +struct tbl_loadavg load_avg; + +table (TBL_LOADAVG, 0, &load_avg, 1, sizeof (load_avg)); + +avg = (load_avg.tl_lscale == 0)? + load_avg.tl_avenrun.d[0] : + (load_avg.tl_avenrun.l[0] / (double)load_avg.tl_lscale); + +return (int)(avg * 1000.0); +} + +#endif /* OS_LOAD_AVERAGE */ + +/* End of os.c-HI-OSF */ diff --git a/OS/os.c-IRIX b/OS/os.c-IRIX new file mode 100644 index 0000000..487091a --- /dev/null +++ b/OS/os.c-IRIX @@ -0,0 +1,118 @@ +/************************************************* +* Exim - an Internet mail transport agent * +*************************************************/ + +/* Copyright (c) University of Cambridge 2001 */ +/* See the file NOTICE for conditions of use and distribution. */ + +/* Irix-specific code. This is concatenated onto the generic src/os.c file. +Irix has a unique way of finding all the network interfaces, so we provide a +unique function here, and define FIND_RUNNING_INTERFACES to stop src/os.c +trying to provide the function. The macro may be set initially anyway, when +compiling os. for utilities that don't want this function. */ + +#ifndef FIND_RUNNING_INTERFACES +#define FIND_RUNNING_INTERFACES + +/* This is the special form of the function using sysctl() which is the only +form that returns all the aliases on IRIX systems. This code has its origins +in a sample program that came from within SGI. */ + +#include +#include +#include +#include +#include + +#define ROUNDUP(a) ((a) > 0 ? (1 + (((a) - 1) | (sizeof(__uint64_t) -1))) \ + : sizeof(__uint64_t)) +#ifdef _HAVE_SA_LEN +#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) +#else +#define ADVANCE(x, n) (x += ROUNDUP(_FAKE_SA_LEN_DST(n))) +#endif + + +ip_address_item * +os_find_running_interfaces(void) +{ +ip_address_item *yield = NULL; +ip_address_item *last = NULL; +ip_address_item *next; + +size_t needed; +int mib[6]; +char *buf, *nextaddr, *lim; +register struct if_msghdr *ifm; + +mib[0] = CTL_NET; +mib[1] = PF_ROUTE; +mib[2] = 0; +mib[3] = 0; +mib[4] = NET_RT_IFLIST; +mib[5] = 0; + +/* Get an estimate of the amount of store needed, then get the store and +get the data into it. Any error causes a panic death. */ + +if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) + log_write(0, LOG_PANIC_DIE, "iflist-sysctl-estimate failed: %s", + strerror(errno)); + +buf = store_get(needed); + +if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) + log_write(0, LOG_PANIC_DIE, "sysctl of ifnet list failed: %s", + strerror(errno)); + +/* Now fish out the data for each interface */ + +lim = buf + needed; +for (nextaddr = buf; nextaddr < lim; nextaddr += ifm->ifm_msglen) + { + ifm = (struct if_msghdr *)nextaddr; + + if (ifm->ifm_type != RTM_IFINFO) + { + struct ifa_msghdr *ifam = (struct ifa_msghdr *)ifm; + struct sockaddr_in *mask = NULL, *addr = NULL; + + if ((ifam->ifam_addrs & RTA_NETMASK) != 0) + mask = (struct sockaddr_in *)(ifam + 1); + + if ((ifam->ifam_addrs & RTA_IFA) != 0) + { + char *cp = (char *)mask; + struct sockaddr *sa = (struct sockaddr *)mask; + ADVANCE(cp, sa); + addr = (struct sockaddr_in *)cp; + } + + /* Create a data block for the address, fill in the data, and put it on + the chain. This data has to survive for ever, so use malloc. */ + + if (addr != NULL) + { + next = store_malloc(sizeof(ip_address_item)); + next->next = NULL; + next->port = 0; + (void)host_ntoa(-1, addr, next->address, NULL); + + if (yield == NULL) yield = last = next; else + { + last->next = next; + last = next; + } + + DEBUG(D_interface) debug_printf("Actual local interface address is %s\n", + last->address); + } + } + } + +return yield; +} + +#endif /* FIND_RUNNING_INTERFACES */ + +/* End of os.c-IRIX */ diff --git a/OS/os.c-IRIX6 b/OS/os.c-IRIX6 new file mode 100644 index 0000000..487091a --- /dev/null +++ b/OS/os.c-IRIX6 @@ -0,0 +1,118 @@ +/************************************************* +* Exim - an Internet mail transport agent * +*************************************************/ + +/* Copyright (c) University of Cambridge 2001 */ +/* See the file NOTICE for conditions of use and distribution. */ + +/* Irix-specific code. This is concatenated onto the generic src/os.c file. +Irix has a unique way of finding all the network interfaces, so we provide a +unique function here, and define FIND_RUNNING_INTERFACES to stop src/os.c +trying to provide the function. The macro may be set initially anyway, when +compiling os. for utilities that don't want this function. */ + +#ifndef FIND_RUNNING_INTERFACES +#define FIND_RUNNING_INTERFACES + +/* This is the special form of the function using sysctl() which is the only +form that returns all the aliases on IRIX systems. This code has its origins +in a sample program that came from within SGI. */ + +#include +#include +#include +#include +#include + +#define ROUNDUP(a) ((a) > 0 ? (1 + (((a) - 1) | (sizeof(__uint64_t) -1))) \ + : sizeof(__uint64_t)) +#ifdef _HAVE_SA_LEN +#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) +#else +#define ADVANCE(x, n) (x += ROUNDUP(_FAKE_SA_LEN_DST(n))) +#endif + + +ip_address_item * +os_find_running_interfaces(void) +{ +ip_address_item *yield = NULL; +ip_address_item *last = NULL; +ip_address_item *next; + +size_t needed; +int mib[6]; +char *buf, *nextaddr, *lim; +register struct if_msghdr *ifm; + +mib[0] = CTL_NET; +mib[1] = PF_ROUTE; +mib[2] = 0; +mib[3] = 0; +mib[4] = NET_RT_IFLIST; +mib[5] = 0; + +/* Get an estimate of the amount of store needed, then get the store and +get the data into it. Any error causes a panic death. */ + +if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) + log_write(0, LOG_PANIC_DIE, "iflist-sysctl-estimate failed: %s", + strerror(errno)); + +buf = store_get(needed); + +if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) + log_write(0, LOG_PANIC_DIE, "sysctl of ifnet list failed: %s", + strerror(errno)); + +/* Now fish out the data for each interface */ + +lim = buf + needed; +for (nextaddr = buf; nextaddr < lim; nextaddr += ifm->ifm_msglen) + { + ifm = (struct if_msghdr *)nextaddr; + + if (ifm->ifm_type != RTM_IFINFO) + { + struct ifa_msghdr *ifam = (struct ifa_msghdr *)ifm; + struct sockaddr_in *mask = NULL, *addr = NULL; + + if ((ifam->ifam_addrs & RTA_NETMASK) != 0) + mask = (struct sockaddr_in *)(ifam + 1); + + if ((ifam->ifam_addrs & RTA_IFA) != 0) + { + char *cp = (char *)mask; + struct sockaddr *sa = (struct sockaddr *)mask; + ADVANCE(cp, sa); + addr = (struct sockaddr_in *)cp; + } + + /* Create a data block for the address, fill in the data, and put it on + the chain. This data has to survive for ever, so use malloc. */ + + if (addr != NULL) + { + next = store_malloc(sizeof(ip_address_item)); + next->next = NULL; + next->port = 0; + (void)host_ntoa(-1, addr, next->address, NULL); + + if (yield == NULL) yield = last = next; else + { + last->next = next; + last = next; + } + + DEBUG(D_interface) debug_printf("Actual local interface address is %s\n", + last->address); + } + } + } + +return yield; +} + +#endif /* FIND_RUNNING_INTERFACES */ + +/* End of os.c-IRIX */ diff --git a/OS/os.c-IRIX632 b/OS/os.c-IRIX632 new file mode 100644 index 0000000..487091a --- /dev/null +++ b/OS/os.c-IRIX632 @@ -0,0 +1,118 @@ +/************************************************* +* Exim - an Internet mail transport agent * +*************************************************/ + +/* Copyright (c) University of Cambridge 2001 */ +/* See the file NOTICE for conditions of use and distribution. */ + +/* Irix-specific code. This is concatenated onto the generic src/os.c file. +Irix has a unique way of finding all the network interfaces, so we provide a +unique function here, and define FIND_RUNNING_INTERFACES to stop src/os.c +trying to provide the function. The macro may be set initially anyway, when +compiling os. for utilities that don't want this function. */ + +#ifndef FIND_RUNNING_INTERFACES +#define FIND_RUNNING_INTERFACES + +/* This is the special form of the function using sysctl() which is the only +form that returns all the aliases on IRIX systems. This code has its origins +in a sample program that came from within SGI. */ + +#include +#include +#include +#include +#include + +#define ROUNDUP(a) ((a) > 0 ? (1 + (((a) - 1) | (sizeof(__uint64_t) -1))) \ + : sizeof(__uint64_t)) +#ifdef _HAVE_SA_LEN +#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) +#else +#define ADVANCE(x, n) (x += ROUNDUP(_FAKE_SA_LEN_DST(n))) +#endif + + +ip_address_item * +os_find_running_interfaces(void) +{ +ip_address_item *yield = NULL; +ip_address_item *last = NULL; +ip_address_item *next; + +size_t needed; +int mib[6]; +char *buf, *nextaddr, *lim; +register struct if_msghdr *ifm; + +mib[0] = CTL_NET; +mib[1] = PF_ROUTE; +mib[2] = 0; +mib[3] = 0; +mib[4] = NET_RT_IFLIST; +mib[5] = 0; + +/* Get an estimate of the amount of store needed, then get the store and +get the data into it. Any error causes a panic death. */ + +if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) + log_write(0, LOG_PANIC_DIE, "iflist-sysctl-estimate failed: %s", + strerror(errno)); + +buf = store_get(needed); + +if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) + log_write(0, LOG_PANIC_DIE, "sysctl of ifnet list failed: %s", + strerror(errno)); + +/* Now fish out the data for each interface */ + +lim = buf + needed; +for (nextaddr = buf; nextaddr < lim; nextaddr += ifm->ifm_msglen) + { + ifm = (struct if_msghdr *)nextaddr; + + if (ifm->ifm_type != RTM_IFINFO) + { + struct ifa_msghdr *ifam = (struct ifa_msghdr *)ifm; + struct sockaddr_in *mask = NULL, *addr = NULL; + + if ((ifam->ifam_addrs & RTA_NETMASK) != 0) + mask = (struct sockaddr_in *)(ifam + 1); + + if ((ifam->ifam_addrs & RTA_IFA) != 0) + { + char *cp = (char *)mask; + struct sockaddr *sa = (struct sockaddr *)mask; + ADVANCE(cp, sa); + addr = (struct sockaddr_in *)cp; + } + + /* Create a data block for the address, fill in the data, and put it on + the chain. This data has to survive for ever, so use malloc. */ + + if (addr != NULL) + { + next = store_malloc(sizeof(ip_address_item)); + next->next = NULL; + next->port = 0; + (void)host_ntoa(-1, addr, next->address, NULL); + + if (yield == NULL) yield = last = next; else + { + last->next = next; + last = next; + } + + DEBUG(D_interface) debug_printf("Actual local interface address is %s\n", + last->address); + } + } + } + +return yield; +} + +#endif /* FIND_RUNNING_INTERFACES */ + +/* End of os.c-IRIX */ diff --git a/OS/os.c-IRIX65 b/OS/os.c-IRIX65 new file mode 100644 index 0000000..487091a --- /dev/null +++ b/OS/os.c-IRIX65 @@ -0,0 +1,118 @@ +/************************************************* +* Exim - an Internet mail transport agent * +*************************************************/ + +/* Copyright (c) University of Cambridge 2001 */ +/* See the file NOTICE for conditions of use and distribution. */ + +/* Irix-specific code. This is concatenated onto the generic src/os.c file. +Irix has a unique way of finding all the network interfaces, so we provide a +unique function here, and define FIND_RUNNING_INTERFACES to stop src/os.c +trying to provide the function. The macro may be set initially anyway, when +compiling os. for utilities that don't want this function. */ + +#ifndef FIND_RUNNING_INTERFACES +#define FIND_RUNNING_INTERFACES + +/* This is the special form of the function using sysctl() which is the only +form that returns all the aliases on IRIX systems. This code has its origins +in a sample program that came from within SGI. */ + +#include +#include +#include +#include +#include + +#define ROUNDUP(a) ((a) > 0 ? (1 + (((a) - 1) | (sizeof(__uint64_t) -1))) \ + : sizeof(__uint64_t)) +#ifdef _HAVE_SA_LEN +#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) +#else +#define ADVANCE(x, n) (x += ROUNDUP(_FAKE_SA_LEN_DST(n))) +#endif + + +ip_address_item * +os_find_running_interfaces(void) +{ +ip_address_item *yield = NULL; +ip_address_item *last = NULL; +ip_address_item *next; + +size_t needed; +int mib[6]; +char *buf, *nextaddr, *lim; +register struct if_msghdr *ifm; + +mib[0] = CTL_NET; +mib[1] = PF_ROUTE; +mib[2] = 0; +mib[3] = 0; +mib[4] = NET_RT_IFLIST; +mib[5] = 0; + +/* Get an estimate of the amount of store needed, then get the store and +get the data into it. Any error causes a panic death. */ + +if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) + log_write(0, LOG_PANIC_DIE, "iflist-sysctl-estimate failed: %s", + strerror(errno)); + +buf = store_get(needed); + +if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) + log_write(0, LOG_PANIC_DIE, "sysctl of ifnet list failed: %s", + strerror(errno)); + +/* Now fish out the data for each interface */ + +lim = buf + needed; +for (nextaddr = buf; nextaddr < lim; nextaddr += ifm->ifm_msglen) + { + ifm = (struct if_msghdr *)nextaddr; + + if (ifm->ifm_type != RTM_IFINFO) + { + struct ifa_msghdr *ifam = (struct ifa_msghdr *)ifm; + struct sockaddr_in *mask = NULL, *addr = NULL; + + if ((ifam->ifam_addrs & RTA_NETMASK) != 0) + mask = (struct sockaddr_in *)(ifam + 1); + + if ((ifam->ifam_addrs & RTA_IFA) != 0) + { + char *cp = (char *)mask; + struct sockaddr *sa = (struct sockaddr *)mask; + ADVANCE(cp, sa); + addr = (struct sockaddr_in *)cp; + } + + /* Create a data block for the address, fill in the data, and put it on + the chain. This data has to survive for ever, so use malloc. */ + + if (addr != NULL) + { + next = store_malloc(sizeof(ip_address_item)); + next->next = NULL; + next->port = 0; + (void)host_ntoa(-1, addr, next->address, NULL); + + if (yield == NULL) yield = last = next; else + { + last->next = next; + last = next; + } + + DEBUG(D_interface) debug_printf("Actual local interface address is %s\n", + last->address); + } + } + } + +return yield; +} + +#endif /* FIND_RUNNING_INTERFACES */ + +/* End of os.c-IRIX */ diff --git a/OS/os.c-Linux b/OS/os.c-Linux new file mode 100644 index 0000000..df0dff9 --- /dev/null +++ b/OS/os.c-Linux @@ -0,0 +1,153 @@ +/************************************************* +* Exim - an Internet mail transport agent * +*************************************************/ + +/* Copyright (c) University of Cambridge 1997 - 2001 */ +/* See the file NOTICE for conditions of use and distribution. */ + +/* Linux-specific code. This is concatenated onto the generic +src/os.c file. */ + + +/************************************************* +* Load average computation * +*************************************************/ + +/*Linux has an apparently unique way of getting the load average, so we provide +a unique function here, and define OS_LOAD_AVERAGE to stop src/os.c trying to +provide the function. However, when compiling os.c for utilities, we may not +want this at all, so check that it isn't set first. */ + +#if !defined(OS_LOAD_AVERAGE) && defined(__linux__) +#define OS_LOAD_AVERAGE + +/* Linux has 2 ways of returning load average: + + (1) Do a read on /proc/loadavg + (2) Use the sysinfo library function and syscall + +The latter is simpler but in Linux 2.0 - 2.2 (and probably later releases) is +exceptionally slow - 10-50ms per call is not unusual and about 100x slow the +first method. This cripples high performance mail servers by increasing CPU +utilisation by 3-5x. + +In Exim's very early days, it used the 1st method. Later, it switched to the +2nd method. Now it tries the 1st method and falls back to the 2nd if /proc is +unavailable. */ + +#include + +static int +linux_slow_getloadavg(void) +{ +struct sysinfo s; +double avg; +if (sysinfo(&s) < 0) return -1; +avg = (double) (s.loads[0]) / (1<next != NULL) last = last->next; + +while (fscanf(f, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n", + addr6p[0], addr6p[1], addr6p[2], addr6p[3], + addr6p[4], addr6p[5], addr6p[6], addr6p[7], + &if_idx, &plen, &scope, &dad_status, devname) != EOF) + { + struct sockaddr_in6 addr; + + /* This data has to survive for ever, so use malloc. */ + + next = store_malloc(sizeof(ip_address_item)); + next->next = NULL; + next->port = 0; + sprintf(CS next->address, "%s:%s:%s:%s:%s:%s:%s:%s", + addr6p[0], addr6p[1], addr6p[2], addr6p[3], + addr6p[4], addr6p[5], addr6p[6], addr6p[7]); + + /* Normalize the representation */ + + inet_pton(AF_INET6, CS next->address, &addr.sin6_addr); + inet_ntop(AF_INET6, &addr.sin6_addr, CS next->address, sizeof(next->address)); + + if (yield == NULL) yield = last = next; else + { + last->next = next; + last = next; + } + + DEBUG(D_interface) + debug_printf("Actual local interface address is %s (%s)\n", last->address, + devname); + } +fclose(f); +#endif /* HAVE_IPV6 */ + +return yield; +} + +#endif /* FIND_RUNNING_INTERFACES */ + +/* End of os.c-Linux */ diff --git a/OS/os.c-OSF1 b/OS/os.c-OSF1 new file mode 100644 index 0000000..ad91b63 --- /dev/null +++ b/OS/os.c-OSF1 @@ -0,0 +1,36 @@ +/************************************************* +* Exim - an Internet mail transport agent * +*************************************************/ + +/* Copyright (c) University of Cambridge 2001 */ +/* See the file NOTICE for conditions of use and distribution. */ + +/* OSF1-specific code. This is concatenated onto the generic src/os.c file. +OSF1 has an apparently unique way of getting the load average, so we provide a +unique function here, and define OS_LOAD_AVERAGE to stop src/os.c trying to +provide the function. The macro may be set initially anyway, when compiling os. +for utilities that don't want this function. */ + +#ifndef OS_LOAD_AVERAGE +#define OS_LOAD_AVERAGE + +#include + +int +os_getloadavg(void) +{ +double avg; +struct tbl_loadavg load_avg; + +table (TBL_LOADAVG, 0, &load_avg, 1, sizeof (load_avg)); + +avg = (load_avg.tl_lscale == 0)? + load_avg.tl_avenrun.d[0] : + (load_avg.tl_avenrun.l[0] / (double)load_avg.tl_lscale); + +return (int)(avg * 1000.0); +} + +#endif /* OS_LOAD_AVERAGE */ + +/* End of os.c-OSF1 */ diff --git a/OS/os.c-cygwin b/OS/os.c-cygwin new file mode 100644 index 0000000..ea17a43 --- /dev/null +++ b/OS/os.c-cygwin @@ -0,0 +1,862 @@ +/************************************************* +* Exim - an Internet mail transport agent * +*************************************************/ + +/* Cygwin-specific code. December 2002 + This is concatenated onto the generic src/os.c file. + + This code was supplied by Pierre A. Humblet +*/ + +/* We need a special mkdir that + allows names starting with // */ +#undef mkdir +int cygwin_mkdir( const char *path, mode_t mode ) +{ + const char * p = path; + if (*p == '/') while(*(p+1) == '/') p++; + return mkdir(p, mode); +} + +/* We have strsignal but cannot use #define + because types don't match */ +#define OS_STRSIGNAL /* src/os.c need not provide it */ +char * os_strsignal(int sig) +{ + return (char *) strsignal(sig); +} + +#ifndef COMPILE_UTILITY /* Utilities don't need special code */ +#ifdef INCLUDE_MINIRES +#include "../minires/minires.c" +#include "../minires/os-interface.c" +#endif + +#ifdef INCLUDE_PAM +#include "../pam/pam.c" +#endif + +unsigned int cygwin_WinVersion; + +/* Conflict between Windows definitions and others */ +#ifdef NOERROR +#undef NOERROR +#endif +#ifdef DELETE +#undef DELETE +#endif + +#include +#define EqualLuid(Luid1, Luid2) \ + ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart)) +#include + +/* Special static variables */ +static BOOL cygwin_debug = FALSE; +static int privileged = 1; /* when not privileged, setuid = noop */ + +#undef setuid +int cygwin_setuid(uid_t uid ) +{ + int res; + if (privileged <= 0) return 0; + else { + res = setuid(uid); + if (cygwin_debug) + fprintf(stderr, "setuid %lu %lu %d pid: %d\n", + uid, getuid(),res, getpid()); + } + return res; +} + +#undef setgid +int cygwin_setgid(gid_t gid ) +{ + int res; + if (privileged <= 0) return 0; + else { + res = setgid(gid); + if (cygwin_debug) + fprintf(stderr, "setgid %lu %lu %d pid: %d\n", + gid, getgid(), res, getpid()); + } + return res; +} + +/* Background processes run at lower priority */ +static void cygwin_setpriority() +{ + if (!SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS)) + SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS); + return; +} + + +/* GetVersion() + MSB: 1 for 95/98/ME; Next 7: build number, except for 95/98/ME + Next byte: 0 + Next byte: minor version of OS + Low byte: major version of OS (3 or 4 for for NT, 5 for 2000 and XP) */ +#define VERSION_IS_58M(x) (x & 0x80000000) /* 95, 98, Me */ +#define VERSION_IS_NT(x) ((x & 0XFF) < 5) /* NT 4 or 3.51 */ + +/* + Routine to find if process or thread is privileged +*/ + +enum { + CREATE_BIT = 1, + RESTORE_BIT = 2 +}; + +static DWORD get_privileges () +{ + char buffer[1024]; + DWORD i, length; + HANDLE hToken = NULL; + PTOKEN_PRIVILEGES privs; + LUID cluid, rluid; + DWORD ret = 0; + + privs = (PTOKEN_PRIVILEGES) buffer; + + if (OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &hToken) + && LookupPrivilegeValue (NULL, SE_CREATE_TOKEN_NAME, &cluid) + && LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &rluid) + && (GetTokenInformation( hToken, TokenPrivileges, + privs, sizeof (buffer), &length) + || (GetLastError () == ERROR_INSUFFICIENT_BUFFER + && (privs = (PTOKEN_PRIVILEGES) alloca (length)) + && GetTokenInformation(hToken, TokenPrivileges, + privs, length, &length)))) { + for (i = 0; i < privs->PrivilegeCount; i++) { + if (EqualLuid(privs->Privileges[i].Luid, cluid)) + ret |= CREATE_BIT; + else if (EqualLuid(privs->Privileges[i].Luid, rluid)) + ret |= RESTORE_BIT; + else continue; + if (ret == (CREATE_BIT | RESTORE_BIT)) + break; + } + } + else + fprintf(stderr, "has_create_token_privilege %ld\n", GetLastError()); + + if (hToken) + CloseHandle(hToken); + + return ret; +} + +/* We use a special routine to initialize + cygwin_init is called from the OS_INIT macro in main(). */ + +void cygwin_init(int argc, char ** argv, void * rup, + void * eup, void * egp, void * cup, void * cgp) +{ + int i; + uid_t myuid, systemuid; + gid_t mygid, adminsgid; + struct passwd * pwp; + char *cygenv, win32_path[MAX_PATH]; + SID(1, SystemSid, SECURITY_LOCAL_SYSTEM_RID); + SID(2, AdminsSid, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS); + DWORD priv_flags; + + myuid = getuid(); + mygid = getgid(); + cygwin_WinVersion = GetVersion(); + if ((cygenv = getenv("CYGWIN")) == NULL) cygenv = ""; + /* Produce some debugging on stderr, + cannot yet use exim's debug functions. + Exim does not use -c and ignores -n. + Set lower priority for daemons */ + for (i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + if (argv[i][1] == 'c') { + argv[i][1] = 'n'; /* Replace -c by -n */ + cygwin_debug = TRUE; + fprintf(stderr, "CYGWIN = \"%s\".", cygenv); + cygwin_conv_to_win32_path("/", win32_path); + fprintf(stderr, " Root / mapped to %s.\n", win32_path); + } + else if (argv[i][1] == 'b' && argv[i][2] == 'd') + cygwin_setpriority(); + } + } + if (VERSION_IS_58M(cygwin_WinVersion)) { + * (uid_t *) rup = myuid; /* Pretend we are root */ + * (uid_t *) eup = myuid; /* ... and exim */ + * (gid_t *) egp = mygid; + return; + } + /* Nt/2000/XP + We initially set the exim uid & gid to those of the "real exim", + or to the root uid (SYSTEM) and exim gid (ADMINS), + If privileged, we setuid to those. + We always set the configure uid to the system uid. + We always set the root uid to the real uid + to avoid useless execs following forks. + If not privileged and unable to chown, + we set the exim uid to our uid. + If unprivileged, we fake all subsequent setuid. */ + + priv_flags = get_privileges (); + privileged = !!(priv_flags & CREATE_BIT); + + /* Get the system and admins uid from their sids, + or use the default values from the Makefile. */ + if ((systemuid = cygwin_internal(CW_GET_UID_FROM_SID, & SystemSid)) == -1) + systemuid = * (uid_t *) eup; + if ((adminsgid = cygwin_internal(CW_GET_GID_FROM_SID, & AdminsSid)) == -1) + adminsgid = * (gid_t *) egp; + + if ((pwp = getpwnam("exim")) != NULL) { + * (uid_t *) eup = pwp->pw_uid; /* Set it according to passwd */ + * (gid_t *) egp = pwp->pw_gid; + } + else { + * (uid_t *) eup = systemuid; + * (gid_t *) egp = adminsgid; + } + + /* Set the configuration uid and gid to the system uid and admins gid. + Note that exim uid is also accepted as owner of exim.conf. */ + * (uid_t *) cup = systemuid; + * (gid_t *) cgp = adminsgid; + + if (privileged) { /* Can setuid */ + if (cygwin_setgid(* (gid_t *) egp) /* Setuid to exim */ + || cygwin_setuid(* (uid_t *) eup)) + privileged = -1; /* Problem... Perhaps not in 544 */ + } + + /* Pretend we are root to avoid useless execs. + We are limited by file access rights */ + * (uid_t *) rup = getuid (); + + /* If we have not setuid to exim and cannot chown, + set the exim uid to our uid to avoid chown failures */ + if (privileged <= 0 && !(priv_flags & RESTORE_BIT)) + * (uid_t *) eup = * (uid_t *) rup; + + if (cygwin_debug) { + fprintf(stderr, "Starting uid %ld, gid %ld, ntsec %lu, privileged %d.\n", + myuid, mygid, cygwin_internal(CW_CHECK_NTSEC, NULL), privileged); + fprintf(stderr, "root_uid %ld, exim_uid %ld, exim_gid %ld, config_uid %ld, config_gid %ld.\n", + * (uid_t *) rup, * (uid_t *) eup, * (gid_t *) egp, * (uid_t *) cup, * (gid_t *) cgp); + } + return; +} + +#ifndef OS_LOAD_AVERAGE /* Can be set on command line */ +#define OS_LOAD_AVERAGE /* src/os.c need not provide it */ + +/***************************************************************** + * + Functions for average load measurements + + There are two methods, which work only on NT. + + The first one uses the HKEY_PERFORMANCE_DATA registry to + get performance data. It is complex but well documented + and works on all NT versions. + + The second one uses NtQuerySystemInformation. + Its use is discouraged starting with WinXP. + + Until 4.43, the Cygwin port of exim was using the first + method. + +*****************************************************************/ +#define PERF_METHOD2 + +/* Structure to compute the load average efficiently */ +typedef struct { + DWORD Lock; + unsigned long long Time100ns; /* Last measurement time */ + unsigned long long IdleCount; /* Latest cumulative idle time */ + unsigned long long LastCounter; /* Last measurement counter */ + unsigned long long PerfFreq; /* Perf counter frequency */ + int LastLoad; /* Last reported load, or -1 */ +#ifdef PERF_METHOD1 + PPERF_DATA_BLOCK PerfData; /* Pointer to a buffer to get the data */ + DWORD BufferSize; /* Size of PerfData */ + LPSTR * NamesArray; /* Temporary (malloc) buffer for index */ +#endif +} cygwin_perf_t; + +static struct { + HANDLE handle; + pid_t pid; + cygwin_perf_t *perf; +} cygwin_load = {NULL, 0, NULL}; + +#ifdef PERF_METHOD1 +/************************************************************* + METHOD 1 + + Obtaining statistics in Windows is done at a low level by + calling registry functions, in particular the key + HKEY_PERFORMANCE_DATA on NT and successors. + Something equivalent exists on Win95, see Microsoft article + HOWTO: Access the Performance Registry Under Windows 95 (KB 174631) + but it is not implemented here. + + The list of objects to be polled is specified in the string + passed to RegQueryValueEx in ReadStat() below. + On NT, all objects are polled even if info about only one is + required. This is fixed in Windows 2000. See articles + INFO: Perflib Calling Close Procedure in Windows 2000 (KB 270127) + INFO: Performance Data Changes Between Windows NT 4.0 and Windows + 2000 (KB 296523) + + It is unclear to me how the counters are primarily identified. + Whether it's by name strings or by the offset of their strings + as mapped in X:\Winnt\system32\perfc009.dat [or equivalently as + reported by the registry functions in GetNameStrings( ) below]. + Microsoft documentation seems to say that both methods should + work. + + In the interest of speed and language independence, the main + code below relies on offsets. However if debug is enabled, the + code verifies that the names of the corresponding strings are + as expected. + +*****************************************************************/ + +/* Object and counter indices and names */ +#define PROCESSOR_OBJECT_INDEX 238 +#define PROCESSOR_OBJECT_STRING "238" +#define PROCESSOR_OBJECT_NAME "Processor" +#define PROCESSOR_TIME_COUNTER 6 +#define PROCESSOR_TIME_NAME "% Processor Time" + +#define BYTEINCREMENT 800 /* Block to add to PerfData */ + +/***************************************************************** + * + Macros to navigate through the performance data. + + *****************************************************************/ +#define FirstObject(PerfData)\ + ((PPERF_OBJECT_TYPE)((PBYTE)PerfData + PerfData->HeaderLength)) +#define NextObject(PerfObj)\ + ((PPERF_OBJECT_TYPE)((PBYTE)PerfObj + PerfObj->TotalByteLength)) +#define ObjectCounterBlock(PerfObj)\ + ((PPERF_COUNTER_BLOCK)(PBYTE)PerfObj + PerfObj->DefinitionLength ) +#define FirstInstance(PerfObj )\ + ((PPERF_INSTANCE_DEFINITION)((PBYTE)PerfObj + PerfObj->DefinitionLength)) +#define InstanceCounterBlock(PerfInst)\ + ((PPERF_COUNTER_BLOCK) ((PBYTE)PerfInst + PerfInst->ByteLength )) +#define NextInstance(PerfInst )\ + ((PPERF_INSTANCE_DEFINITION)((PBYTE)InstanceCounterBlock(PerfInst) + \ + InstanceCounterBlock(PerfInst)->ByteLength) ) +#define FirstCounter(PerfObj)\ + ((PPERF_COUNTER_DEFINITION) ((PBYTE)PerfObj + PerfObj->HeaderLength)) +#define NextCounter(PerfCntr)\ + ((PPERF_COUNTER_DEFINITION)((PBYTE)PerfCntr + PerfCntr->ByteLength)) + +/***************************************************************** + * + Load the counter and object names from the registry + to cygwin_load.perf->NameStrings + and index them in cygwin_load.perf->NamesArray + + NameStrings seems to be taken from the file + X:\Winnt\system32\perfc009.dat + + This is used only for name verification during initialization, + if DEBUG(D_load) is TRUE. + +*****************************************************************/ +static BOOL GetNameStrings( ) +{ + HKEY hKeyPerflib; // handle to registry key + DWORD dwArraySize; // size for array + DWORD dwNamesSize; // size for strings + LPSTR lpCurrentString; // pointer for enumerating data strings + DWORD dwCounter; // current counter index + LONG res; + + /* Get the number of Counter items into dwArraySize. */ + if ((res = RegOpenKeyEx( HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib", + 0, + KEY_QUERY_VALUE, /* KEY_READ, */ + &hKeyPerflib)) + != ERROR_SUCCESS) { + DEBUG(D_load) debug_printf("RegOpenKeyEx (1): error %ld (Windows)\n", res); + return FALSE; + } + dwNamesSize = sizeof(dwArraySize); /* Temporary reuse */ + if ((res = RegQueryValueEx( hKeyPerflib, + "Last Counter", + NULL, + NULL, + (LPBYTE) &dwArraySize, + &dwNamesSize )) + != ERROR_SUCCESS) { + DEBUG(D_load) debug_printf("RegQueryValueEx (1): error %ld (Windows)\n", res); + return FALSE; + } + RegCloseKey( hKeyPerflib ); + /* Open the key containing the counter and object names. */ + if ((res = RegOpenKeyEx( HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib\\009", + 0, + KEY_READ, + &hKeyPerflib)) + != ERROR_SUCCESS) { + DEBUG(D_load) debug_printf("RegOpenKeyEx (2): error %ld (Windows)\n", res); + return FALSE; + } + /* Get the size of the Counter value in the key + and then read the value in the tail of NamesArray */ + dwNamesSize = 0; + lpCurrentString = NULL; + while (1) { + res = RegQueryValueEx( hKeyPerflib, + "Counter", + NULL, + NULL, + (unsigned char *) lpCurrentString, + &dwNamesSize); + if ((res == ERROR_SUCCESS) && /* Bug (NT 4.0): SUCCESS was returned on first call */ + (cygwin_load.perf->NamesArray != NULL)) break; + if ((res == ERROR_SUCCESS) || /* but cygwin_load.perf->NamesArrays == NULL */ + (res == ERROR_MORE_DATA)) { + /* Allocate memory BOTH for the names array and for the counter and object names */ + if ((cygwin_load.perf->NamesArray = + (LPSTR *) malloc( (dwArraySize + 1) * sizeof(LPSTR) + dwNamesSize * sizeof(CHAR))) + != NULL) { + /* Point to area for the counter and object names */ + lpCurrentString = (LPSTR) & cygwin_load.perf->NamesArray[dwArraySize + 1]; + continue; + } + DEBUG(D_load) debug_printf("Malloc: errno %d (%s)\n", errno, strerror(errno)); + } + else { /* Serious error */ + DEBUG(D_load) debug_printf("RegQueryValueEx (2): error %ld (Windows)\n", res); + } + return FALSE; + } + RegCloseKey( hKeyPerflib ); + /* Index the names into an array. */ + while (*lpCurrentString) { + dwCounter = atol( lpCurrentString ); + lpCurrentString += (lstrlen(lpCurrentString)+1); + cygwin_load.perf->NamesArray[dwCounter] = lpCurrentString; + lpCurrentString += (strlen(lpCurrentString)+1); + } + return TRUE; +} + +/***************************************************************** + * + Find the value of the Processor Time counter + +*****************************************************************/ +static BOOL ReadTimeCtr(PPERF_OBJECT_TYPE PerfObj, + PPERF_COUNTER_DEFINITION CurCntr, + PPERF_COUNTER_BLOCK PtrToCntr, + unsigned long long * TimePtr){ + int j; + /* Scan all counters. */ + for( j = 0; j < PerfObj->NumCounters; j++ ) { + if (CurCntr->CounterNameTitleIndex == PROCESSOR_TIME_COUNTER) { + /* Verify it is really the proc time counter */ + if ((CurCntr->CounterType != PERF_100NSEC_TIMER_INV) || /* Wrong type */ + ((cygwin_load.perf->NamesArray != NULL) && /* Verify name */ + (strcmp(cygwin_load.perf->NamesArray[CurCntr->CounterNameTitleIndex], + PROCESSOR_TIME_NAME)))) { + log_write(0, LOG_MAIN|LOG_PANIC, + "Incorrect Perf counter type or name %x %s", + (unsigned) CurCntr->CounterType, + cygwin_load.perf->NamesArray[CurCntr->CounterNameTitleIndex]); + return FALSE; + } + *TimePtr += *(unsigned long long int *) ((PBYTE) PtrToCntr + CurCntr->CounterOffset); + return TRUE; /* return TRUE as soon as we found the counter */ + } + /* Get the next counter. */ + CurCntr = NextCounter( CurCntr ); + } + return FALSE; +} + +/***************************************************************** + * + ReadStat() + Measures current Time100ns and IdleCount + Return TRUE if success. + + *****************************************************************/ +static BOOL ReadStat(unsigned long long int *Time100nsPtr, + unsigned long long int * IdleCountPtr) +{ + PPERF_OBJECT_TYPE PerfObj; + PPERF_INSTANCE_DEFINITION PerfInst; + PPERF_COUNTER_DEFINITION PerfCntr; + PPERF_COUNTER_BLOCK PtrToCntr; + DWORD i, k, res; + + /* Get the performance data for the Processor object + There is no need to open a key. + We may need to blindly increase the buffer size. + BufferSize does not return info but may be changed */ + while (1) { + DWORD BufferSize = cygwin_load.perf->BufferSize; + res = RegQueryValueEx( HKEY_PERFORMANCE_DATA, + PROCESSOR_OBJECT_STRING, + NULL, + NULL, + (LPBYTE) cygwin_load.perf->PerfData, + &BufferSize ); + if (res == ERROR_SUCCESS) break; + if (res == ERROR_MORE_DATA ) { + /* Increment if necessary to get a buffer that is big enough. */ + cygwin_load.perf->BufferSize += BYTEINCREMENT; + if ((cygwin_load.perf->PerfData = + (PPERF_DATA_BLOCK) realloc( cygwin_load.perf->PerfData, cygwin_load.perf->BufferSize )) + != NULL) continue; + DEBUG(D_load) debug_printf("Malloc: errno %d (%s)\n", errno, strerror(errno)); + } + else { /* Serious error */ + DEBUG(D_load) debug_printf("RegQueryValueEx (3): error %ld (Windows)\n", res); + } + return FALSE; + } + /* Initialize the counters */ + *Time100nsPtr = 0; + *IdleCountPtr = 0; + /* We should only have one object, but write general code just in case. */ + PerfObj = FirstObject( cygwin_load.perf->PerfData ); + for( i = 0; i < cygwin_load.perf->PerfData->NumObjectTypes; i++ ) { + /* We are only interested in the processor object */ + if ( PerfObj->ObjectNameTitleIndex == PROCESSOR_OBJECT_INDEX) { + /* Possibly verify it is really the Processor object. */ + if ((cygwin_load.perf->NamesArray != NULL) && + (strcmp(cygwin_load.perf->NamesArray[PerfObj->ObjectNameTitleIndex], + PROCESSOR_OBJECT_NAME))) { + log_write(0, LOG_MAIN|LOG_PANIC, + "Incorrect Perf object name %s", + cygwin_load.perf->NamesArray[PerfObj->ObjectNameTitleIndex]); + return FALSE; + } + /* Get the first counter */ + PerfCntr = FirstCounter( PerfObj ); + /* See if the object has instances. + It should, but write general code. */ + if( PerfObj->NumInstances != PERF_NO_INSTANCES ) { + PerfInst = FirstInstance( PerfObj ); + for( k = 0; k < PerfObj->NumInstances; k++ ) { + /* There can be several processors. + Accumulate both the Time100ns and the idle counter. + Starting with Win2000 there is an instance named "_Total". + Do not use it. We only use instances with a single + character in the name. + If we examine the object names, we also look at the instance + names and their lengths and issue reports */ + if ( cygwin_load.perf->NamesArray != NULL) { + CHAR ascii[30]; /* The name is in unicode */ + wsprintf(ascii,"%.29lS", + (char *)((PBYTE)PerfInst + PerfInst->NameOffset)); + log_write(0, LOG_MAIN, + "Perf: Found processor instance \"%s\", length %d", + ascii, PerfInst->NameLength); + if ((PerfInst->NameLength != 4) && + (strcmp(ascii, "_Total") != 0)) { + log_write(0, LOG_MAIN|LOG_PANIC, + "Perf: WARNING: Unexpected processor instance name"); + return FALSE; + } + } + if (PerfInst->NameLength == 4) { + *Time100nsPtr += cygwin_load.perf->PerfData->PerfTime100nSec.QuadPart; + PtrToCntr = InstanceCounterBlock(PerfInst); + if (! ReadTimeCtr(PerfObj, PerfCntr, PtrToCntr, IdleCountPtr)) { + return FALSE; + } + } + PerfInst = NextInstance( PerfInst ); + } + return (*Time100nsPtr != 0); /* Something was read */ + } + else { /* No instance, just the counter data */ + *Time100nsPtr = cygwin_load.perf->PerfData->PerfTime100nSec.QuadPart; + PtrToCntr = ObjectCounterBlock(PerfObj); + return ReadTimeCtr(PerfObj, PerfCntr, PtrToCntr, IdleCountPtr); + } + } + PerfObj = NextObject( PerfObj ); + } + return FALSE; /* Did not find the Processor object */ +} + +#elif defined(PERF_METHOD2) + +/************************************************************* + METHOD 2 + + Uses NtQuerySystemInformation. + This requires definitions that are not part of + standard include files. +*************************************************************/ +#include + +typedef enum _SYSTEM_INFORMATION_CLASS +{ + SystemBasicInformation = 0, + SystemPerformanceInformation = 2, + SystemTimeOfDayInformation = 3, + SystemProcessesAndThreadsInformation = 5, + SystemProcessorTimes = 8, + SystemPagefileInformation = 18, + /* There are a lot more of these... */ +} SYSTEM_INFORMATION_CLASS; + +typedef struct _SYSTEM_BASIC_INFORMATION +{ + ULONG Unknown; + ULONG MaximumIncrement; + ULONG PhysicalPageSize; + ULONG NumberOfPhysicalPages; + ULONG LowestPhysicalPage; + ULONG HighestPhysicalPage; + ULONG AllocationGranularity; + ULONG LowestUserAddress; + ULONG HighestUserAddress; + ULONG ActiveProcessors; + UCHAR NumberProcessors; +} SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION; + +typedef struct __attribute__ ((aligned (8))) _SYSTEM_PROCESSOR_TIMES +{ + LARGE_INTEGER IdleTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER DpcTime; + LARGE_INTEGER InterruptTime; + ULONG InterruptCount; +} SYSTEM_PROCESSOR_TIMES, *PSYSTEM_PROCESSOR_TIMES; + +typedef NTSTATUS NTAPI (*NtQuerySystemInformation_t) (SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG); +typedef ULONG NTAPI (*RtlNtStatusToDosError_t) (NTSTATUS); + +static NtQuerySystemInformation_t NtQuerySystemInformation; +static RtlNtStatusToDosError_t RtlNtStatusToDosError; + +/***************************************************************** + * + LoadNtdll() + Load special functions from the NTDLL + Return TRUE if success. + + *****************************************************************/ + +static BOOL LoadNtdll() +{ + HINSTANCE hinstLib; + + if ((hinstLib = LoadLibrary("NTDLL.DLL")) + && (NtQuerySystemInformation = + (NtQuerySystemInformation_t) GetProcAddress(hinstLib, + "NtQuerySystemInformation")) + && (RtlNtStatusToDosError = + (RtlNtStatusToDosError_t) GetProcAddress(hinstLib, + "RtlNtStatusToDosError"))) + return TRUE; + + DEBUG(D_load) + debug_printf("perf: load: %ld (Windows)\n", GetLastError()); + return FALSE; +} + +/***************************************************************** + * + ReadStat() + Measures current Time100ns and IdleCount + Return TRUE if success. + + *****************************************************************/ + +static BOOL ReadStat(unsigned long long int *Time100nsPtr, + unsigned long long int *IdleCountPtr) +{ + NTSTATUS ret; + SYSTEM_BASIC_INFORMATION sbi; + PSYSTEM_PROCESSOR_TIMES spt; + + *Time100nsPtr = *IdleCountPtr = 0; + + if ((ret = NtQuerySystemInformation(SystemBasicInformation, + (PVOID) &sbi, sizeof sbi, NULL)) + != STATUS_SUCCESS) { + DEBUG(D_load) + debug_printf("Perf: NtQuerySystemInformation: %lu (Windows)\n", + RtlNtStatusToDosError(ret)); + } + else if (!(spt = (PSYSTEM_PROCESSOR_TIMES) alloca(sizeof(spt[0]) * sbi.NumberProcessors))) { + DEBUG(D_load) + debug_printf("Perf: alloca: errno %d (%s)\n", errno, strerror(errno)); + } + else if ((ret = NtQuerySystemInformation(SystemProcessorTimes, (PVOID) spt, + sizeof spt[0] * sbi.NumberProcessors, NULL)) + != STATUS_SUCCESS) { + DEBUG(D_load) + debug_printf("Perf: NtQuerySystemInformation: %lu (Windows)\n", + RtlNtStatusToDosError(ret)); + } + else { + int i; + for (i = 0; i < sbi.NumberProcessors; i++) { + *Time100nsPtr += spt[i].KernelTime.QuadPart;; + *Time100nsPtr += spt[i].UserTime.QuadPart; + *IdleCountPtr += spt[i].IdleTime.QuadPart; + } + return TRUE; + } + return FALSE; +} +#endif /* PERF_METHODX */ + +/***************************************************************** + * + InitLoadAvg() + Initialize the cygwin_load.perf structure. + and set cygwin_load.perf->Flag to TRUE if successful. + This is called the first time os_getloadavg is called + *****************************************************************/ +static void InitLoadAvg(cygwin_perf_t *this) +{ + BOOL success = TRUE; + + /* Get perf frequency and counter */ + QueryPerformanceFrequency((LARGE_INTEGER *)& this->PerfFreq); + QueryPerformanceCounter((LARGE_INTEGER *)& this->LastCounter); + +#ifdef PERF_METHOD1 + DEBUG(D_load) { + /* Get the name strings through the registry + to verify that the object and counter numbers + have the names we expect */ + success = GetNameStrings(); + } +#endif + /* Get initial values for Time100ns and IdleCount */ + success = success + && ReadStat( & this->Time100ns, + & this->IdleCount); + /* If success, set the Load to 0, else to -1 */ + if (success) this->LastLoad = 0; + else { + log_write(0, LOG_MAIN, "Cannot obtain Load Average"); + this->LastLoad = -1; + } +#ifdef PERF_METHOD1 + /* Free the buffer created for debug name verification */ + if (this->NamesArray != NULL) { + free(this->NamesArray); + this->NamesArray = NULL; + } +#endif +} + + +/***************************************************************** + * + os_getloadavg() + + Return -1 if not available; + Return the previous value if less than AVERAGING sec old. + else return the processor load on a [0 - 1000] scale. + + The first time we are called we initialize the counts + and return 0 or -1. + The initial load cannot be measured as we use the processor 100% +*****************************************************************/ +static SECURITY_ATTRIBUTES sa = {sizeof (SECURITY_ATTRIBUTES), NULL, TRUE}; +#define AVERAGING 10 + +int os_getloadavg() +{ + unsigned long long Time100ns, IdleCount, CurrCounter; + int value; + pid_t newpid; + + /* New process. + Reload the dlls and the file mapping */ + if ((newpid = getpid()) != cygwin_load.pid) { + BOOL new; + cygwin_load.pid = newpid; + +#ifdef PERF_METHOD2 + if (!LoadNtdll()) { + log_write(0, LOG_MAIN, "Cannot obtain Load Average"); + cygwin_load.perf = NULL; + return -1; + } +#endif + + if ((new = !cygwin_load.handle)) { + cygwin_load.handle = CreateFileMapping (INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, + 0, sizeof(cygwin_perf_t), NULL); + DEBUG(D_load) + debug_printf("Perf: CreateFileMapping: handle %x\n", (unsigned) cygwin_load.handle); + } + cygwin_load.perf = (cygwin_perf_t *) MapViewOfFile (cygwin_load.handle, + FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); + DEBUG(D_load) + debug_printf("Perf: MapViewOfFile: addr %x\n", (unsigned) cygwin_load.perf); + if (new && cygwin_load.perf) + InitLoadAvg(cygwin_load.perf); + } + + /* Check if initialized OK */ + if (!cygwin_load.perf || cygwin_load.perf->LastLoad < 0) + return -1; + + /* If we cannot get the lock, we return 0. + This is to prevent any lock-up possibility. + Finding a lock busy is unlikely, and giving up only + results in an immediate delivery .*/ + + if (InterlockedCompareExchange(&cygwin_load.perf->Lock, 1, 0)) { + DEBUG(D_load) + debug_printf("Perf: Lock busy\n"); + return 0; + } + + /* Get the current time (PerfCounter) */ + QueryPerformanceCounter((LARGE_INTEGER *)& CurrCounter); + /* Calls closer than AVERAGING sec apart use the previous value */ + if (CurrCounter - cygwin_load.perf->LastCounter > + AVERAGING * cygwin_load.perf->PerfFreq) { + /* Get Time100ns and IdleCount */ + if (ReadStat( & Time100ns, & IdleCount)) { /* Success */ + /* Return processor load on 1000 scale */ + value = 1000 - ((1000 * (IdleCount - cygwin_load.perf->IdleCount)) / + (Time100ns - cygwin_load.perf->Time100ns)); + cygwin_load.perf->Time100ns = Time100ns; + cygwin_load.perf->IdleCount = IdleCount; + cygwin_load.perf->LastCounter = CurrCounter; + cygwin_load.perf->LastLoad = value; + DEBUG(D_load) + debug_printf("Perf: New load average %d\n", value); + } + else { /* Something bad happened. + Refuse to measure the load anymore + but don't bother releasing the buffer */ + log_write(0, LOG_MAIN, "Cannot obtain Load Average"); + cygwin_load.perf->LastLoad = -1; + } + } + else + DEBUG(D_load) + debug_printf("Perf: Old load average %d\n", cygwin_load.perf->LastLoad); + cygwin_load.perf->Lock = 0; + return cygwin_load.perf->LastLoad; +} +#endif /* OS_LOAD_AVERAGE */ +#endif /* COMPILE_UTILITY */ diff --git a/OS/os.h-AIX b/OS/os.h-AIX new file mode 100644 index 0000000..f3a84f2 --- /dev/null +++ b/OS/os.h-AIX @@ -0,0 +1,23 @@ +/* Exim: OS-specific C header file for AIX */ +/* Written by Nick Waterman */ +/* Modified by Philip Hazel with data from + Niels Provos + Juozas Simkevicius for load averages +*/ + +#define HAVE_DEV_KMEM +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/unix" +#define LOAD_AVG_TYPE int +#define FSCALE 65536.0 + +#define HAVE_SYS_VFS_H +#define HAVE_SYS_STATFS_H + +/* Now tell AIX to emulate BSD as badly as it can. */ + +#define _BSD 44 + +typedef struct flock flock_t; + +/* End */ diff --git a/OS/os.h-BSDI b/OS/os.h-BSDI new file mode 100644 index 0000000..cd91936 --- /dev/null +++ b/OS/os.h-BSDI @@ -0,0 +1,11 @@ +/* Exim: OS-specific C header file for BSDI */ + +#define HAVE_BSD_GETLOADAVG +#define HAVE_SETCLASSRESOURCES +#define HAVE_MMAP +#define HAVE_SYS_MOUNT_H +#define SIOCGIFCONF_GIVES_ADDR + +typedef struct flock flock_t; + +/* End */ diff --git a/OS/os.h-DGUX b/OS/os.h-DGUX new file mode 100644 index 0000000..838ddd9 --- /dev/null +++ b/OS/os.h-DGUX @@ -0,0 +1,25 @@ +/* Exim: OS-specific C header file for DGUX */ + +/* Written by Ken Bailey (K.Bailey@rbgkew.org.uk) Feb 1998 */ +/* on dgux R4.11MU04 generic AViiON mc88100 */ +/* Modified Dec 1998 by PH after message from Ken. */ + +#define HAVE_SYS_STATVFS_H +#define F_FAVAIL f_favail + +#define NO_SYSEXITS /* DGUX doesn't ship sysexits.h */ +#define NO_IP_VAR_H /* DGUX has no netinet/ip_var.h */ + +#define os_strsignal dg_strsignal +#define OS_STRSIGNAL + +#define HAVE_MMAP + +/* The definition of ipoptions in netinet/in.h (masquerading as ip_opts) used +in smtp_in.c is for Intel DG _IX86_ABI only. You may be able to get this to +work on Intel DG but it's certainly easier to skip it on M88k. This means we +forego the detection of some source-routing based IP attacks. */ + +#define NO_IP_OPTIONS + +/* End */ diff --git a/OS/os.h-Darwin b/OS/os.h-Darwin new file mode 100644 index 0000000..559003f --- /dev/null +++ b/OS/os.h-Darwin @@ -0,0 +1,45 @@ +/* Exim: OS-specific C header file for Darwin (Mac OS X) */ + +/* #define CRYPT_H */ /* Apparently this isn't needed */ + +#define HAVE_MMAP +#define HAVE_SYS_MOUNT_H +#define PAM_H_IN_PAM +#define SIOCGIFCONF_GIVES_ADDR + +/* OSX 10.2 does not have poll.h, 10.3 does emulate it badly. */ +#define NO_POLL_H + +#define F_FREESP O_TRUNC +typedef struct flock flock_t; + +#define BASE_62 36 /* HFS+ aliases lower and upper cases in filenames. + Consider reducing MAX_LOCALHOST_NUMBER */ + +#ifndef _BSD_SOCKLEN_T_ +#define _BSD_SOCKLEN_T_ int32_t /* socklen_t (duh) */ +#endif + +/* Settings for handling IP options. There's no netinet/ip_var.h. The IP +option handling is in the style of the later GLIBCs but the GLIBC macros +aren't set, so we invent a new one. */ + +#define NO_IP_VAR_H +#define DARWIN_IP_OPTIONS + +/* Need this for the DNS lookup code. Remember to remove if we get round to +updating Exim to use the newer interface. */ + +#define BIND_8_COMPAT + +/* It's not .so for dynamic libraries on Darwin. */ +#define DYNLIB_FN_EXT "dylib" + +/* We currently need some assistance getting OFF_T_FMT correct on MacOS */ +#ifdef OFF_T_FMT +# undef OFF_T_FMT +#endif +#define OFF_T_FMT "%lld" +#define LONGLONG_T long int + +/* End */ diff --git a/OS/os.h-DragonFly b/OS/os.h-DragonFly new file mode 100644 index 0000000..669bb23 --- /dev/null +++ b/OS/os.h-DragonFly @@ -0,0 +1,10 @@ +/* Exim: OS-specific C header file for DragonFly */ + +#define HAVE_BSD_GETLOADAVG +#define HAVE_MMAP +#define HAVE_SYS_MOUNT_H +#define SIOCGIFCONF_GIVES_ADDR + +typedef struct flock flock_t; + +/* End */ diff --git a/OS/os.h-FreeBSD b/OS/os.h-FreeBSD new file mode 100644 index 0000000..c5ed042 --- /dev/null +++ b/OS/os.h-FreeBSD @@ -0,0 +1,13 @@ +/* Exim: OS-specific C header file for FreeBSD */ + +#define HAVE_BSD_GETLOADAVG +#define HAVE_SETCLASSRESOURCES +#define HAVE_MMAP +#define HAVE_SYS_MOUNT_H +#define SIOCGIFCONF_GIVES_ADDR +#define HAVE_SRANDOMDEV +#define HAVE_ARC4RANDOM + +typedef struct flock flock_t; + +/* End */ diff --git a/OS/os.h-GNU b/OS/os.h-GNU new file mode 100644 index 0000000..cc4da0e --- /dev/null +++ b/OS/os.h-GNU @@ -0,0 +1,20 @@ +/* Exim: OS-specific C header file for GNU/Hurd */ + +#define CRYPT_H +#define GLIBC_IP_OPTIONS +#define HAVE_BSD_GETLOADAVG +#define HAVE_MMAP +#define HAVE_SYS_VFS_H +#define NO_IP_VAR_H +#define SIG_IGN_WORKS +#define SIOCGIFCONF_GIVES_ADDR + +#define F_FREESP O_TRUNC +typedef struct flock flock_t; + +#define os_strsignal strsignal +#define OS_STRSIGNAL + +/* Hurd-specific bits below */ + +/* End */ diff --git a/OS/os.h-GNUkFreeBSD b/OS/os.h-GNUkFreeBSD new file mode 100644 index 0000000..e60690f --- /dev/null +++ b/OS/os.h-GNUkFreeBSD @@ -0,0 +1,22 @@ +/* Exim: OS-specific C header file for GNU/kFreeBSD */ + +#define CRYPT_H +#define GLIBC_IP_OPTIONS +#define HAVE_MMAP +#define HAVE_BSD_GETLOADAVG +#define HAVE_SYS_VFS_H +#define NO_IP_VAR_H +#define SIG_IGN_WORKS + +#define F_FREESP O_TRUNC +typedef struct flock flock_t; + +#define os_strsignal strsignal +#define OS_STRSIGNAL + +/* kFreeBSD-specific bits below */ + +#define HAVE_SYS_MOUNT_H +#define SIOCGIFCONF_GIVES_ADDR + +/* End */ diff --git a/OS/os.h-GNUkNetBSD b/OS/os.h-GNUkNetBSD new file mode 100644 index 0000000..121f2d3 --- /dev/null +++ b/OS/os.h-GNUkNetBSD @@ -0,0 +1,22 @@ +/* Exim: OS-specific C header file for GNU/kNetBSD */ + +#define CRYPT_H +#define GLIBC_IP_OPTIONS +#define HAVE_MMAP +#define HAVE_BSD_GETLOADAVG +#define HAVE_SYS_VFS_H +#define NO_IP_VAR_H +#define SIG_IGN_WORKS + +#define F_FREESP O_TRUNC +typedef struct flock flock_t; + +#define os_strsignal strsignal +#define OS_STRSIGNAL + +/* kNetBSD-specific bits below */ + +#define HAVE_SYS_MOUNT_H +#define SIOCGIFCONF_GIVES_ADDR + +/* End */ diff --git a/OS/os.h-HI-OSF b/OS/os.h-HI-OSF new file mode 100644 index 0000000..76bd429 --- /dev/null +++ b/OS/os.h-HI-OSF @@ -0,0 +1,9 @@ +/* Exim: OS-specific C header file for HI-OSF/1-MJ and HI-UX/MPP */ + +#define HAVE_SYS_MOUNT_H + +typedef struct flock flock_t; +#define F_FREESP O_TRUNC +#define DN_EXPAND_ARG4_TYPE u_char * + +/* End */ diff --git a/OS/os.h-HI-UX b/OS/os.h-HI-UX new file mode 100644 index 0000000..97b83ed --- /dev/null +++ b/OS/os.h-HI-UX @@ -0,0 +1,18 @@ +/* Exim: OS-specific C header file for HI-UX */ + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE double +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/HI-UX" +#define FSCALE 1.0 + +#define HAVE_SYS_VFS_H + +#define SELECT_ARG2_TYPE int +#define F_FREESP O_TRUNC +#define NEED_H_ERRNO 1 + +typedef struct flock flock_t; + +/* End */ diff --git a/OS/os.h-HP-UX b/OS/os.h-HP-UX new file mode 100644 index 0000000..87e4dfc --- /dev/null +++ b/OS/os.h-HP-UX @@ -0,0 +1,27 @@ +/* Exim: OS-specific C header file for HP-UX versions greater than 9 */ + +#define ICONV_ARG2_TYPE char ** +#define EXIM_SOCKLEN_T size_t + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE double +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/stand/vmunix" +#define FSCALE 1.0 + +#define HAVE_SYS_STATVFS_H + +#define F_FREESP O_TRUNC +#define NEED_H_ERRNO 1 + +typedef struct flock flock_t; + +typedef struct __res_state *res_state; + +#define LLONG_MIN LONG_LONG_MIN +#define LLONG_MAX LONG_LONG_MAX + +#define strtoll(a,b,c) strtoimax(a,b,c) + +/* End */ diff --git a/OS/os.h-HP-UX-9 b/OS/os.h-HP-UX-9 new file mode 100644 index 0000000..dab965e --- /dev/null +++ b/OS/os.h-HP-UX-9 @@ -0,0 +1,20 @@ +/* Exim: OS-specific C header file for HP-UX version 9 */ + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE double +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/hp-ux" +#define FSCALE 1.0 + +#define HAVE_SYS_VFS_H + +#define SELECT_ARG2_TYPE int +#define F_FREESP O_TRUNC +#define NEED_H_ERRNO 1 + +#define killpg(pgid,sig) kill(-(pgid),sig) + +typedef struct flock flock_t; + +/* End */ diff --git a/OS/os.h-IRIX b/OS/os.h-IRIX new file mode 100644 index 0000000..ac5a6b3 --- /dev/null +++ b/OS/os.h-IRIX @@ -0,0 +1,20 @@ +/* Exim: OS-specific C header file for IRIX */ + +#define DN_EXPAND_ARG4_TYPE u_char * + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE long +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/unix" +#define FSCALE 1000.0 + +#define HAVE_MMAP +#define HAVE_SYS_STATVFS_H +#define F_FAVAIL f_favail +#define vfork fork + +/* Other OS have "const" in here */ +#define ICONV_ARG2_TYPE char ** + +/* End */ diff --git a/OS/os.h-IRIX6 b/OS/os.h-IRIX6 new file mode 100644 index 0000000..c41a234 --- /dev/null +++ b/OS/os.h-IRIX6 @@ -0,0 +1,19 @@ +/* Exim: OS-specific C header file for IRIX */ + +#define CRYPT_H +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE long +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/unix" +#define FSCALE 1000.0 + +#define HAVE_MMAP +#define HAVE_SYS_STATVFS_H +#define F_FAVAIL f_favail +#define vfork fork + +/* Other OS have "const" in here */ +#define ICONV_ARG2_TYPE char ** + +/* End */ diff --git a/OS/os.h-IRIX632 b/OS/os.h-IRIX632 new file mode 100644 index 0000000..0196931 --- /dev/null +++ b/OS/os.h-IRIX632 @@ -0,0 +1,21 @@ +/* Exim: OS-specific C header file for IRIX */ + +#define CRYPT_H +#define DN_EXPAND_ARG4_TYPE u_char * + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE long +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/unix" +#define FSCALE 1000.0 + +#define HAVE_MMAP +#define HAVE_SYS_STATVFS_H +#define F_FAVAIL f_favail +#define vfork fork + +/* Other OS have "const" in here */ +#define ICONV_ARG2_TYPE char ** + +/* End */ diff --git a/OS/os.h-IRIX65 b/OS/os.h-IRIX65 new file mode 100644 index 0000000..683c66a --- /dev/null +++ b/OS/os.h-IRIX65 @@ -0,0 +1,19 @@ +/* Exim: OS-specific C header file for IRIX 6.5 */ + +#define CRYPT_H +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE long +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/unix" +#define FSCALE 1000.0 + +#define HAVE_MMAP +#define HAVE_SYS_STATVFS_H +#define F_FAVAIL f_favail +#define vfork fork + +/* Other OS have "const" in here */ +#define ICONV_ARG2_TYPE char ** + +/* End */ diff --git a/OS/os.h-Linux b/OS/os.h-Linux new file mode 100644 index 0000000..3fead17 --- /dev/null +++ b/OS/os.h-Linux @@ -0,0 +1,72 @@ +/* Exim: OS-specific C header file for Linux */ + +/* Some old systems we've received bug-reports for have a which +does not pull in . Best to just pull it in now and have done +with the issue. */ + +#include + + +#define CRYPT_H +#define GLIBC_IP_OPTIONS +#define HAVE_MMAP +#define HAVE_BSD_GETLOADAVG +#define HAVE_SYS_STATVFS_H +#define NO_IP_VAR_H +#define SIG_IGN_WORKS + +/* When using the DKIM, setting HAVE_LINUX_SENDFILE can increase +performance on outgoing mail a bit. Note: With older glibc versions +this setting will conflict with the _FILE_OFFSET_BITS=64 setting +defined as part of the Linux CFLAGS. */ + +/* #define HAVE_LINUX_SENDFILE */ + +#define F_FREESP O_TRUNC +typedef struct flock flock_t; + +#define os_strsignal strsignal +#define OS_STRSIGNAL + +#if defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__NetBSD_kernel__) +#define SIOCGIFCONF_GIVES_ADDR +#define HAVE_SYS_MOUNT_H +#endif + +#if defined(__linux__) + +/* Some versions of Linux need explicit sync-ing of directories as well as +files. This setting requests that. If the directory is on NFS, it may not +be possible to sync it - in that case, Exim now should ignore the error. But +if you have problems in that area, try undefining this. But be aware that you +may be in a situation where files are not being properly "committed to stable +storage" as quickly as Exim thinks they are. */ + +#define NEED_SYNC_DIRECTORY + +/* Other OS have "const" in here */ +#define ICONV_ARG2_TYPE char ** + +#define os_find_running_interfaces os_find_running_interfaces_linux + +/* Need a prototype for the Linux-specific function. The structure hasn't +been defined yet, so we need to pre-declare it. */ + +struct ip_address_item; +extern struct ip_address_item *os_find_running_interfaces_linux(void); + +#endif /* __linux__ */ + +/* Some folks running "unusual" setups with very old libc environments have +found that _GNU_SOURCE=1 before is not sufficient to define some +constants needed for 64-bit arithmetic. If you encounter build errors based +on LLONG_MIN being undefined and various other escape hatches have not helped, +then change the 0 to 1 in the next block. */ + +#if 0 +# define LLONG_MIN LONG_LONG_MIN +# define LLONG_MAX LONG_LONG_MAX +#endif + + +/* End */ diff --git a/OS/os.h-NetBSD b/OS/os.h-NetBSD new file mode 100644 index 0000000..19a8ac0 --- /dev/null +++ b/OS/os.h-NetBSD @@ -0,0 +1,25 @@ +/* Exim: OS-specific C header file for NetBSD */ + +#define HAVE_BSD_GETLOADAVG +#define HAVE_GETIFADDRS +#define HAVE_MMAP +#define HAVE_SYS_MOUNT_H +#define SIOCGIFCONF_GIVES_ADDR +#define HAVE_ARC4RANDOM + +typedef struct flock flock_t; + +#define os_strsignal strsignal +#define OS_STRSIGNAL + +#define os_get_dns_resolver_res __res_get_state +#define os_put_dns_resolver_res(RP) __res_put_state(RP) +#define OS_GET_DNS_RESOLVER_RES + +#include + +#if __NetBSD_Version__ >= 299000900 +#define HAVE_SYS_STATVFS_H +#endif + +/* End */ diff --git a/OS/os.h-NetBSD-a.out b/OS/os.h-NetBSD-a.out new file mode 100644 index 0000000..29a8fee --- /dev/null +++ b/OS/os.h-NetBSD-a.out @@ -0,0 +1,5 @@ +/* Exim: OS-specific C header file for NetBSD (a.out binary format) */ + +#include "../OS/os.h-NetBSD" /* Same as for ELF format */ + +/* End */ diff --git a/OS/os.h-OSF1 b/OS/os.h-OSF1 new file mode 100644 index 0000000..f04a5b7 --- /dev/null +++ b/OS/os.h-OSF1 @@ -0,0 +1,19 @@ +/* Exim: OS-specific C header file for OSF1 */ + +#define HAVE_SYS_MOUNT_H +#define HAVE_GETIPNODEBYNAME 1 + +typedef struct flock flock_t; +#define F_FREESP O_TRUNC + +/* This was here for some time, but it seems that now (June 2005) things have +changed. */ +/* #define EXIM_SOCKLEN_T size_t */ + +/* Still not "socklen_t", which is the most common setting */ +#define EXIM_SOCKLEN_T int + +/* The default for this is "const char **" */ +#define ICONV_ARG2_TYPE char ** + +/* End */ diff --git a/OS/os.h-OpenBSD b/OS/os.h-OpenBSD new file mode 100644 index 0000000..55bade6 --- /dev/null +++ b/OS/os.h-OpenBSD @@ -0,0 +1,16 @@ +/* Exim: OS-specific C header file for OpenBSD */ + +#define HAVE_BSD_GETLOADAVG +#define HAVE_MMAP +#define HAVE_SYS_MOUNT_H +#define SIOCGIFCONF_GIVES_ADDR +#define HAVE_ARC4RANDOM + +typedef struct flock flock_t; + +#define os_strsignal strsignal +#define OS_STRSIGNAL + +typedef struct __res_state *res_state; + +/* End */ diff --git a/OS/os.h-OpenUNIX b/OS/os.h-OpenUNIX new file mode 100644 index 0000000..90be8d5 --- /dev/null +++ b/OS/os.h-OpenUNIX @@ -0,0 +1,16 @@ +/* Exim: OS-specific C header file for OpenUNIX */ + +#define NO_SYSEXITS + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE short +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/stand/unix" +#define FSCALE 256 + +#define HAVE_SYS_STATVFS_H +#define _SVID3 +#define NEED_H_ERRNO + +/* End */ diff --git a/OS/os.h-QNX b/OS/os.h-QNX new file mode 100644 index 0000000..106b0a6 --- /dev/null +++ b/OS/os.h-QNX @@ -0,0 +1,21 @@ +/* Exim: OS-specific C header file for QNX */ +/* Modified for QNX 6.2.0 with diffs from Samuli Tuomola. */ + +#include + +/* This include is wrapped in an ifdef so as to be skipped for QNXRTP, which +doesn't have/need this header file. From Karsten P. Hoffmann. */ + +#ifdef __QNX__ +#include +#endif + +#undef HAVE_STATFS +#undef HAVE_VFS_H +#undef HAVE_SYS_MOUNT_H + +#define NO_SYSEXITS + +extern int h_errno; + +/* End */ diff --git a/OS/os.h-SCO b/OS/os.h-SCO new file mode 100644 index 0000000..07d21bd --- /dev/null +++ b/OS/os.h-SCO @@ -0,0 +1,18 @@ +/* Exim: OS-specific C header file for SCO */ + +#define DN_EXPAND_ARG4_TYPE u_char * + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE short +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/unix" +#define FSCALE 256 +#define EXIM_SOCKLEN_T int + +#define HAVE_SYS_STATVFS_H +#define F_FAVAIL f_favail +#define _SVID3 +#define NEED_H_ERRNO + +/* End */ diff --git a/OS/os.h-SCO_SV b/OS/os.h-SCO_SV new file mode 100644 index 0000000..486fcbe --- /dev/null +++ b/OS/os.h-SCO_SV @@ -0,0 +1,16 @@ +/* Exim: OS-specific C header file for SCO_SV */ + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE short +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/unix" +#define FSCALE 256 +#define EXIM_SOCKLEN_T int + +#define HAVE_SYS_STATVFS_H +#define F_FAVAIL f_favail +#define _SVID3 +#define NEED_H_ERRNO + +/* End */ diff --git a/OS/os.h-SunOS4 b/OS/os.h-SunOS4 new file mode 100644 index 0000000..b0deefc --- /dev/null +++ b/OS/os.h-SunOS4 @@ -0,0 +1,36 @@ +/* Exim: OS-specific C header file for SunOS4 */ + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE long +#define LOAD_AVG_SYMBOL "_avenrun" +#define KERNEL_PATH "/vmunix" + +#define HAVE_MMAP +#define HAVE_SYS_VFS_H + +#define F_FREESP O_TRUNC +#define EXIT_FAILURE 1 +#define EXIT_SUCCESS 0 +typedef struct flock flock_t; + +#define STRERROR_FROM_ERRLIST +#define memmove(a, b, c) bcopy(b, a, c) +#define strtoul(str, ptr, base) ((unsigned int)strtol((str),(ptr),(base))) + +extern char *strerror(int); +extern int sys_nerr; +extern char *sys_errlist[]; + +/* In ANSI C strtod() is defined in stdlib.h, but in SunOS4 it is defined in +floatingpoint.h which is called from math.h, which Exim doesn't include. */ + +extern double strtod(const char *, char **); + +/* SunOS4 seems to define getc, ungetc, feof and ferror as macros only, not +as functions. We need to have them as assignable functions. Setting this +flag causes this to get done in exim.h. */ + +#define FUDGE_GETC_AND_FRIENDS + +/* End */ diff --git a/OS/os.h-SunOS5 b/OS/os.h-SunOS5 new file mode 100644 index 0000000..8bc0799 --- /dev/null +++ b/OS/os.h-SunOS5 @@ -0,0 +1,31 @@ +/* Exim: OS-specific C header file for SunOS5 aka Solaris */ + +#define CRYPT_H +#define HAVE_MMAP +#define HAVE_SYS_STATVFS_H +#define F_FAVAIL f_favail +#define SIOCGIFCONF_GIVES_ADDR + +#define HAVE_GETIPNODEBYNAME 1 +#define HAVE_GETIPNODEBYADDR 1 + +#define HAVE_KSTAT +#define LOAD_AVG_KSTAT "system_misc" +#define LOAD_AVG_KSTAT_MODULE "unix" +#define LOAD_AVG_SYMBOL "avenrun_1min" +#define LOAD_AVG_FIELD value.ui32 + +#define os_strsignal strsignal +#define OS_STRSIGNAL + +/* This is needed for some early Solaris releases, but causes trouble +in the current ones, so it is out by default. */ + +/* #define EXIM_SOCKLEN_T size_t */ + +/* This is different from Linux and all other PAM implementations, +it seems. */ + +#define PAM_CONVERSE_ARG2_TYPE struct pam_message + +/* End */ diff --git a/OS/os.h-SunOS5-hal b/OS/os.h-SunOS5-hal new file mode 100644 index 0000000..044e09b --- /dev/null +++ b/OS/os.h-SunOS5-hal @@ -0,0 +1,11 @@ +/* Exim: OS-specific C header file for SunOS5 on HAL */ + +#define HAVE_MMAP + +#define HAVE_KSTAT +#define LOAD_AVG_KSTAT "system_misc" +#define LOAD_AVG_KSTAT_MODULE "unix" +#define LOAD_AVG_SYMBOL "avenrun_1min" +#define LOAD_AVG_FIELD value.ul + +/* End */ diff --git a/OS/os.h-ULTRIX b/OS/os.h-ULTRIX new file mode 100644 index 0000000..9985af2 --- /dev/null +++ b/OS/os.h-ULTRIX @@ -0,0 +1,15 @@ +/* Exim: OS-specific C header file for Ultrix */ + +/* Well, it *does* have statfs(), but its structure is called something +different, all the members have different names, and the function returns +1 on success rather than 0. As this is for a minority function, and I think +a minority operating system, easiest just to say "no" until someone asks. */ + +#undef HAVE_STATFS + +#define F_FREESP O_TRUNC +#define NEED_H_ERRNO +#define NO_OPENLOG +typedef struct flock flock_t; + +/* End */ diff --git a/OS/os.h-UNIX_SV b/OS/os.h-UNIX_SV new file mode 100644 index 0000000..9ad824a --- /dev/null +++ b/OS/os.h-UNIX_SV @@ -0,0 +1,22 @@ +/* Exim: OS-specific C header file for SCO SVR4.2 (and maybe Unixware) */ + +/** +*** Note that for SCO 5 the configuration file is called SCO_SV, +*** and that Unixware7 has its own configuration. This is an old +*** file that is retained for compatibility. +**/ + +#define NO_SYSEXITS + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE short +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/stand/unix" +#define FSCALE 256 + +#define HAVE_SYS_STATVFS_H +#define _SVID3 +#define NEED_H_ERRNO + +/* End */ diff --git a/OS/os.h-USG b/OS/os.h-USG new file mode 100644 index 0000000..1c780ee --- /dev/null +++ b/OS/os.h-USG @@ -0,0 +1,16 @@ +/* Exim: OS-specific C header file for Unixware 2.x */ + +#define NO_SYSEXITS + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE short +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/stand/unix" +#define FSCALE 256 + +#define HAVE_SYS_STATVFS_H +#define _SVID3 +#define NEED_H_ERRNO + +/* End */ diff --git a/OS/os.h-Unixware7 b/OS/os.h-Unixware7 new file mode 100644 index 0000000..1592094 --- /dev/null +++ b/OS/os.h-Unixware7 @@ -0,0 +1,19 @@ +/* Exim: OS-specific C header file for Unixware 7 */ + +#define NO_SYSEXITS + +#define ICONV_ARG2_TYPE char ** +#define EXIM_SOCKLEN_T size_t + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE short +#define LOAD_AVG_SYMBOL "avenrun" +#define KERNEL_PATH "/stand/unix" +#define FSCALE 256 + +#define HAVE_SYS_STATVFS_H +#define _SVID3 +#define NEED_H_ERRNO + +/* End */ diff --git a/OS/os.h-cygwin b/OS/os.h-cygwin new file mode 100644 index 0000000..740300a --- /dev/null +++ b/OS/os.h-cygwin @@ -0,0 +1,51 @@ +/* Exim: OS-specific C header file for Cygwin */ + +/* This code was supplied by Pierre A. Humblet */ + +/* Define the OS_INIT macro that we insert in exim.c:main() + to set the root and exim uid depending on the system */ +/* We use a special routine to initialize */ +void cygwin_init(int, char **, void *, void *, void *, void *, void *); +#define OS_INIT\ + cygwin_init(argc, (char **) argv, &root_uid, &exim_uid, &exim_gid, &config_uid, &config_gid); + +/* We need a special mkdir that + allows names starting with // */ +#include /* Do not redefine mkdir in sys/stat.h */ +int cygwin_mkdir( const char *_path, mode_t __mode ); +#define mkdir cygwin_mkdir /* redefine mkdir elsewhere */ + +/* Redefine the set*id calls to run when faking root */ +#include /* Do not redefine in unitsd.h */ +int cygwin_setuid(uid_t uid ); +int cygwin_setgid(gid_t gid ); +#define setuid cygwin_setuid +#define setgid cygwin_setgid + +extern unsigned int cygwin_WinVersion; + +#define BASE_62 36 /* Windows aliases lower and upper cases in filenames. + Consider reducing MAX_LOCALHOST_NUMBER */ +#define CRYPT_H +#define HAVE_MMAP +#define HAVE_SYS_VFS_H +#define NO_IP_VAR_H +#define NO_IP_OPTIONS +#define F_FREESP O_TRUNC +/* Defining LOAD_AVG_NEEDS_ROOT causes an initial + call to os_getloadavg. In our case this is beneficial + because it initializes the counts */ +#define LOAD_AVG_NEEDS_ROOT + +typedef struct flock flock_t; + +/* Macro to define variable length SID structures */ +#define SID(n, name, sid...) \ +struct { \ + BYTE Revision; \ + BYTE SubAuthorityCount; \ + SID_IDENTIFIER_AUTHORITY IdentifierAuthority; \ + DWORD SubAuthority[n]; \ +} name = { SID_REVISION, n, {SECURITY_NT_AUTHORITY}, {sid}} + +/* End */ diff --git a/OS/os.h-mips b/OS/os.h-mips new file mode 100644 index 0000000..79f3ff2 --- /dev/null +++ b/OS/os.h-mips @@ -0,0 +1,24 @@ +/* Exim: OS-specific C header file for RiscOS4bsd */ + +#define LOAD_AVG_NEEDS_ROOT +#define HAVE_DEV_KMEM +#define LOAD_AVG_TYPE long +#define LOAD_AVG_SYMBOL "_avenrun" +#define KERNEL_PATH "/unix" + +#define HAVE_MMAP +#define HAVE_SYS_VFS_H + +#define F_FREESP O_TRUNC +#define EXIT_FAILURE 1 +#define EXIT_SUCCESS 0 +typedef struct flock flock_t; + +#define STRERROR_FROM_ERRLIST +#define memmove(a, b, c) bcopy(b, a, c) + +extern char *strerror(int); +extern int sys_nerr; +extern char *sys_errlist[]; + +/* End */ diff --git a/README b/README new file mode 100644 index 0000000..652cee6 --- /dev/null +++ b/README @@ -0,0 +1,349 @@ +THE EXIM MAIL TRANSFER AGENT VERSION 4 +-------------------------------------- + +Copyright (c) 1995 - 2012 University of Cambridge. +See the file NOTICE for conditions of use and distribution. + +There is a book about Exim by Philip Hazel called "The Exim SMTP Mail Server", +published by UIT Cambridge in May 2003. This is the official guide for Exim 4. +The current edition covers release 4.10 and a few later extensions. + +The O'Reilly book about Exim ("Exim The Mail Transfer Agent" by Philip Hazel) +covers Exim 3, which is now deprecated. Exim 4 has a large number of changes +from Exim 3, though the basic structure and philosophy remains the same. The +older book may be helpful for the background, but a lot of the detail has +changed, so it is likely to be confusing to newcomers. + +There is a web site at http://www.exim.org; this contains details of the +mailing list exim-users@exim.org. + +A copy of the Exim FAQ should be available from the same source that you used +to obtain the Exim distribution. Additional formats for the documentation +(PostScript, PDF, Texinfo, and HTML) should also be available there. + + +EXIM DISTRIBUTION +----------------- + +Unpacking the tar file should produce a single directory called exim-, +containing the following files and directories: + +ACKNOWLEDGMENTS some acknowledgments +CHANGES a conventional file name; it indirects to some files in doc/ +LICENCE the GNU General Public Licence +Local/ an empty directory for local configuration files +Makefile top level Makefile +NOTICE notice about conditions of use +OS/ directory containing OS-specific files +README this file +README.UPDATING special notes about updating from previous versions +doc/ directory of documentation files +exim_monitor/ directory of source files for the Exim monitor +scripts/ directory of scripts used in the build process +src/ directory of source files +util/ directory of independent utilities + +Please see the documentation files for full instructions on how to build, +install, and run Exim. For straightforward installations on operating systems +to which Exim has already been ported, the building process is as follows: + +. Ensure that the top-level Exim directory (e.g. exim-4.80) is the current + directory (containing the files and directories listed above). + +. Edit the file called src/EDITME and put the result in a new file called + Local/Makefile. There are comments in src/EDITME telling you what the various + parameters are. You must at least provide values for BIN_DIRECTORY, + CONFIGURE_FILE, EXIM_USER and EXIM_GROUP (if EXIM_USER is numeric), and it is + recommended that SPOOL_DIRECTORY also be defined here if it is a fixed path. + +. There are a number of additional parameters whose defaults can also be + overridden by additions to Local/Makefile. The basic defaults are in + OS/Makefile-Default, but these settings are overridden for some operating + systems by values on OS/Makefile-. The most commonly-required change + is probably the setting of CC, which defines the command to run the C + compiler, and which defaults to gcc. To change it to cc, add the following + line to Local/Makefile: + + CC=cc + + If you are running the Berkeley DB package as your dbm library, then it is + worth putting USE_DB=yes in Local/Makefile, to get Exim to use the native + interface. This is the default for some operating systems. See + doc/dbm.discuss.txt for discussion on dbm libraries. + +. If you want to compile the Exim monitor, edit the file called + exim_monitor/EDITME and put the result in a file called Local/eximon.conf. + If you are not going to compile the Exim monitor, you should have commented + out the line starting EXIM_MONITOR= when creating Local/Makefile. There are + comments in exim_monitor/EDITME about the values set therein, but in this + case everything can be defaulted if you wish. + +. If your system is not POSIX compliant by default, then you might experience + fewer problems if you help point the build tools to the POSIX variants. For + instance, on Solaris: + + PATH=/usr/xpg4/bin:$PATH make SHELL=/usr/xpg4/bin/sh + +. Type "make". This will determine what your machine's architecture and + operating system are, and create a build directory from those names (e.g. + "build-SunOS5-sparc"). Symbolic links are created from the build directory + to the source directory. A configured make file called /makefile + is then created, and "make" then goes on to use this to build various + binaries and scripts inside the build directory. + +. Type "make install", while running as root, to install the binaries, + scripts, and a default configuration file. To see what this command is + going to do before risking it, run "../scripts/exim_install -n" (not as + root) from within the build directory. + +. When you are ready to try running Exim, see the section entitled "Testing" + in the chapter called "Building and Installing Exim" in doc/spec.txt, or in + one of the other forms of the documentation. + +. Running the install script does NOT replace /usr/sbin/sendmail or + /usr/lib/sendmail with a link to Exim. That step you must perform by hand + when you are satisfied that Exim is running correctly. + +. Note that the default configuration refers to an alias file called + /etc/aliases. It used to be the case that every Unix had that file, because + it was the Sendmail default. These days, there are systems that don't have + /etc/aliases, so you might need to set it up. Your aliases should at least + include an alias for "postmaster". + +. Consider notifying users of the change of MTA. Exim has different + capabilities, and there are various operational differences, such as stricter + adherence to the RFCs than some MTAs, and differences in the text of + messages produced by various command-line options. + +. The default configuration file will use your host's fully qualified name (as + obtained from the uname() function) as the only local mail domain and as the + domain which is used to qualify unqualified local mail addresses. See the + comments in the default configuration file if you want to change these. + +The operating systems currently supported are: AIX, BSD/OS (aka BSDI), Darwin +(Mac OS X), DGUX, FreeBSD, GNU/Hurd, GNU/Linux, HI-OSF (Hitachi), HP-UX, IRIX, +MIPS RISCOS, NetBSD, OpenBSD, QNX, SCO, SCO SVR4.2 (aka UNIX-SV), Solaris (aka +SunOS5), SunOS4, Tru64-Unix (formerly Digital Unix, formerly DEC-OSF1), Ultrix, +and Unixware. However, code is not available for determining system load +averages on Ultrix. There are also configuration files for compiling Exim in +the Cygwin environment that can be installed on systems running Windows. +However, the documentation supplied with the distribution does not contain any +information about running Exim in the Cygwin environment. + + +******* Modifying the building process ****** + +Instructions for overriding the build-time options for Exim are given in the +manual. You should never have to modify any of the supplied files; it should be +possible to override everything that is necessary by creating suitable files in +the Local directory. This means that you won't need to redo your modifications +for the next release of Exim. If you find you can't avoid changing some other +file, let me know and I'll see if I can find a way of making that unnecessary. + +Briefly, the building process concatenates a number of files in order to +construct its working makefile. If and are the operating +system and architecture types respectively, the files used are: + + OS/Makefile-Default + OS/Makefile- + Local/Makefile + Local/Makefile- + Local/Makefile- + Local/Makefile-- + OS/Makefile-Base + +Of the Local/* files, only Local/Makefile is required to exist; the rest are +optional. Because of the way "make" works, values set in later files override +values set in earlier ones. Thus you can set up general options that are +overridden for specify operating systems and/or architectures if you wish. + + +******* IMPORTANT FOR GNU/LINUX USERS ******* + +Exim 4 won't work with some versions of Linux if you put its spool directory on +an NFS partition. You get an error about "directory sync failed". This is +because of a bug in Linux NFS. A fix has been promised in due course. It is in +any case much better to put Exim's spool directory on local disc. + +If you get an error complaining about the lack of functions such as dbm_open() +when building Exim, the problem is that it hasn't been able to find a DBM +library. See the file doc/dbm.discuss.txt for a discussion about the various +DBM libraries. + +Different versions of Linux come with different DBM libraries, stored in +different places. As well as setting USE_DB=yes in Local/Makefile if Berkeley +DB is in use, it may also be necessary to set a value in DBMLIB to specify the +inclusion of the DBM library, for example: DBMLIB=-ldb or DBMLIB=-lgdbm. + +If you are using RedHat 7.0, which has DB3 as its DBM library, you need to +install the db-devel package before building Exim. This will have a name like +db3-devel-3.1.14-16.i386.rpm (but check which release of DB3 you have). + +The building scripts now distinguish between versions of Linux with the older +libc5 and the more recent ones that use libc6. In the latter case, USE_DB and +-ldb are the default settings, because DB is standard with libc6. + +It appears that with glibc-2.1.x (a minor libc upgrade), they have standardised +on Berkeley DB2 (instead of DB1 in glibc-2.0.x). If you want to get DB1 back, +you need to set + + INCLUDE=-I/usr/include/db1 + DBMLIB=-ldb1 + +in your Local/Makefile. If you omit DBMLIB=-ldb1 Exim will link successfully +using the DB1 compatibility interface to DB2, but it will expect the file +format to be that of DB2, and so will not be able to read existing DB1 files. + + +******* IMPORTANT FOR FREEBSD USERS ******* + +On FreeBSD there is a file called /etc/mail/mailer.conf which selects what to +run for various MTA calls. Instead of changing /usr/sbin/sendmail, you should +edit this file instead, to read something like this: + +sendmail /usr/exim/bin/exim +send-mail /usr/exim/bin/exim +mailq /usr/exim/bin/exim -bp +newaliases /usr/bin/true + +You will most probably need to add the line: + +daily_status_include_submit_mailq="NO" # No separate 'submit' queue + +to /etc/periodic.conf. This stops FreeBSD running the command "mailq -Ac" +(which Exim doesn't understand) to list a separate submit queue (which Exim +doesn't have). + +If you are using FreeBSD prior to 3.0-RELEASE, and you are not using the ports +mechanism to install Exim, then you should install the perl5 package +(/usr/local/bin/perl) and use that instead of perl in the base system, which is +perl4 up until 3.0-RELEASE. If you are using the ports mechanism, this is +handled for you. + +If you are upgrading from version 2.11 of Exim or earlier, and you are using +DBM files, and you did not previously have USE_DB=yes in your Local/Makefile, +then you will either have to put USE_DB=no in your Local/Makefile or (better) +rebuild your DBM data files. The default for FreeBSD has been changed to +USE_DB=yes, since FreeBSD comes with Berkeley DB. However, using the native DB +interface means that the data files no longer have the ".db" extension. + + + +******* IMPORTANT FOR Tru64 (aka Digital Unix aka DEC-OSF1) USERS ******* + +The default compiler may not recognize ANSI C by default. You may have to set + +CC=cc +CFLAGS=-std1 + +in Local/Makefile in order to compile Exim. A user reported another small +problem with this operating system: In the file /usr/include/net/if.h a +semicolon was missing at the end of line 143. + + + +******* IMPORTANT FOR SCO USERS ******* + +The building scripts assume the existence of the "ar" command, which is part of +the Development System. However, it is also possible to use the "gar" command +that is part of the GNU utilities that are distributed with the 5.0.7 release. +If you have "gar" and not "ar" you should include + +AR=gar + +in your Local/Makefile. + + + +******* IMPORTANT FOR Unixware 2.x USERS ******* + +Unixware does not include db/dbm/ndbm with its standard compiler (it is +available with /usr/ucb/cc, but that has bugs of its own). You should install +gcc and Berkeley DB (or another dbm library if you really insist). If you use a +different dbm library you will need to override the default setting of DBMLIB. + +DB 1.85 and 2.x can be found at http://www.sleepycat.com/. They have different +characteristics. See the discussion of dbm libraries in doc/dbm.discuss.txt. DB +needs to be compiled with gcc and you need a 'cc' in your path before the +Unixware CC to compile it. + +Don't bother even starting to install exim on Unixware unless you have +installed gcc and use it for everything. + + +******* IMPORTANT FOR SOLARIS 2.3 (SUNOS 5.3) USERS ******* + +The file /usr/include/sysexits.h does not exist on Solaris 2.3 (and presumably +earlier versions), though it is present in 2.4 and later versions. To compile +Exim on Solaris 2.3 it is necessary to include the line + +CFLAGS=-O -DNO_SYSEXITS -DEX_TEMPFAIL=75 + +in your Local/Makefile. + + +******* IMPORTANT FOR IRIX USERS ******* + +There are problems with some versions of gcc on IRIX, as a result of which all +DNS lookups yield either 0.0.0.0 or 255.255.255.255. Releases of gcc after +2.7.2.3 (which works ok) are affected. Specifically, 2.8.* is affected, as are +the 2.95 series. From release 3.21 of Exim, a workaround for this problem +should automatically be enabled when Exim is compiled on IRIX using gcc. + +As from version 2.03 there is IRIX-specific code in Exim to obtain a list of +all the IP addresses on local interfaces, including alias addresses, because +the standard code gives only non-alias addresses in IRIX. The code came from +SGI, with the comment: + +"On 6.2 you need the libc patch to get the sysctl() stub and the networking +kernel patch to get the support." + +It seems that this code doesn't work on at least some earlier versions of IRIX +(e.g. IRIX 5.3). If you can't compile under IRIX and the problem appears to +relate to sysctl(), try commenting or #ifdef-ing out all the code in the +file OS/os.c-IRIX. + + +******* IMPORTANT FOR HP-UX USERS ******* + +There are two different sets of configuration files for HP-UX. Those ending in +HP-UX-9 are used for HP-UX version 9, and have been tested on HP-UX version +9.05. Those ending in HP-UX are for later releases, and have been tested on +HP-UX version 11.00. If you are using a version of HP-UX between 9.05 and +11.00, you may need to edit the file OS/os.h-HP-UX if you encounter problems +building Exim. + +If you want to use the Sieve facility in Exim, the alias iso-8859-1 should be +added to the alias definition for iso81 in /usr/lib/nls/iconv/config.iconv. You +also need to add a new alias definition: "alias utf8 utf-8". + + +******* IMPORTANT FOR QNX USERS ******* + +1. Exim makes some assumptions about the shell in the makefiles. The "normal" + QNX shell (ksh) will not work. You need to install "bash", which can be + obtained from the QNX freeware on QUICS. Install it to /usr/local/bin/bash + Then you need to change the SHELL definition at the top of the main Makefile + to SHELL=/usr/local/bin/bash. The file OS/Makefile-QNX sets the variable + MAKE_SHELL to /usr/local/bin/bash. If you install bash in a different place, + you will need to set MAKE_SHELL in your Local/Makefile in order to override + this. + +2. For some strange reason make will fail at building "exim_dbmbuild" when + called the first time. However simply calling make a second time will solve + the problem. Alternatively, run "make makefile" and then "make". + + +******* IMPORTANT FOR ULTRIX USERS ******* + +You need to set SHELL explicitly in the make call when building on ULTRIX, +that is, type "make SHELL=sh5". + + +******* IMPORTANT FOR GNU/HURD USERS ******* + +GNU/Hurd doesn't (at the time of writing, June 1999) have the ioctls for +finding out the IP addresses of the local interfaces. You therefore have to set +local_interfaces yourself. Otherwise it will treat only 127.0.0.1 as local. + +Philip Hazel diff --git a/README.DSN b/README.DSN new file mode 100644 index 0000000..68d1641 --- /dev/null +++ b/README.DSN @@ -0,0 +1,141 @@ +Exim DSN Patch (4.82) +--------------------- + +This patch is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This patch is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this patch; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +Installation & Usage +-------------------- +See docs/experimental-spec.txt + +Credits +------- + +The original work for the patch was done by Philip Hazel in Exim 3 + +The extract was taken and re-applied to Exim 4 by the following :- +Phil Bingham (phil.bingham@cwipapps.net) +Steve Falla (steve.falla@cwipapps.net) +Ray Edah (ray.edah@cwipapps.net) +Andrew Johnson (andrew.johnson@cwippaps.net) +Adrian Hungate (adrian.hungate@cwipapps.net) + +Now Primarily maintained by :- +Andrew Johnson (andrew.johnson@cwippaps.net) + +Updated for 4.82, improved and submitted to +http://bugs.exim.org/show_bug.cgi?id=118 +by :- +Wolfgang Breyha (wbreyha@gmx.net) + +Contributions +------------- +Andrey J. Melnikoff (TEMHOTA) (temnota@kmv.ru) + + +ChangeLog +--------- +14-Apr-2006 : Changed subject to "Delivery Status Notification" + +17-May-2006 : debug_printf in spool-in.c were not wrapped with #ifndef COMPILE_UTILITY + thanks to Andrey J. Melnikoff for this information + +12-Sep-2006 : Now supports Exim 4.63 + +12-Sep-2006 : src/EDITME did not include the #define SUPPORT_DSN as stated + in the documentation, this has now been corrected + thanks to Robert Kehl for this information + +28-Jul-2008 : New version for exim 4.69 released. + +02-Jul-2010 : New version for exim 4.72 released. + +25-Apr-2014 : Version 1.4 + *) fix ENVID and ORCPT addition in SMTP transport + *) p was not moved to the end of the string. new content + added afterwards overwrites ENVID and/or ORCPT + *) change spool file format to be compatible with the + extensible format of exim 4 by prepending new values and + setting the extended bitmask accordingly + *) use SUPPORT_DSN_LEGACY=yes in Makefile to be able to read + the legacy format of older patches until all messages are out of queue. + *) change "dsn" boolean toggle to "dsn_advertise_hosts" to + be able to select who actually can use the extension + *) Add all RFC 3461 MUST fields to delivery-status section + *) convert xtext in ENVID + *) add all successful rcpts to ONE message instead of sending several messages + +26-Apr-2014 : Version 1.5 + fixes: + *) fixed wrong order for ENVID + *) fixed wrong Final-Recipient value + *) af_ignore_failure is ignored for success reports + *) fixed DSN_LEGACY switch + improvements: + *) added MIME "failure" reports + *) bounce_return_message is ignored (required by RFC) + *) in case RET= is defined we honor these values + otherwise bounce_return_body is honored. + *) bounce_return_size_limit is always honored. + *) message body intro and final text is ignored + *) do not send report if DSN flags say NO + *) added MIME "delay" reports + *) do not send report if DSN flags say NO + *) changed from SUPPORT_DSN to EXPERIMENTAL_DSN + *) updated documentation + +01-May-2014 : Version 1.6 + fixes: + *) code cleanup + *) use text/rfc822-headers were applicable + *) fix NOTIFY=FAILURE + + improvements: + *) do not truncated MIME messages + *) if bounce_return_size_limit is smaller then the actual message + only the header is returned + *) if bounce_return_body or bounce_return_size_limit prevents Exim + from returning the requested (RET=FULL) body this fact is added + as X-Exim-DSN-Information Header + *) this also means that all of the last three parts of the "failure" + template are not used anymore + + *) dsn_process switch removed + *) every router "processes" DSN by default + *) there is no possibilty to "gag" DSN anymore since this violates RFC + *) dsn_lasthop switch added for routers + *) if dsn_lasthop is set by a router it is handled as relaying to a + non DSN aware relay. success mails are sent if Exim successfully + delivers the message. + *) redirect routers always "act" as if dsn_lasthop is set + + *) address_item.dsn_aware changed from uschar to int for easier handling. + +02-May-2014 : fixes: + *) Reporting-MTA: use smtp_active_hostname instead of qualify_domain from + original patch. + +20-May-2014 : fixes: + *) removed support for EXPERIMENTAL_DSN_LEGACY for codebase inclusion + *) fixed build of exim_monitor tree + *) fixed late declaration of dsn_all_lasthop + +----------------- + +Support for this patch up to 1.3 (limited though it is) will only be provided through the SourceForge +project page (http://sourceforge.net/projects/eximdsn/) + +From 1.4 onward feel free to ask on the exim-users mailinglist or add comments to +http://bugs.exim.org/show_bug.cgi?id=118 + diff --git a/README.UPDATING b/README.UPDATING new file mode 100644 index 0000000..590642f --- /dev/null +++ b/README.UPDATING @@ -0,0 +1,757 @@ +This document contains detailed information about incompatibilities that might +be encountered when upgrading from one release of Exim to another. The +information is in reverse order of release numbers. Mostly these are relatively +small points, and the configuration file is normally upwards compatible, but +there have been two big upheavals... + + +************************************************************************** +* There was a big reworking of the way mail routing works for release * +* 4.00. Previously used "directors" were abolished, and all routing is * +* now done by routers. Policy controls for incoming mail are now done by * +* Access Control Lists instead of separate options. All this means that * +* pre-4.00 configuration files have to be massively converted. If you * +* are coming from a 3.xx release, please read the document in the file * +* doc/Exim4.upgrade, and allow some time to complete the upgrade. * +* * +* There was a big reworking of the way domain/host/net/address lists are * +* handled at release 3.00. If you are coming from a pre-3.00 release, it * +* might be easier to start again from a default configuration. Otherwise * +* you need to read doc/Exim3.upgrade and do a double conversion of your * +* configuration file. * +************************************************************************** + + +The rest of this document contains information about changes in 4.xx releases +that might affect a running system. + + +Exim version 4.83 +----------------- + + * SPF condition results renamed "permerror" and "temperror". The old + names are still accepted for back-compatability, for this release. + + * TLS details are now logged on rejects, subject to log selectors. + + * Items in headers_remove lists must now have any embedded list-separators + doubled. + + * Attempted use of the deprecated options "gnutls_require_kx" et. al. + now result in logged warning. + + +Exim version 4.82 +----------------- + + * New option gnutls_allow_auto_pkcs11 defaults false; if you have GnuTLS 2.12.0 + or later and do want PKCS11 modules to be autoloaded, then set this option. + + * A per-transport wait- database is no longer updated if the transport + sets "connection_max_messages" to 1, as it can not be used and causes + unnecessary serialisation and load. External tools tracking the state of + Exim by the hints databases may need modification to take this into account. + + * The av_scanner option can now accept multiple clamd TCP targets, all other + setting limitations remain. + + +Exim version 4.80 +----------------- + + * BEWARE backwards-incompatible changes in SSL libraries, thus the version + bump. See points below for details. + Also an LDAP data returned format change. + + * The value of $tls_peerdn is now print-escaped when written to the spool file + in a -tls_peerdn line, and unescaped when read back in. We received reports + of values with embedded newlines, which caused spool file corruption. + + If you have a corrupt spool file and you wish to recover the contents after + upgrading, then lock the message, replace the new-lines that should be part + of the -tls_peerdn line with the two-character sequence \n and then unlock + the message. No tool has been provided as we believe this is a rare + occurence. + + * For OpenSSL, SSLv2 is now disabled by default. (GnuTLS does not support + SSLv2). RFC 6176 prohibits SSLv2 and some informal surveys suggest no + actual usage. You can re-enable with the "openssl_options" Exim option, + in the main configuration section. Note that supporting SSLv2 exposes + you to ciphersuite downgrade attacks. + + * With OpenSSL 1.0.1+, Exim now supports TLS 1.1 and TLS 1.2. If built + against 1.0.1a then you will get a warning message and the + "openssl_options" value will not parse "no_tlsv1_1": the value changes + incompatibly between 1.0.1a and 1.0.1b, because the value chosen for 1.0.1a + is infelicitous. We advise avoiding 1.0.1a. + + "openssl_options" gains "no_tlsv1_1", "no_tlsv1_2" and "no_compression". + + COMPATIBILITY WARNING: The default value of "openssl_options" is no longer + "+dont_insert_empty_fragments". We default to "+no_sslv2". + That old default was grandfathered in from before openssl_options became a + configuration option. + Empty fragments are inserted by default through TLS1.0, to partially defend + against certain attacks; TLS1.1+ change the protocol so that this is not + needed. The DIEF SSL option was required for some old releases of mail + clients which did not gracefully handle the empty fragments, and was + initially set in Exim release 4.31 (see ChangeLog, item 37). + + If you still have affected mail-clients, and you see SSL protocol failures + with this release of Exim, set: + openssl_options = +dont_insert_empty_fragments + in the main section of your Exim configuration file. You're trading off + security for compatibility. Exim is now defaulting to higher security and + rewarding more modern clients. + + If the option tls_dhparams is set and the parameters loaded from the file + have a bit-count greater than the new option tls_dh_max_bits, then the file + will now be ignored. If this affects you, raise the tls_dh_max_bits limit. + We suspect that most folks are using dated defaults and will not be affected. + + * Ldap lookups returning multi-valued attributes now separate the attributes + with only a comma, not a comma-space sequence. Also, an actual comma within + a returned attribute is doubled. This makes it possible to parse the + attribute as a comma-separated list. Note the distinction from multiple + attributes being returned, where each one is a name=value pair. + + If you are currently splitting the results from LDAP upon a comma, then you + should check carefully to see if adjustments are needed. + + This change lets cautious folks distinguish "comma used as separator for + joining values" from "comma inside the data". + + * accept_8bitmime now defaults on, which is not RFC compliant but is better + suited to today's Internet. See http://cr.yp.to/smtp/8bitmime.html for a + sane rationale. Those who wish to be strictly RFC compliant, or know that + they need to talk to servers that are not 8-bit-clean, now need to take + explicit configuration action to default this option off. This is not a + new option, you can safely force it off before upgrading, to decouple + configuration changes from the binary upgrade while remaining RFC compliant. + + * The GnuTLS support has been mostly rewritten, to use APIs which don't cause + deprecation warnings in GnuTLS 2.12.x. As part of this, these three options + are no longer supported: + + gnutls_require_kx + gnutls_require_mac + gnutls_require_protocols + + Their functionality is entirely subsumed into tls_require_ciphers. In turn, + tls_require_ciphers is no longer an Exim list and is not parsed by Exim, but + is instead given to gnutls_priority_init(3), which expects a priority string; + this behaviour is much closer to the OpenSSL behaviour. See: + + http://www.gnutls.org/manual/html_node/Priority-Strings.html + + for fuller documentation of the strings parsed. The three gnutls_require_* + options are still parsed by Exim and, for this release, silently ignored. + A future release will add warnings, before a later still release removes + parsing entirely and the presence of the options will be a configuration + error. + + Note that by default, GnuTLS will not accept RSA-MD5 signatures in chains. + A tls_require_ciphers value of NORMAL:%VERIFY_ALLOW_SIGN_RSA_MD5 may + re-enable support, but this is not supported by the Exim maintainers. + Our test suite no longer includes MD5-based certificates. + + This rewrite means that Exim will continue to build against GnuTLS in the + future, brings Exim closer to other GnuTLS applications and lets us add + support for SNI and other features more readily. We regret that it wasn't + feasible to retain the three dropped options. + + * If built with TLS support, then Exim will now validate the value of + the main section tls_require_ciphers option at start-up. Before, this + would cause a STARTTLS 4xx failure, now it causes a failure to start. + Running with a broken configuration which causes failures that may only + be left in the logs has been traded off for something more visible. This + change makes an existing problem more prominent, but we do not believe + anyone would deliberately be running with an invalid tls_require_ciphers + option. + + This also means that library linkage issues caused by conflicts of some + kind might take out the main daemon, not just the delivery or receiving + process. Conceivably some folks might prefer to continue delivering + mail plaintext when their binary is broken in this way, if there is a + server that is a candidate to receive such mails that does not advertise + STARTTLS. Note that Exim is typically a setuid root binary and given + broken linkage problems that cause segfaults, we feel it is safer to + fail completely. (The check is not done as root, to ensure that problems + here are not made worse by the check). + + * The "tls_dhparam" option has been updated, so that it can now specify a + path or an identifier for a standard DH prime from one of a few RFCs. + The default for OpenSSL is no longer to not use DH but instead to use + one of these standard primes. The default for GnuTLS is no longer to use + a file in the spool directory, but to use that same standard prime. + The option is now used by GnuTLS too. If it points to a path, then + GnuTLS will use that path, instead of a file in the spool directory; + GnuTLS will attempt to create it if it does not exist. + + To preserve the previous behaviour of generating files in the spool + directory, set "tls_dhparam = historic". Since prior releases of Exim + ignored tls_dhparam when using GnuTLS, this can safely be done before + the upgrade. + + + +Exim version 4.77 +----------------- + + * GnuTLS will now attempt to use TLS 1.2 and TLS 1.1 before TLS 1.0 and SSL3, + if supported by your GnuTLS library. Use the existing + "gnutls_require_protocols" option to downgrade this if that will be a + problem. Prior to this release, supported values were "TLS1" and "SSL3", + so you should be able to update configuration prior to update. + + [nb: gnutls_require_protocols removed in Exim 4.80, instead use + tls_require_ciphers to provide a priority string; see notes above] + + * The match_{string1}{string2} expansion conditions no longer subject + string2 to string expansion, unless Exim was built with the new + "EXPAND_LISTMATCH_RHS" option. Too many people have inadvertently created + insecure configurations that way. If you need the functionality and turn on + that build option, please let the developers know, and know why, so we can + try to provide a safer mechanism for you. + + The match{}{} expansion condition (for regular expressions) is NOT affected. + For match_{s1}{s2}, all list functionality is unchanged. The only + change is that a '$' appearing in s2 will not trigger expansion, but instead + will be treated as a literal $ sign; the effect is very similar to having + wrapped s2 with \N...\N. If s2 contains a named list and the list definition + uses $expansions then those _will_ be processed as normal. It is only the + point at which s2 is read where expansion is inhibited. + + If you are trying to test if two email addresses are equal, use eqi{s1}{s2}. + If you are testing if the address in s1 occurs in the list of items given + in s2, either use the new inlisti{s1}{s2} condition (added in 4.77) or use + the pre-existing forany{s2}{eqi{$item}{s1}} condition. + + +Exim version 4.74 +----------------- + + * The integrated support for dynamically loadable lookup modules has an ABI + change from the modules supported by some OS vendors through an unofficial + patch. Don't try to mix & match. + + * Some parts of the build system are now beginning to assume that the host + environment is POSIX. If you're building on a system where POSIX tools are + not the default, you might have an easier time if you switch to the POSIX + tools. Feel free to report non-POSIX issues as a request for a feature + enhancement, but if the POSIX variants are available then the fix will + probably just involve some coercion. See the README instructions for + building on such hosts. + + +Exim version 4.73 +----------------- + + * The Exim run-time user can no longer be root; this was always + strongly discouraged, but is now prohibited both at build and + run-time. If you need Exim to run routinely as root, you'll need to + patch the source and accept the risk. Here be dragons. + + * Exim will no longer accept a configuration file owned by the Exim + run-time user, unless that account is explicitly the value in + CONFIGURE_OWNER, which we discourage. Exim now checks to ensure that + files are not writeable by other accounts. + + * The ALT_CONFIG_ROOT_ONLY build option is no longer optional and is forced + on; the Exim user can, by default, no longer use -C/-D and retain privilege. + Two new build options mitigate this. + + * TRUSTED_CONFIG_LIST defines a file containing a whitelist of config + files that are trusted to be selected by the Exim user; one per line. + This is the recommended approach going forward. + + * WHITELIST_D_MACROS defines a colon-separated list of macro names which + the Exim run-time user may safely pass without dropping privileges. + Because changes to this involve a recompile, this is not the recommended + approach but may ease transition. The values of the macros, when + overridden, are constrained to match this regex: ^[A-Za-z0-9_/.-]*$ + + * The system_filter_user option now defaults to the Exim run-time user, + rather than root. You can still set it explicitly to root and this + can be done with prior versions too, letting you roll versions + without needing to change this configuration option. + + * ClamAV must be at least version 0.95 unless WITH_OLD_CLAMAV_STREAM is + defined at build time. + + +Exim version 4.70 +----------------- + +1. Experimental Yahoo! Domainkeys support has been dropped in this release. +It has been superceded by a native implementation of its successor DKIM. + +2. Up to version 4.69, Exim came with an embedded version of the PCRE library. +As of 4.70, this is no longer the case. To compile Exim, you will need PCRE +installed. Most OS distributions have ready-made library and development +packages. + + +Exim version 4.68 +----------------- + +1. The internal implementation of the database keys that are used for ACL +ratelimiting has been tidied up. This means that an update to 4.68 might cause +Exim to "forget" previous rates that it had calculated, and reset them to zero. + + +Exim version 4.64 +----------------- + +1. Callouts were setting the name used for EHLO/HELO from $smtp_active_ +hostname. This is wrong, because it relates to the incoming message (and +probably the interface on which it is arriving) and not to the outgoing +callout (which could be using a different interface). This has been +changed to use the value of the helo_data option from the smtp transport +instead - this is what is used when a message is actually being sent. If +there is no remote transport (possible with a router that sets up host +addresses), $smtp_active_hostname is used. This change is mentioned here in +case somebody is relying on the use of $smtp_active_hostname. + +2. A bug has been fixed that might just possibly be something that is relied on +in some configurations. In expansion items such as ${if >{xxx}{yyy}...} an +empty string (that is {}) was being interpreted as if it was {0} and therefore +treated as the number zero. From release 4.64, such strings cause an error +because a decimal number, possibly followed by K or M, is required (as has +always been documented). + +3. There has been a change to the GnuTLS support (ChangeLog/PH/20) to improve +Exim's performance. Unfortunately, this has the side effect of being slightly +non-upwards compatible for versions 4.50 and earlier. If you are upgrading from +one of these earlier versions and you use GnuTLS, you must remove the file +called gnutls-params in Exim's spool directory. If you don't do this, you will +see this error: + + TLS error on connection from ... (DH params import): Base64 decoding error. + +Removing the file causes Exim to recompute the relevant encryption parameters +and cache them in the new format that was introduced for release 4.51 (May +2005). If you are upgrading from release 4.51 or later, there should be no +problem. + + +Exim version 4.63 +----------------- + +When an SMTP error message is specified in a "message" modifier in an ACL, or +in a :fail: or :defer: message in a redirect router, Exim now checks the start +of the message for an SMTP error code. This consists of three digits followed +by a space, optionally followed by an extended code of the form n.n.n, also +followed by a space. If this is the case and the very first digit is the same +as the default error code, the code from the message is used instead. If the +very first digit is incorrect, a panic error is logged, and the default code is +used. This is an incompatible change, but it is not expected to affect many (if +any) configurations. It is possible to suppress the use of the supplied code in +a redirect router by setting the smtp_error_code option false. In this case, +any SMTP code is quietly ignored. + + +Exim version 4.61 +----------------- + +1. The default number of ACL variables of each type has been increased to 20, +and it's possible to compile Exim with more. You can safely upgrade to this +release if you already have messages on the queue with saved ACL variable +values. However, if you downgrade from this release with messages on the queue, +any saved ACL values they may have will be lost. + +2. The default value for rfc1413_query_timeout has been changed from 30s to 5s. + + +Exim version 4.54 +----------------- + +There was a problem with 4.52/TF/02 in that a "name=" option on control= +submission terminated at the next slash, thereby not allowing for slashes in +the name. This has been changed so that "name=" takes the rest of the string as +its data. It must therefore be the last option. + + +Version 4.53 +------------ + +If you are using the experimental Domain Keys support, you must upgrade to +at least libdomainkeys 0.67 in order to run this release of Exim. + + +Version 4.51 +------------ + +1. The format in which GnuTLS parameters are cached (in the file gnutls-params +in the spool directory) has been changed. The new format can also be generated +externally, so it is now possible to update the values from outside Exim. This +has been implemented in an upwards, BUT NOT downwards, compatible manner. +Upgrading should be seamless: when Exim finds that it cannot understand an +existing cache file, it generates new parameters and writes them to the cache +in the new format. If, however, you downgrade from 4.51 to a previous release, +you MUST delete the gnutls-params file in the spool directory, because the +older Exim will not recognize the new format. + +2. When doing a callout as part of verifying an address, Exim was not paying +attention to any local part prefix or suffix that was matched by the router +that accepted the address. It now behaves in the same way as it does for +delivery: the affixes are removed from the local part unless +rcpt_include_affixes is set on the transport. If you have a configuration that +uses prefixes or suffixes on addresses that could be used for callouts, and you +want the affixes to be retained, you must make sure that rcpt_include_affixes +is set on the transport. + +3. Bounce and delay warning messages no longer contain details of delivery +errors, except for explicit messages (e.g. generated by :fail:) and SMTP +responses from remote hosts. + + +Version 4.50 +------------ + +The exicyclog script has been updated to use three-digit numbers in rotated log +files if the maximum number to keep is greater than 99. If you are already +keeping more than 99, there will be an incompatible change when you upgrade. +You will probably want to rename your old log files to the new form before +running the new exicyclog. + + +Version 4.42 +------------ + +RFC 3848 specifies standard names for the "with" phrase in Received: header +lines when AUTH and/or TLS are in use. This is the "received protocol" +field. Exim used to use "asmtp" for authenticated SMTP, without any +indication (in the protocol name) for TLS use. Now it follows the RFC and +uses "esmtpa" if the connection is authenticated, "esmtps" if it is +encrypted, and "esmtpsa" if it is both encrypted and authenticated. These names +appear in log lines as well as in Received: header lines. + + +Version 4.34 +------------ + +Change 4.31/2 gave problems to data ACLs and local_scan() functions that +expected to see a Received: header. I have changed to yet another scheme. The +Received: header is now generated after the body is received, but before the +ACL or local_scan() is called. After they have run, the timestamp in the +Received: header is updated. + +Thus, change (a) of 4.31/2 has been reversed, but change (b) is still true, +which is lucky, since I decided it was a bug fix. + + +Version 4.33 +------------ + +If an expansion in a condition on a "warn" statement fails because a lookup +defers, the "warn" statement is abandoned, and the next ACL statement is +processed. Previously this caused the whole ACL to be aborted. + + +Version 4.32 +------------ + +Change 4.31/2 has been reversed, as it proved contentious. Recipient callout +verification now uses <> in the MAIL command by default, as it did before. A +new callout option, "use_sender", has been added to request the other +behaviour. + + +Version 4.31 +------------ + +1. If you compile Exim to use GnuTLS, it now requires the use of release 1.0.0 + or greater. The interface to the obsolete 0.8.x releases is no longer + supported. There is one externally visible change: the format for the + display of Distinguished Names now uses commas as a separator rather than a + slash. This is to comply with RFC 2253. + +2. When a message is received, the Received: header line is now generated when + reception is complete, instead of at the start of reception. For messages + that take a long time to come in, this changes the meaning of the timestamp. + There are several side-effects of this change: + + (a) If a message is rejected by a DATA or non-SMTP ACL, or by local_scan(), + the logged header lines no longer include the local Received: line, + because it has not yet been created. If the message is a non-SMTP one, + and the error is processed by sending a message to the sender, the copy + of the original message that is returned does not have an added + Received: line. + + (b) When a filter file is tested using -bf, no additional Received: header + is added to the test message. After some thought, I decided that this + is a bug fix. + + The contents of $received_for are not affected by this change. This + variable still contains the single recipient of a message, copied after + addresses have been rewritten, but before local_scan() is run. + +2. Recipient callout verification, like sender verification, was using <> in + the MAIL FROM command. This isn't really the right thing, since the actual + sender may affect whether the remote host accepts the recipient or not. I + have changed it to use the actual sender in the callout; this means that + the cache record is now keyed on a recipient/sender pair, not just the + recipient address. There doesn't seem to be a real danger of callout loops, + since a callout by the remote host to check the sender would use <>. + + +Version 4.30 +------------ + +1. I have abolished timeout_DNS as an error that can be detected in retry + rules, because it has never worked. Despite the fact that it has been + documented since at least release 1.62, there was no code to support it. + If you have used it in your retry rules, you will now get a warning message + to the log and panic log. It is now treated as plain "timeout". + +2. After discussion on the mailing list, Exim no longer adds From:, Date:, or + Message-Id: header lines to messages that do not originate locally, that is, + messages that have an associated sending host address. + +3. When looking up a host name from an IP address, Exim now tries the DNS + first, and only if that fails does it use gethostbyaddr() (or equivalent). + This change was made because on some OS, not all the names are given for + addresses with multiple PTR records via the gethostbyaddr() interface. The + order of lookup can be changed by setting host_lookup_order. + + +Version 4.23 +------------ + +1. The new FIXED_NEVER_USERS build-time option creates a list of "never users" + that cannot be overridden. The default in the distributed EDITME is "root". + If for some reason you were (against advice) running deliveries as root, you + will have to ensure that FIXED_NEVER_USERS is not set in your + Local/Makefile. + +2. The ${quote: operator now quotes an empty string, which it did not before. + +3. Version 4.23 saves the contents of the ACL variables with the message, so + that they can be used later. If one of these variables contains a newline, + there will be a newline character in the spool that will not be interpreted + correctely by a previous version of Exim. (Exim ignores keyed spool file + items that it doesn't understand - precisely for this kind of problem - but + it expects them all to be on one line.) + + So the bottom line is: if you have newlines in your ACL variables, you + cannot retreat from 4.23. + + +Version 4.21 +------------ + +1. The idea of the "warn" ACL verb is that it adds a header or writes to the + log only when "message" or "log_message" are set. However, if one of the + conditions was an address verification, or a call to a nested ACL, the + messages generated by the underlying test were being passed through. This + no longer happens. The underlying message is available in $acl_verify_ + message for both "message" and "log_message" expansions, so it can be + passed through if needed. + +2. The way that the $h_ (and $header_) expansions work has been changed by the + addition of RFC 2047 decoding. See the main documentation (the NewStuff file + until release 4.30, then the manual) for full details. Briefly, there are + now three forms: + + $rh_xxx: and $rheader_xxx: give the original content of the header + line(s), with no processing at all. + + $bh_xxx: and $bheader_xxx: remove leading and trailing white space, and + then decode base64 or quoted-printable "words" within the header text, + but do not do charset translation. + + $h_xxx: and $header_xxx: attempt to translate the $bh_ string to a + standard character set. + + If you have previously been using $h_ expansions to access the raw + characters, you should change to $rh_ instead. + +3. When Exim creates an RFC 2047 encoded word in a header line, it labels it + with the default character set from the headers_charset option instead of + always using iso-8859-1. + +4. If TMPDIR is defined in Local/Makefile (default in src/EDITME is + TMPDIR="/tmp"), Exim checks for the presence of an environment variable + called TMPDIR, and if it finds it is different, it changes its value. + +5. Following a discussion on the list, the rules by which Exim recognises line + endings on incoming messages have been changed. The -dropcr and drop_cr + options are now no-ops, retained only for backwards compatibility. The + following line terminators are recognized: LF CRLF CR. However, special + processing applies to CR: + + (i) The sequence CR . CR does *not* terminate an incoming SMTP message, + nor a local message in the state where . is a terminator. + + (ii) If a bare CR is encountered in a header line, an extra space is added + after the line terminator so as not to end the header. The reasoning + behind this is that bare CRs in header lines are most likely either + to be mistakes, or people trying to play silly games. + +6. The code for using daemon_smtp_port, local_interfaces, and the -oX options + has been reorganized. It is supposed to be backwards compatible, but it is + mentioned here just in case I've screwed up. + + + +Version 4.20 +------------ + +1. I have tidied and re-organized the code that uses alarm() for imposing time + limits on various things. It shouldn't affect anything, but if you notice + processes getting stuck, it may be that I've broken something. + +2. The "arguments" log selector now also logs the current working directory + when Exim is called. + +3. An incompatible change has been made to the appendfile transport. This + affects the case when it is used for file deliveries that are set up by + .forward and filter files. Previously, any settings of the "file" or + "directory" options were ignored. It is hoped that, like the address_file + transport in the default configuration, these options were never in fact set + on such transports, because they were of no use. + + Now, if either of these options is set, it is used. The path that is passed + by the router is in $address_file (this is not new), so it can be used as + part of a longer path, or modified in any other way that expansion permits. + + If neither "file" nor "directory" is set, the behaviour is unchanged. + +4. Related to the above: in a filter, if a "save" command specifies a non- + absolute path, the value of $home/ is pre-pended. This no longer happens if + $home is unset or is set to an empty string. + +5. Multiple file deliveries from a filter or .forward file can never be + batched; the value of batch_max on the transport is ignored for file + deliveries. I'm assuming that nobody ever actually set batch_max on the + address_file transport - it would have had odd effects previously. + +6. DESTDIR is the more common variable that ROOT for use when installing + software under a different root filing system. The Exim install script now + recognizes DESTDIR first; if it is not set, ROOT is used. + +7. If DESTDIR is set when installing Exim, it no longer prepends its value to + the path of the system aliases file that appears in the default + configuration (when a default configuration is installed). If an aliases + file is actually created, its name *does* use the prefix. + + +Version 4.14 +------------ + +1. The default for the maximum number of unknown SMTP commands that Exim will +accept before dropping a connection has been reduced from 5 to 3. However, you +can now change the value by setting smtp_max_unknown_commands. + +2. The ${quote: operator has been changed so that it turns newline and carriage +return characters into \n and \r, respectively. + +3. The file names used for maildir messages now include the microsecond time +fraction as well as the time in seconds, to cope with systems where the process +id can be re-used within the same second. The format is now + +