Imported Upstream version 4.84 upstream/4.84
authorClinton Ebadi <clinton@unknownlamer.org>
Thu, 14 May 2015 03:12:14 +0000 (23:12 -0400)
committerClinton Ebadi <clinton@unknownlamer.org>
Thu, 14 May 2015 03:12:14 +0000 (23:12 -0400)
372 files changed:
.gitattributes [new file with mode: 0644]
.gitignore [new file with mode: 0644]
ABOUT [new file with mode: 0644]
ACKNOWLEDGMENTS [new file with mode: 0644]
CHANGES [new file with mode: 0644]
CONTRIBUTING [new file with mode: 0644]
LICENCE [new file with mode: 0644]
LICENSE.opendmarc [new file with mode: 0644]
Makefile [new file with mode: 0644]
NOTICE [new file with mode: 0644]
OS/Makefile-AIX [new file with mode: 0644]
OS/Makefile-BSDI [new file with mode: 0644]
OS/Makefile-Base [new file with mode: 0644]
OS/Makefile-CYGWIN [new file with mode: 0644]
OS/Makefile-DGUX [new file with mode: 0644]
OS/Makefile-Darwin [new file with mode: 0644]
OS/Makefile-Default [new file with mode: 0644]
OS/Makefile-DragonFly [new file with mode: 0644]
OS/Makefile-FreeBSD [new file with mode: 0644]
OS/Makefile-GNU [new file with mode: 0644]
OS/Makefile-GNUkFreeBSD [new file with mode: 0644]
OS/Makefile-GNUkNetBSD [new file with mode: 0644]
OS/Makefile-HI-OSF [new file with mode: 0644]
OS/Makefile-HI-UX [new file with mode: 0644]
OS/Makefile-HP-UX [new file with mode: 0644]
OS/Makefile-HP-UX-9 [new file with mode: 0644]
OS/Makefile-IRIX [new file with mode: 0644]
OS/Makefile-IRIX6 [new file with mode: 0644]
OS/Makefile-IRIX632 [new file with mode: 0644]
OS/Makefile-IRIX65 [new file with mode: 0644]
OS/Makefile-Linux [new file with mode: 0644]
OS/Makefile-NetBSD [new file with mode: 0644]
OS/Makefile-NetBSD-a.out [new file with mode: 0644]
OS/Makefile-OSF1 [new file with mode: 0644]
OS/Makefile-OpenBSD [new file with mode: 0644]
OS/Makefile-OpenUNIX [new file with mode: 0644]
OS/Makefile-QNX [new file with mode: 0644]
OS/Makefile-SCO [new file with mode: 0644]
OS/Makefile-SCO_SV [new file with mode: 0644]
OS/Makefile-SunOS4 [new file with mode: 0644]
OS/Makefile-SunOS5 [new file with mode: 0644]
OS/Makefile-SunOS5-hal [new file with mode: 0644]
OS/Makefile-ULTRIX [new file with mode: 0644]
OS/Makefile-UNIX_SV [new file with mode: 0644]
OS/Makefile-USG [new file with mode: 0644]
OS/Makefile-Unixware7 [new file with mode: 0644]
OS/Makefile-mips [new file with mode: 0644]
OS/eximon.conf-Default [new file with mode: 0644]
OS/os.Configuring [new file with mode: 0644]
OS/os.c-GNU [new file with mode: 0644]
OS/os.c-HI-OSF [new file with mode: 0644]
OS/os.c-IRIX [new file with mode: 0644]
OS/os.c-IRIX6 [new file with mode: 0644]
OS/os.c-IRIX632 [new file with mode: 0644]
OS/os.c-IRIX65 [new file with mode: 0644]
OS/os.c-Linux [new file with mode: 0644]
OS/os.c-OSF1 [new file with mode: 0644]
OS/os.c-cygwin [new file with mode: 0644]
OS/os.h-AIX [new file with mode: 0644]
OS/os.h-BSDI [new file with mode: 0644]
OS/os.h-DGUX [new file with mode: 0644]
OS/os.h-Darwin [new file with mode: 0644]
OS/os.h-DragonFly [new file with mode: 0644]
OS/os.h-FreeBSD [new file with mode: 0644]
OS/os.h-GNU [new file with mode: 0644]
OS/os.h-GNUkFreeBSD [new file with mode: 0644]
OS/os.h-GNUkNetBSD [new file with mode: 0644]
OS/os.h-HI-OSF [new file with mode: 0644]
OS/os.h-HI-UX [new file with mode: 0644]
OS/os.h-HP-UX [new file with mode: 0644]
OS/os.h-HP-UX-9 [new file with mode: 0644]
OS/os.h-IRIX [new file with mode: 0644]
OS/os.h-IRIX6 [new file with mode: 0644]
OS/os.h-IRIX632 [new file with mode: 0644]
OS/os.h-IRIX65 [new file with mode: 0644]
OS/os.h-Linux [new file with mode: 0644]
OS/os.h-NetBSD [new file with mode: 0644]
OS/os.h-NetBSD-a.out [new file with mode: 0644]
OS/os.h-OSF1 [new file with mode: 0644]
OS/os.h-OpenBSD [new file with mode: 0644]
OS/os.h-OpenUNIX [new file with mode: 0644]
OS/os.h-QNX [new file with mode: 0644]
OS/os.h-SCO [new file with mode: 0644]
OS/os.h-SCO_SV [new file with mode: 0644]
OS/os.h-SunOS4 [new file with mode: 0644]
OS/os.h-SunOS5 [new file with mode: 0644]
OS/os.h-SunOS5-hal [new file with mode: 0644]
OS/os.h-ULTRIX [new file with mode: 0644]
OS/os.h-UNIX_SV [new file with mode: 0644]
OS/os.h-USG [new file with mode: 0644]
OS/os.h-Unixware7 [new file with mode: 0644]
OS/os.h-cygwin [new file with mode: 0644]
OS/os.h-mips [new file with mode: 0644]
README [new file with mode: 0644]
README.DSN [new file with mode: 0644]
README.UPDATING [new file with mode: 0644]
doc/ChangeLog [new file with mode: 0644]
doc/Exim3.upgrade [new file with mode: 0644]
doc/Exim4.upgrade [new file with mode: 0644]
doc/GnuTLS-FAQ.txt [new file with mode: 0644]
doc/NewStuff [new file with mode: 0644]
doc/OptionLists.txt [new file with mode: 0644]
doc/README [new file with mode: 0644]
doc/README.SIEVE [new file with mode: 0644]
doc/dbm.discuss.txt [new file with mode: 0644]
doc/exim.8 [new file with mode: 0644]
doc/experimental-spec.txt [new file with mode: 0644]
doc/filter.txt [new file with mode: 0644]
doc/spec.txt [new file with mode: 0644]
exim_monitor/EDITME [new file with mode: 0644]
exim_monitor/em_StripChart.c [new file with mode: 0644]
exim_monitor/em_TextPop.c [new file with mode: 0644]
exim_monitor/em_globals.c [new file with mode: 0644]
exim_monitor/em_hdr.h [new file with mode: 0644]
exim_monitor/em_init.c [new file with mode: 0644]
exim_monitor/em_log.c [new file with mode: 0644]
exim_monitor/em_main.c [new file with mode: 0644]
exim_monitor/em_menu.c [new file with mode: 0644]
exim_monitor/em_queue.c [new file with mode: 0644]
exim_monitor/em_strip.c [new file with mode: 0644]
exim_monitor/em_text.c [new file with mode: 0644]
exim_monitor/em_version.c [new file with mode: 0644]
exim_monitor/em_xs.c [new file with mode: 0644]
scripts/Configure [new file with mode: 0755]
scripts/Configure-Makefile [new file with mode: 0755]
scripts/Configure-config.h [new file with mode: 0755]
scripts/Configure-eximon [new file with mode: 0755]
scripts/Configure-os.c [new file with mode: 0755]
scripts/Configure-os.h [new file with mode: 0755]
scripts/MakeLinks [new file with mode: 0755]
scripts/arch-type [new file with mode: 0755]
scripts/exim_install [new file with mode: 0755]
scripts/lookups-Makefile [new file with mode: 0755]
scripts/newer [new file with mode: 0755]
scripts/os-type [new file with mode: 0755]
scripts/reversion [new file with mode: 0755]
scripts/source_checks [new file with mode: 0644]
src/EDITME [new file with mode: 0644]
src/acl.c [new file with mode: 0644]
src/aliases.default [new file with mode: 0644]
src/auths/Makefile [new file with mode: 0644]
src/auths/README [new file with mode: 0644]
src/auths/auth-spa.c [new file with mode: 0644]
src/auths/auth-spa.h [new file with mode: 0644]
src/auths/b64decode.c [new file with mode: 0644]
src/auths/b64encode.c [new file with mode: 0644]
src/auths/call_pam.c [new file with mode: 0644]
src/auths/call_pwcheck.c [new file with mode: 0644]
src/auths/call_radius.c [new file with mode: 0644]
src/auths/check_serv_cond.c [new file with mode: 0644]
src/auths/cram_md5.c [new file with mode: 0644]
src/auths/cram_md5.h [new file with mode: 0644]
src/auths/cyrus_sasl.c [new file with mode: 0644]
src/auths/cyrus_sasl.h [new file with mode: 0644]
src/auths/dovecot.c [new file with mode: 0644]
src/auths/dovecot.h [new file with mode: 0644]
src/auths/get_data.c [new file with mode: 0644]
src/auths/get_no64_data.c [new file with mode: 0644]
src/auths/gsasl_exim.c [new file with mode: 0644]
src/auths/gsasl_exim.h [new file with mode: 0644]
src/auths/heimdal_gssapi.c [new file with mode: 0644]
src/auths/heimdal_gssapi.h [new file with mode: 0644]
src/auths/md5.c [new file with mode: 0644]
src/auths/plaintext.c [new file with mode: 0644]
src/auths/plaintext.h [new file with mode: 0644]
src/auths/pwcheck.c [new file with mode: 0644]
src/auths/pwcheck.h [new file with mode: 0644]
src/auths/sha1.c [new file with mode: 0644]
src/auths/spa.c [new file with mode: 0644]
src/auths/spa.h [new file with mode: 0644]
src/auths/xtextdecode.c [new file with mode: 0644]
src/auths/xtextencode.c [new file with mode: 0644]
src/bmi_spam.c [new file with mode: 0644]
src/bmi_spam.h [new file with mode: 0644]
src/buildconfig.c [new file with mode: 0644]
src/child.c [new file with mode: 0644]
src/cnumber.h [new file with mode: 0644]
src/config.h.defaults [new file with mode: 0644]
src/configure.default [new file with mode: 0644]
src/convert4r3.src [new file with mode: 0755]
src/convert4r4.src [new file with mode: 0755]
src/crypt16.c [new file with mode: 0644]
src/daemon.c [new file with mode: 0644]
src/dbfn.c [new file with mode: 0644]
src/dbfunctions.h [new file with mode: 0644]
src/dbstuff.h [new file with mode: 0644]
src/dcc.c [new file with mode: 0644]
src/dcc.h [new file with mode: 0644]
src/debug.c [new file with mode: 0644]
src/deliver.c [new file with mode: 0644]
src/demime.c [new file with mode: 0644]
src/demime.h [new file with mode: 0644]
src/directory.c [new file with mode: 0644]
src/dkim.c [new file with mode: 0644]
src/dkim.h [new file with mode: 0644]
src/dmarc.c [new file with mode: 0644]
src/dmarc.h [new file with mode: 0644]
src/dns.c [new file with mode: 0644]
src/drtables.c [new file with mode: 0644]
src/dummies.c [new file with mode: 0644]
src/enq.c [new file with mode: 0644]
src/exicyclog.src [new file with mode: 0644]
src/exigrep.src [new file with mode: 0644]
src/exim.c [new file with mode: 0644]
src/exim.h [new file with mode: 0644]
src/exim_checkaccess.src [new file with mode: 0755]
src/exim_dbmbuild.c [new file with mode: 0644]
src/exim_dbutil.c [new file with mode: 0644]
src/exim_lock.c [new file with mode: 0644]
src/eximon.src [new file with mode: 0644]
src/eximstats.src [new file with mode: 0644]
src/exinext.src [new file with mode: 0644]
src/exipick.src [new file with mode: 0644]
src/exiqgrep.src [new file with mode: 0644]
src/exiqsumm.src [new file with mode: 0644]
src/exiwhat.src [new file with mode: 0644]
src/expand.c [new file with mode: 0644]
src/filter.c [new file with mode: 0644]
src/filtertest.c [new file with mode: 0644]
src/functions.h [new file with mode: 0644]
src/globals.c [new file with mode: 0644]
src/globals.h [new file with mode: 0644]
src/header.c [new file with mode: 0644]
src/host.c [new file with mode: 0644]
src/ip.c [new file with mode: 0644]
src/local_scan.c [new file with mode: 0644]
src/local_scan.h [new file with mode: 0644]
src/log.c [new file with mode: 0644]
src/lookupapi.h [new file with mode: 0644]
src/lookups/Makefile [new file with mode: 0644]
src/lookups/README [new file with mode: 0644]
src/lookups/cdb.c [new file with mode: 0644]
src/lookups/dbmdb.c [new file with mode: 0644]
src/lookups/dnsdb.c [new file with mode: 0644]
src/lookups/dsearch.c [new file with mode: 0644]
src/lookups/ibase.c [new file with mode: 0644]
src/lookups/ldap.c [new file with mode: 0644]
src/lookups/ldap.h [new file with mode: 0644]
src/lookups/lf_check_file.c [new file with mode: 0644]
src/lookups/lf_functions.h [new file with mode: 0644]
src/lookups/lf_quote.c [new file with mode: 0644]
src/lookups/lf_sqlperform.c [new file with mode: 0644]
src/lookups/lsearch.c [new file with mode: 0644]
src/lookups/mysql.c [new file with mode: 0644]
src/lookups/nis.c [new file with mode: 0644]
src/lookups/nisplus.c [new file with mode: 0644]
src/lookups/oracle.c [new file with mode: 0644]
src/lookups/passwd.c [new file with mode: 0644]
src/lookups/pgsql.c [new file with mode: 0644]
src/lookups/redis.c [new file with mode: 0644]
src/lookups/spf.c [new file with mode: 0644]
src/lookups/sqlite.c [new file with mode: 0644]
src/lookups/testdb.c [new file with mode: 0644]
src/lookups/whoson.c [new file with mode: 0644]
src/lss.c [new file with mode: 0644]
src/macros.h [new file with mode: 0644]
src/malware.c [new file with mode: 0644]
src/match.c [new file with mode: 0644]
src/memcheck.h [new file with mode: 0644]
src/mime.c [new file with mode: 0644]
src/mime.h [new file with mode: 0644]
src/moan.c [new file with mode: 0644]
src/mytypes.h [new file with mode: 0644]
src/os.c [new file with mode: 0644]
src/osfunctions.h [new file with mode: 0644]
src/parse.c [new file with mode: 0644]
src/pdkim/Makefile [new file with mode: 0644]
src/pdkim/README [new file with mode: 0644]
src/pdkim/base64.c [new file with mode: 0644]
src/pdkim/base64.h [new file with mode: 0644]
src/pdkim/bignum.c [new file with mode: 0644]
src/pdkim/bignum.h [new file with mode: 0644]
src/pdkim/bn_mul.h [new file with mode: 0644]
src/pdkim/pdkim.c [new file with mode: 0644]
src/pdkim/pdkim.h [new file with mode: 0644]
src/pdkim/rsa.c [new file with mode: 0644]
src/pdkim/rsa.h [new file with mode: 0644]
src/pdkim/sha1.c [new file with mode: 0644]
src/pdkim/sha1.h [new file with mode: 0644]
src/pdkim/sha2.c [new file with mode: 0644]
src/pdkim/sha2.h [new file with mode: 0644]
src/perl.c [new file with mode: 0644]
src/queue.c [new file with mode: 0644]
src/rda.c [new file with mode: 0644]
src/readconf.c [new file with mode: 0644]
src/receive.c [new file with mode: 0644]
src/regex.c [new file with mode: 0644]
src/retry.c [new file with mode: 0644]
src/rewrite.c [new file with mode: 0644]
src/rfc2047.c [new file with mode: 0644]
src/route.c [new file with mode: 0644]
src/routers/Makefile [new file with mode: 0644]
src/routers/README [new file with mode: 0644]
src/routers/accept.c [new file with mode: 0644]
src/routers/accept.h [new file with mode: 0644]
src/routers/dnslookup.c [new file with mode: 0644]
src/routers/dnslookup.h [new file with mode: 0644]
src/routers/ipliteral.c [new file with mode: 0644]
src/routers/ipliteral.h [new file with mode: 0644]
src/routers/iplookup.c [new file with mode: 0644]
src/routers/iplookup.h [new file with mode: 0644]
src/routers/manualroute.c [new file with mode: 0644]
src/routers/manualroute.h [new file with mode: 0644]
src/routers/queryprogram.c [new file with mode: 0644]
src/routers/queryprogram.h [new file with mode: 0644]
src/routers/redirect.c [new file with mode: 0644]
src/routers/redirect.h [new file with mode: 0644]
src/routers/rf_change_domain.c [new file with mode: 0644]
src/routers/rf_expand_data.c [new file with mode: 0644]
src/routers/rf_functions.h [new file with mode: 0644]
src/routers/rf_get_errors_address.c [new file with mode: 0644]
src/routers/rf_get_munge_headers.c [new file with mode: 0644]
src/routers/rf_get_transport.c [new file with mode: 0644]
src/routers/rf_get_ugid.c [new file with mode: 0644]
src/routers/rf_lookup_hostlist.c [new file with mode: 0644]
src/routers/rf_queue_add.c [new file with mode: 0644]
src/routers/rf_self_action.c [new file with mode: 0644]
src/routers/rf_set_ugid.c [new file with mode: 0644]
src/search.c [new file with mode: 0644]
src/sieve.c [new file with mode: 0644]
src/smtp_in.c [new file with mode: 0644]
src/smtp_out.c [new file with mode: 0644]
src/spam.c [new file with mode: 0644]
src/spam.h [new file with mode: 0644]
src/spf.c [new file with mode: 0644]
src/spf.h [new file with mode: 0644]
src/spool_in.c [new file with mode: 0644]
src/spool_mbox.c [new file with mode: 0644]
src/spool_out.c [new file with mode: 0644]
src/srs.c [new file with mode: 0644]
src/srs.h [new file with mode: 0644]
src/std-crypto.c [new file with mode: 0644]
src/store.c [new file with mode: 0644]
src/store.h [new file with mode: 0644]
src/string.c [new file with mode: 0644]
src/structs.h [new file with mode: 0644]
src/tls-gnu.c [new file with mode: 0644]
src/tls-openssl.c [new file with mode: 0644]
src/tls.c [new file with mode: 0644]
src/tlscert-gnu.c [new file with mode: 0644]
src/tlscert-openssl.c [new file with mode: 0644]
src/tod.c [new file with mode: 0644]
src/transport-filter.src [new file with mode: 0644]
src/transport.c [new file with mode: 0644]
src/transports/Makefile [new file with mode: 0644]
src/transports/README [new file with mode: 0644]
src/transports/appendfile.c [new file with mode: 0644]
src/transports/appendfile.h [new file with mode: 0644]
src/transports/autoreply.c [new file with mode: 0644]
src/transports/autoreply.h [new file with mode: 0644]
src/transports/lmtp.c [new file with mode: 0644]
src/transports/lmtp.h [new file with mode: 0644]
src/transports/pipe.c [new file with mode: 0644]
src/transports/pipe.h [new file with mode: 0644]
src/transports/smtp.c [new file with mode: 0644]
src/transports/smtp.h [new file with mode: 0644]
src/transports/tf_maildir.c [new file with mode: 0644]
src/transports/tf_maildir.h [new file with mode: 0644]
src/tree.c [new file with mode: 0644]
src/valgrind.h [new file with mode: 0644]
src/verify.c [new file with mode: 0644]
src/version.c [new file with mode: 0644]
src/version.sh [new file with mode: 0644]
util/README [new file with mode: 0644]
util/cramtest.pl [new file with mode: 0755]
util/gen_pkcs3.c [new file with mode: 0644]
util/logargs.sh [new file with mode: 0755]
util/mkcdb.pl [new file with mode: 0755]
util/ocsp_fetch.pl [new file with mode: 0755]
util/proxy_protocol_client.pl [new file with mode: 0644]
util/ratelimit.pl [new file with mode: 0644]
util/unknownuser.sh [new file with mode: 0755]

diff --git a/.gitattributes b/.gitattributes
new file mode 100644 (file)
index 0000000..554385c
--- /dev/null
@@ -0,0 +1 @@
+ACKNOWLEDGMENTS         encoding=utf-8
diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..7839e97
--- /dev/null
@@ -0,0 +1,4 @@
+Local
+build-*
+tags
+cscope.out
diff --git a/ABOUT b/ABOUT
new file mode 100644 (file)
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 (file)
index 0000000..1c4a934
--- /dev/null
@@ -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<n> 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 (file)
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 (file)
index 0000000..a5f7809
--- /dev/null
@@ -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 <exim-users@exim.org>.  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 <exim-dev@exim.org>.  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 (file)
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.
+\f
+                   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.)
+\f
+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.
+\f
+  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.
+\f
+  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
+\f
+           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.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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.
+
+  <signature of Ty Coon>, 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 (file)
index 0000000..e2ba06b
--- /dev/null
@@ -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 (file)
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 (file)
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 (file)
index 0000000..fc32aa2
--- /dev/null
@@ -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 (file)
index 0000000..d56aa9b
--- /dev/null
@@ -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 (file)
index 0000000..87a8037
--- /dev/null
@@ -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 (file)
index 0000000..774fa4f
--- /dev/null
@@ -0,0 +1,114 @@
+# OS-specific file for Cygwin.
+
+# This file provided by Pierre A. Humblet <Pierre.Humblet@ieee.org>
+
+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 (file)
index 0000000..667c63f
--- /dev/null
@@ -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 (file)
index 0000000..be0d952
--- /dev/null
@@ -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 (file)
index 0000000..60d5ea8
--- /dev/null
@@ -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 (file)
index 0000000..c49c59f
--- /dev/null
@@ -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 (file)
index 0000000..ebb116b
--- /dev/null
@@ -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 (file)
index 0000000..e464341
--- /dev/null
@@ -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 (file)
index 0000000..8019281
--- /dev/null
@@ -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 (file)
index 0000000..8019281
--- /dev/null
@@ -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 (file)
index 0000000..da3d487
--- /dev/null
@@ -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 (file)
index 0000000..870ee84
--- /dev/null
@@ -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 (file)
index 0000000..073d67a
--- /dev/null
@@ -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 (file)
index 0000000..1530009
--- /dev/null
@@ -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 (file)
index 0000000..7b95783
--- /dev/null
@@ -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 (file)
index 0000000..be01138
--- /dev/null
@@ -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 (file)
index 0000000..b567fc6
--- /dev/null
@@ -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 (file)
index 0000000..50e7745
--- /dev/null
@@ -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 (file)
index 0000000..990f884
--- /dev/null
@@ -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 (file)
index 0000000..35d03a2
--- /dev/null
@@ -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 (file)
index 0000000..e210efd
--- /dev/null
@@ -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 (file)
index 0000000..811ca07
--- /dev/null
@@ -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 (file)
index 0000000..1022abb
--- /dev/null
@@ -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 (file)
index 0000000..e4d7261
--- /dev/null
@@ -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 (file)
index 0000000..3cf81c4
--- /dev/null
@@ -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 (file)
index 0000000..baa61d8
--- /dev/null
@@ -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 (file)
index 0000000..249b81a
--- /dev/null
@@ -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 <tonye@ilion.nl>
+
+# 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 (file)
index 0000000..c876998
--- /dev/null
@@ -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 (file)
index 0000000..e60a6c0
--- /dev/null
@@ -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 (file)
index 0000000..05ea893
--- /dev/null
@@ -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 (file)
index 0000000..9e912b3
--- /dev/null
@@ -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 (file)
index 0000000..bfcfae1
--- /dev/null
@@ -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 (file)
index 0000000..753a2d7
--- /dev/null
@@ -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 (file)
index 0000000..88a8838
--- /dev/null
@@ -0,0 +1,32 @@
+# Exim: OS-specific make file for Unixware7
+# Based on information from James FitzGibbon <james@ehlo.com>
+
+# 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 (file)
index 0000000..ff33139
--- /dev/null
@@ -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 (file)
index 0000000..2f874ef
--- /dev/null
@@ -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<Btn1Down>'}
+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 (file)
index 0000000..465bc26
--- /dev/null
@@ -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-<ostype> files
+-----------------------
+
+There may be an os.c-<ostype> 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-<ostype> 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-<ostype> files
+-----------------------
+
+For each OS that Exim knows about, there is an os.h-<ostype> file, where
+<ostype> 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-<ostype>, 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-<ostype> 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 <sys/mount.h>
+
+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-<ostype> 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 (file)
index 0000000..e5d6ff6
--- /dev/null
@@ -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 <mach.h>
+
+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 (file)
index 0000000..5e3d336
--- /dev/null
@@ -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 <sys/table.h>
+
+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 (file)
index 0000000..487091a
--- /dev/null
@@ -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 <sys/sysctl.h>
+#include <net/if_dl.h>
+#include <net/if_types.h>
+#include <net/soioctl.h>
+#include <net/route.h>
+
+#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 (file)
index 0000000..487091a
--- /dev/null
@@ -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 <sys/sysctl.h>
+#include <net/if_dl.h>
+#include <net/if_types.h>
+#include <net/soioctl.h>
+#include <net/route.h>
+
+#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 (file)
index 0000000..487091a
--- /dev/null
@@ -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 <sys/sysctl.h>
+#include <net/if_dl.h>
+#include <net/if_types.h>
+#include <net/soioctl.h>
+#include <net/route.h>
+
+#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 (file)
index 0000000..487091a
--- /dev/null
@@ -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 <sys/sysctl.h>
+#include <net/if_dl.h>
+#include <net/if_types.h>
+#include <net/soioctl.h>
+#include <net/route.h>
+
+#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 (file)
index 0000000..df0dff9
--- /dev/null
@@ -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 <sys/sysinfo.h>
+
+static int
+linux_slow_getloadavg(void)
+{
+struct sysinfo s;
+double avg;
+if (sysinfo(&s) < 0) return -1;
+avg = (double) (s.loads[0]) / (1<<SI_LOAD_SHIFT);
+return (int)(avg * 1000.0);
+}
+
+int
+os_getloadavg(void)
+{
+char buffer[40];
+double avg;
+int count;
+int fd = open ("/proc/loadavg", O_RDONLY);
+if (fd == -1) return linux_slow_getloadavg();
+count = read (fd, buffer, sizeof(buffer));
+(void)close (fd);
+if (count <= 0) return linux_slow_getloadavg();
+count = sscanf (buffer, "%lf", &avg);
+if (count < 1) return linux_slow_getloadavg();
+return (int)(avg * 1000.0);
+}
+#endif  /* OS_LOAD_AVERAGE */
+
+
+
+
+
+/*************************************************
+*         Finding interface addresses            *
+*************************************************/
+
+/* This function is not required for utilities; we cut it out if
+FIND_RUNNING_INTERFACES is already defined. */
+
+#ifndef FIND_RUNNING_INTERFACES
+
+/* This code, contributed by Jason Gunthorpe, appears to be the current
+way of finding IPv6 interfaces in Linux. It first calls the common function in
+order to find IPv4 interfaces, then grobbles around to find the others. Jason
+said, "This is so horrible, don't look. Slightly ripped from net-tools
+ifconfig." It gets called by virtue of os_find_running_interfaces being defined
+as a macro for os_find_running_interfaces_linux in the os.h-Linux file. */
+
+ip_address_item *
+os_find_running_interfaces_linux(void)
+{
+ip_address_item *yield = NULL;
+
+#if HAVE_IPV6
+ip_address_item *last = NULL;
+ip_address_item  *next;
+char addr6p[8][5];
+unsigned int plen, scope, dad_status, if_idx;
+char devname[20+1];
+FILE *f;
+#endif
+
+yield = os_common_find_running_interfaces();
+
+#if HAVE_IPV6
+
+/* Open the /proc file; give up if we can't. */
+
+if ((f = fopen("/proc/net/if_inet6", "r")) == NULL) return yield;
+
+/* Pick out the data from within the file, and add it on to the chain */
+
+last = yield;
+if (last != NULL) while (last->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 (file)
index 0000000..ad91b63
--- /dev/null
@@ -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 <sys/table.h>
+
+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 (file)
index 0000000..ea17a43
--- /dev/null
@@ -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 <Pierre.Humblet@ieee.org>
+*/
+
+/* 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 <windows.h>
+#define EqualLuid(Luid1, Luid2) \
+  ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart))
+#include <sys/cygwin.h>
+
+/* 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 <ntdef.h>
+
+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 (file)
index 0000000..f3a84f2
--- /dev/null
@@ -0,0 +1,23 @@
+/* Exim: OS-specific C header file for AIX */
+/* Written by Nick Waterman <nick@cimio.co.uk> */
+/* Modified by Philip Hazel with data from
+   Niels Provos <provos@wserver.physnet.uni-hamburg.de>
+   Juozas Simkevicius <juozas@omnitel.net> 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 (file)
index 0000000..cd91936
--- /dev/null
@@ -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 (file)
index 0000000..838ddd9
--- /dev/null
@@ -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 (file)
index 0000000..559003f
--- /dev/null
@@ -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 (file)
index 0000000..669bb23
--- /dev/null
@@ -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 (file)
index 0000000..c5ed042
--- /dev/null
@@ -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 (file)
index 0000000..cc4da0e
--- /dev/null
@@ -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 (file)
index 0000000..e60690f
--- /dev/null
@@ -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 (file)
index 0000000..121f2d3
--- /dev/null
@@ -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 (file)
index 0000000..76bd429
--- /dev/null
@@ -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 (file)
index 0000000..97b83ed
--- /dev/null
@@ -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 (file)
index 0000000..87e4dfc
--- /dev/null
@@ -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 (file)
index 0000000..dab965e
--- /dev/null
@@ -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 (file)
index 0000000..ac5a6b3
--- /dev/null
@@ -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 (file)
index 0000000..c41a234
--- /dev/null
@@ -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 (file)
index 0000000..0196931
--- /dev/null
@@ -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 (file)
index 0000000..683c66a
--- /dev/null
@@ -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 (file)
index 0000000..3fead17
--- /dev/null
@@ -0,0 +1,72 @@
+/* Exim: OS-specific C header file for Linux */
+
+/* Some old systems we've received bug-reports for have a <limits.h> which
+does not pull in <features.h>.  Best to just pull it in now and have done
+with the issue. */
+
+#include <features.h>
+
+
+#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 <features.h> 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 (file)
index 0000000..19a8ac0
--- /dev/null
@@ -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 <sys/param.h>
+
+#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 (file)
index 0000000..29a8fee
--- /dev/null
@@ -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 (file)
index 0000000..f04a5b7
--- /dev/null
@@ -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 (file)
index 0000000..55bade6
--- /dev/null
@@ -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 (file)
index 0000000..90be8d5
--- /dev/null
@@ -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 (file)
index 0000000..106b0a6
--- /dev/null
@@ -0,0 +1,21 @@
+/* Exim: OS-specific C header file for QNX */
+/* Modified for QNX 6.2.0 with diffs from Samuli Tuomola. */
+
+#include <sys/select.h>
+
+/* 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 <unix.h>
+#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 (file)
index 0000000..07d21bd
--- /dev/null
@@ -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 (file)
index 0000000..486fcbe
--- /dev/null
@@ -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 (file)
index 0000000..b0deefc
--- /dev/null
@@ -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 (file)
index 0000000..8bc0799
--- /dev/null
@@ -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 (file)
index 0000000..044e09b
--- /dev/null
@@ -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 (file)
index 0000000..9985af2
--- /dev/null
@@ -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 (file)
index 0000000..9ad824a
--- /dev/null
@@ -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 (file)
index 0000000..1c780ee
--- /dev/null
@@ -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 (file)
index 0000000..1592094
--- /dev/null
@@ -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 (file)
index 0000000..740300a
--- /dev/null
@@ -0,0 +1,51 @@
+/* Exim: OS-specific C header file for Cygwin */
+
+/* This code was supplied by Pierre A. Humblet <Pierre.Humblet@ieee.org> */
+
+/* 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 <sys/stat.h> /* 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 <unistd.h>   /* 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 (file)
index 0000000..79f3ff2
--- /dev/null
@@ -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 (file)
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-<version>,
+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-<osname>. 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 <build-dir>/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 <ostype> and <archtype> are the operating
+system and architecture types respectively, the files used are:
+
+  OS/Makefile-Default
+  OS/Makefile-<ostype>
+  Local/Makefile
+  Local/Makefile-<ostype>
+  Local/Makefile-<archtype>
+  Local/Makefile-<ostype>-<archtype>
+  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 (file)
index 0000000..68d1641
--- /dev/null
@@ -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 (file)
index 0000000..590642f
--- /dev/null
@@ -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-<name> 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_<type>{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_<type>{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
+
+  <time>.H<microsec>P<pid>.<host>
+
+This should be a compatible change, but is noted here just in case.
+
+4. The rules for creating message ids have changed, to cope with systems where
+the process id can be re-used within the same second. The format, however, is
+unchanged, so this should not cause any problems, except as noted in the next
+item.
+
+5. The maximum value for localhost_number has been reduced from 255 to 16, in
+order to implement the new message id rules. For operating systems that have
+case-insensitive file systems (Cygwin and Darwin), the limit is 10.
+
+6. verify = header_syntax was allowing unqualified addresses in all cases. Now
+it allows them only for locally generated messages and from hosts that match
+sender_unqualified_hosts or recipient_unqualified_hosts, respectively.
+
+7. For reasons lost in the mists of time, when a pipe transport was run, the
+environment variable MESSAGE_ID was set to the message ID preceded by 'E' (the
+form used in Message-ID: header lines). The 'E' has been removed.
+
+
+Version 4.11
+------------
+
+1. The handling of lines in the configuration file has changed. Previously,
+macro expansion was applied to logical lines, after continuations had been
+joined on. This meant that it could not be used in .include lines, which are
+handled as physical rather than logical lines. Macro expansion is now done on
+physical lines rather than logical lines. This means there are two
+incompatibilities:
+
+  (a) A macro that expands to # to turn a line into a comment now applies only
+      to the physical line where it appears. Previously, it would have caused
+      any following continuations also to be ignored.
+
+  (b) A macro name can no longer be split over the boundary between a line and
+      its continuation. Actually, this is more of a bug fix. :-)
+
+2. The -D command line option must now all be within one command line item.
+This makes it possible to use -D to set a macro to the empty string by commands
+such as
+
+  exim -DABC  ...
+  exim -DABC= ...
+
+Previously, these items would have moved on to the next item on the command
+line. To include spaces in a macro definition item, quotes must be used, in
+which case you can also have spaces after -D and surrounding the equals. For
+example:
+
+  exim '-D ABC = something' ...
+
+3. The way that addresses that redirect to themselves are handled has been
+changed, in order to fix an obscure bug. This should not cause any problems
+except in the case of wanting to go back from a 4.11 (or later) release to an
+earlier release. If there are undelivered messages on the spool that contain
+addresses which redirect to themselves, and the redirected addresses have
+already been delivered, you might get a duplicate delivery if you revert to an
+earlier Exim.
+
+4. The default way of looking up IP addresses for hosts in the manualroute and
+queryprogram routers has been changed. If "byname" or "bydns" is explicitly
+specified, there is no change, but if no method is specified, Exim now behaves
+as follows:
+
+  First, a DNS lookup is done. If this yields anything other than
+  HOST_NOT_FOUND, that result is used. Otherwise, Exim goes on to try a call to
+  getipnodebyname() (or gethostbyname() on older systems) and the result of the
+  lookup is the result of that call.
+
+This change has been made because it has been discovered that on some systems,
+if a DNS lookup called via getipnodebyname() times out, HOST_NOT_FOUND is
+returned instead of TRY_AGAIN. Thus, it is safest to try a DNS lookup directly
+first, and only if that gives a definite "no such host" to try the local
+function.
+
+5. In fixing the minor security problem with pid_file_path, I have removed some
+backwards-compatible (undocumented) code which was present to ease conversion
+from Exim 3. In Exim 4, pid_file_path is a literal; in Exim 3 it was allowed to
+contain "%s", which was replaced by the port number for daemons listening on
+non-standard ports. In Exim 4, such daemons do not write a pid file. The
+backwards compatibility feature was to replace "%s" by nothing if it occurred
+in an Exim 4 setting of pid_file_path. The bug was in this code. I have solved
+the problem by removing the backwards compatibility feature. Thus, if you still
+have "%s" somewhere in a setting of pid_file_path, you should remove it.
+
+6. There has been an extension to lsearch files. The keys in these files may
+now be quoted in order to allow for whitespace and colons in them. This means
+that if you were previously using keys that began with a doublequote, you will
+now have to wrap them with extra quotes and escape the internal quotes. The
+possibility that anybody is actually doing this seems extremely remote, but it
+is documented just in case.
+
+
+Version 4.10
+------------
+
+The build-time parameter EXIWHAT_KILL_ARG has been renamed EXIWHAT_KILL_SIGNAL
+to better reflect its function. The OS-specific files have been updated. Only
+if you have explicitly set this in your Makefile (highly unlikely) do you need
+to change anything.
+
+****
diff --git a/doc/ChangeLog b/doc/ChangeLog
new file mode 100644 (file)
index 0000000..bea6b1a
--- /dev/null
@@ -0,0 +1,6092 @@
+Change log file for Exim from version 4.21
+-------------------------------------------
+
+
+Exim version 4.84
+-----------------
+TL/01 Bugzilla 1506: Re-add a 'return NULL' to silence complaints from static
+      checkers that were complaining about end of non-void function with no
+      return.
+
+JH/01 Bug 1513: Fix parsing of quoted parameter values in MIME headers.
+      This was a regression intruduced in 4.83 by another bugfix.
+
+JH/02 Fix broken compilation when EXPERIMENTAL_DSN is enabled.
+
+TL/02 Bug 1509: Fix exipick for enhanced spoolfile specification used when
+      EXPERIMENTAL_DNS is enabled.  Fix from Wolfgang Breyha.
+
+
+Exim version 4.83
+-----------------
+
+TF/01 Correctly close the server side of TLS when forking for delivery.
+
+      When a message was received over SMTP with TLS, Exim failed to clear up
+      the incoming connection properly after forking off the child process to
+      deliver the message. In some situations the subsequent outgoing
+      delivery connection happened to have the same fd number as the incoming
+      connection previously had. Exim would try to use TLS and fail, logging
+      a "Bad file descriptor" error.
+
+TF/02 Portability fix for building lookup modules on Solaris when the xpg4
+      utilities have not been installed.
+
+JH/01 Fix memory-handling in use of acl as a conditional; avoid free of
+      temporary space as the ACL may create new global variables.
+
+TL/01 LDAP support uses per connection or global context settings, depending
+      upon the detected version of the libraries at build time.
+
+TL/02 Experimental Proxy Protocol support: allows a proxied SMTP connection
+      to extract and use the src ip:port in logging and expansions as if it
+      were a direct connection from the outside internet. PPv2 support was
+      updated based on HAProxy spec change in May 2014.
+
+JH/02 Add ${listextract {number}{list}{success}{fail}}.
+
+TL/03 Bugzilla 1433: Fix DMARC SEGV with specific From header contents.
+      Properly escape header and check for NULL return.
+
+PP/01 Continue incomplete 4.82 PP/19 by fixing docs too: use dns_dnssec_ok
+      not dns_use_dnssec.
+
+JH/03 Bugzilla 1157: support log_selector smtp_confirmation for lmtp.
+
+TL/04 Add verify = header_names_ascii check to reject email with non-ASCII
+      characters in header names, implemented as a verify condition.
+      Contributed by Michael Fischer v. Mollard.
+
+TL/05 Rename SPF condition results err_perm and err_temp to standardized
+      results permerror and temperror.  Previous values are deprecated but
+      still accepted.  In a future release, err_perm and err_temp will be
+      completely removed, which will be a backward incompatibility if the
+      ACL tests for either of these two old results. Patch contributed by
+      user bes-internal on the mailing list.
+
+JH/04 Add ${utf8clean:} operator. Contributed by Alex Rau.
+
+JH/05 Bugzilla 305: Log incoming-TLS details on rejects, subject to log
+      selectors, in both main and reject logs.
+
+JH/06 Log outbound-TLS and port details, subject to log selectors, for a
+      failed delivery.
+
+JH/07 Add malware type "sock" for talking to simple daemon.
+
+JH/08 Bugzilla 1371: Add tls_{,try_}verify_hosts to smtp transport.
+
+JH/09 Bugzilla 1431: Support (with limitations) headers_add/headers_remove in
+      routers/transports under cutthrough routing.
+
+JH/10 Bugzilla 1005: ACL "condition =" should accept values which are negative
+      numbers.  Touch up "bool" conditional to keep the same definition.
+
+TL/06 Remove duplicated language in spec file from 4.82 TL/16.
+
+JH/11 Add dnsdb tlsa lookup.  From Todd Lyons.
+
+JH/12 Expand items in router/transport headers_add or headers_remove lists
+      individually rather than the list as a whole.  Bug 1452.
+
+      Required for reasonable handling of multiple headers_ options when
+      they may be empty; requires that headers_remove items with embedded
+      colons must have them doubled (or the list-separator changed).
+
+TL/07 Add new dmarc expansion variable $dmarc_domain_policy to directly
+      view the policy declared in the DMARC record. Currently, $dmarc_status
+      is a combined value of both the record presence and the result of the
+      analysis.
+
+JH/13 Fix handling of $tls_cipher et.al. in (non-verify) transport.  Bug 1455.
+
+JH/14 New options dnssec_request_domains, dnssec_require_domains on the
+      dnslookup router and the smtp transport (applying to the forward
+      lookup).
+
+TL/08 Bugzilla 1453: New LDAP "SERVERS=" option allows admin to override list
+      of ldap servers used for a specific lookup.  Patch provided by Heiko
+      Schlichting.
+
+JH/18 New options dnssec_lax, dnssec_strict on dnsdb lookups.
+      New variable $lookup_dnssec_authenticated for observability.
+
+TL/09 Bugzilla 609: Add -C option to exiqgrep, specify which exim.conf to use.
+      Patch submitted by Lars Timman.
+
+JH/19 EXPERIMENTAL_OCSP support under GnuTLS.  Bug 1459.
+
+TL/10 Bugzilla 1454: New -oMm option to pass message reference to Exim.
+      Requires trusted mode and valid format message id, aborts otherwise.
+      Patch contributed by Heiko Schlichting.
+
+JH/20 New expansion variables tls_(in,out)_(our,peer)cert, and expansion item
+      certextract with support for various fields.  Bug 1358.
+
+JH/21 Observability of OCSP via variables tls_(in,out)_ocsp.  Stapling
+      is requested by default, modifiable by smtp transport option
+      hosts_request_ocsp.
+
+JH/22 Expansion operators ${md5:string} and ${sha1:string} can now
+      operate on certificate variables to give certificate fingerprints
+      Also new ${sha256:cert_variable}.
+
+JH/23 The PRDR feature is moved from being Experimental into the mainline.
+
+TL/11 Bug 1119: fix memory allocation in string_printing2().  Patch from
+      Christian Aistleitner.
+
+JH/24 The OCSP stapling feature is moved from Experimental into the mainline.
+
+TL/12 Bug 1444: Fix improper \r\n sequence handling when writing spool
+      file.  Patch from Wolfgang Breyha.
+
+JH/25 Expand the coverage of the delivery $host and $host_address to
+      client authenticators run in verify callout.  Bug 1476.
+
+JH/26 Port service names are now accepted for tls_on_connect_ports, to
+      align with daemon_smtp_ports.  Bug 72.
+
+TF/03 Fix udpsend. The ip_connectedsocket() function's socket type
+      support and error reporting did not work properly.
+
+TL/13 Bug 1495: Exiqgrep check if -C config file specified on cli exists
+      and is readable.  Patch from Andrew Colin Kissa.
+
+TL/14 Enhance documentation of ${run expansion and how it parses the
+      commandline after expansion, particularly in the case when an
+      unquoted variable expansion results in an empty value.
+
+JH/27 The TLS SNI feature was broken in 4.82.  Fix it.
+
+PP/02 Fix internal collision of T_APL on systems which support RFC3123
+      by renaming away from it.  Addresses GH issue 15, reported by
+      Jasper Wallace.
+
+JH/28 Fix parsing of MIME headers for parameters with quoted semicolons.
+
+TL/15 SECURITY: prevent double expansion in math comparison functions
+      (can expand unsanitized data). Not remotely exploitable.
+      CVE-2014-2972
+
+
+Exim version 4.82
+-----------------
+
+PP/01 Add -bI: framework, and -bI:sieve for querying sieve capabilities.
+
+PP/02 Make -n do something, by making it not do something.
+      When combined with -bP, the name of an option is not output.
+
+PP/03 Added tls_dh_min_bits SMTP transport driver option, only honoured
+      by GnuTLS.
+
+PP/04 First step towards DNSSEC, provide $sender_host_dnssec for
+      $sender_host_name and config options to manage this, and basic check
+      routines.
+
+PP/05 DSCP support for outbound connections and control modifier for inbound.
+
+PP/06 Cyrus SASL: set local and remote IP;port properties for driver.
+      (Only plugin which currently uses this is kerberos4, which nobody should
+      be using, but we should make it available and other future plugins might
+      conceivably use it, even though it would break NAT; stuff *should* be
+      using channel bindings instead).
+
+PP/07 Handle "exim -L <tag>" to indicate to use syslog with tag as the process
+      name; added for Sendmail compatibility; requires admin caller.
+      Handle -G as equivalent to "control = suppress_local_fixups" (we used to
+      just ignore it); requires trusted caller.
+      Also parse but ignore: -Ac -Am -X<logfile>
+      Bugzilla 1117.
+
+TL/01 Bugzilla 1258 - Refactor MAIL FROM optional args processing.
+
+TL/02 Add +smtp_confirmation as a default logging option.
+
+TL/03 Bugzilla 198 - Implement remove_header ACL modifier.
+      Patch by Magnus Holmgren from 2007-02-20.
+
+TL/04 Bugzilla 1281 - Spec typo.
+      Bugzilla 1283 - Spec typo.
+      Bugzilla 1290 - Spec grammar fixes.
+
+TL/05 Bugzilla 1285 - Spec omission, fix docbook errors for spec.txt creation.
+
+TL/06 Add Experimental DMARC support using libopendmarc libraries.
+
+TL/07 Fix an out of order global option causing a segfault.  Reported to dev
+      mailing list by by Dmitry Isaikin.
+
+JH/01 Bugzilla 1201 & 304 - New cutthrough-delivery feature, with TLS support.
+
+JH/02 Support "G" suffix to numbers in ${if comparisons.
+
+PP/08 Handle smtp transport tls_sni option forced-fail for OpenSSL.
+
+NM/01 Bugzilla 1197 - Spec typo
+      Bugzilla 1196 - Spec examples corrections
+
+JH/03 Add expansion operators ${listnamed:name} and ${listcount:string}
+
+PP/09 Add gnutls_allow_auto_pkcs11 option (was originally called
+      gnutls_enable_pkcs11, but renamed to more accurately indicate its
+      function.
+
+PP/10 Let Linux makefile inherit CFLAGS/CFLAGS_DYNAMIC.
+      Pulled from Debian 30_dontoverridecflags.dpatch by Andreas Metzler.
+
+JH/04 Add expansion item ${acl {name}{arg}...}, expansion condition
+      "acl {{name}{arg}...}", and optional args on acl condition
+      "acl = name arg..."
+
+JH/05 Permit multiple router/transport headers_add/remove lines.
+
+JH/06 Add dnsdb pseudo-lookup "a+" to do an "aaaa" + "a" combination.
+
+JH/07 Avoid using a waiting database for a single-message-only transport.
+      Performance patch from Paul Fisher.  Bugzilla 1262.
+
+JH/08 Strip leading/trailing newlines from add_header ACL modifier data.
+      Bugzilla 884.
+
+JH/09 Add $headers_added variable, with content from use of ACL modifier
+      add_header (but not yet added to the message).  Bugzilla 199.
+
+JH/10 Add 8bitmime log_selector, for 8bitmime status on the received line.
+      Pulled from Bugzilla 817 by Wolfgang Breyha.
+
+PP/11 SECURITY: protect DKIM DNS decoding from remote exploit.
+      CVE-2012-5671
+      (nb: this is the same fix as in Exim 4.80.1)
+
+JH/11 Add A= logging on delivery lines, and a client_set_id option on
+      authenticators.
+
+JH/12 Add optional authenticated_sender logging to A= and a log_selector
+      for control.
+
+PP/12 Unbreak server_set_id for NTLM/SPA auth, broken by 4.80 PP/29.
+
+PP/13 Dovecot auth: log better reason to rejectlog if Dovecot did not
+      advertise SMTP AUTH mechanism to us, instead of a generic
+      protocol violation error.  Also, make Exim more robust to bad
+      data from the Dovecot auth socket.
+
+TF/01 Fix ultimate retry timeouts for intermittently deliverable recipients.
+
+      When a queue runner is handling a message, Exim first routes the
+      recipient addresses, during which it prunes them based on the retry
+      hints database. After that it attempts to deliver the message to
+      any remaining recipients. It then updates the hints database using
+      the retry rules.
+
+      So if a recipient address works intermittently, it can get repeatedly
+      deferred at routing time. The retry hints record remains fresh so the
+      address never reaches the final cutoff time.
+
+      This is a fairly common occurrence when a user is bumping up against
+      their storage quota. Exim had some logic in its local delivery code
+      to deal with this. However it did not apply to per-recipient defers
+      in remote deliveries, e.g. over LMTP to a separate IMAP message store.
+
+      This change adds a proper retry rule check during routing so that the
+      final cutoff time is checked against the message's age. We only do
+      this check if there is an address retry record and there is not a
+      domain retry record; this implies that previous attempts to handle
+      the address had the retry_use_local_parts option turned on. We use
+      this as an approximation for the destination being like a local
+      delivery, as in LMTP.
+
+      I suspect this new check makes the old local delivery cutoff check
+      redundant, but I have not verified this so I left the code in place.
+
+TF/02 Correct gecos expansion when From: is a prefix of the username.
+
+      Test 0254 submits a message to Exim with the header
+
+        Resent-From: f
+
+      When I ran the test suite under the user fanf2, Exim expanded
+      the header to contain my full name, whereas it should have added
+      a Resent-Sender: header. It erroneously treats any prefix of the
+      username as equal to the username.
+
+      This change corrects that bug.
+
+GF/01 DCC debug and logging tidyup
+      Error conditions log to paniclog rather than rejectlog.
+      Debug lines prefixed by "DCC: " to remove any ambiguity.
+
+TF/03 Avoid unnecessary rebuilds of lookup-related code.
+
+PP/14 Fix OCSP reinitialisation in SNI handling for Exim/TLS as server.
+      Bug spotted by Jeremy Harris; was flawed since initial commit.
+      Would have resulted in OCSP responses post-SNI triggering an Exim
+      NULL dereference and crash.
+
+JH/13 Add $router_name and $transport_name variables.  Bugzilla 308.
+
+PP/15 Define SIOCGIFCONF_GIVES_ADDR for GNU Hurd.
+      Bug detection, analysis and fix by Samuel Thibault.
+      Bugzilla 1331, Debian bug #698092.
+
+SC/01 Update eximstats to watch out for senders sending 'HELO [IpAddr]'
+
+JH/14 SMTP PRDR (http://www.eric-a-hall.com/specs/draft-hall-prdr-00.txt).
+      Server implementation by Todd Lyons, client by JH.
+      Only enabled when compiled with EXPERIMENTAL_PRDR.  A new
+      config variable "prdr_enable" controls whether the server
+      advertises the facility.  If the client requests PRDR a new
+      acl_data_smtp_prdr ACL is called once for each recipient, after
+      the body content is received and before the acl_smtp_data ACL.
+      The client is controlled by bolth of: a hosts_try_prdr option
+      on the smtp transport, and the server advertisement.
+      Default client logging of deliveries and rejections involving
+      PRDR are flagged with the string "PRDR".
+
+PP/16 Fix problems caused by timeouts during quit ACLs trying to double
+      fclose().  Diagnosis by Todd Lyons.
+
+PP/17 Update configure.default to handle IPv6 localhost better.
+      Patch by Alain Williams (plus minor tweaks).
+      Bugzilla 880.
+
+PP/18 OpenSSL made graceful with empty tls_verify_certificates setting.
+      This is now consistent with GnuTLS, and is now documented: the
+      previous undocumented portable approach to treating the option as
+      unset was to force an expansion failure.  That still works, and
+      an empty string is now equivalent.
+
+PP/19 Renamed DNSSEC-enabling option to "dns_dnssec_ok", to make it
+      clearer that Exim is using the DO (DNSSEC OK) EDNS0 resolver flag,
+      not performing validation itself.
+
+PP/20 Added force_command boolean option to pipe transport.
+      Patch from Nick Koston, of cPanel Inc.
+
+JH/15 AUTH support on callouts (and hence cutthrough-deliveries).
+      Bugzilla 321, 823.
+
+TF/04 Added udpsend ACL modifer and hexquote expansion operator
+
+PP/21 Fix eximon continuous updating with timestamped log-files.
+      Broken in a format-string cleanup in 4.80, missed when I repaired the
+      other false fix of the same issue.
+      Report and fix from Heiko Schlichting.
+      Bugzilla 1363.
+
+PP/22 Guard LDAP TLS usage against Solaris LDAP variant.
+      Report from Prashanth Katuri.
+
+PP/23 Support safari_ecdhe_ecdsa_bug for openssl_options.
+      It's SecureTransport, so affects any MacOS clients which use the
+      system-integrated TLS libraries, including email clients.
+
+PP/24 Fix segfault from trying to fprintf() to a NULL stdio FILE* if
+      using a MIME ACL for non-SMTP local injection.
+      Report and assistance in diagnosis by Warren Baker.
+
+TL/08 Adjust exiqgrep to be case-insensitive for sender/receiver.
+
+JH/16 Fix comparisons for 64b.  Bugzilla 1385.
+
+TL/09 Add expansion variable $authenticated_fail_id to keep track of
+      last id that failed so it may be referenced in subsequent ACL's.
+
+TL/10 Bugzilla 1375 - Prevent TLS rebinding in ldap. Patch provided by
+      Alexander Miroch.
+
+TL/11 Bugzilla 1382 - Option ldap_require_cert overrides start_tls
+      ldap library initialization, allowing self-signed CA's to be
+      used. Also properly sets require_cert option later in code by
+      using NULL (global ldap config) instead of ldap handle (per
+      session). Bug diagnosis and testing by alxgomz.
+
+TL/12 Enhanced documentation in the ratelimit.pl script provided in
+      the src/util/ subdirectory.
+
+TL/13 Bug 1031 - Imported transport SQL logging patch from Axel Rau
+      renamed to Transport Post Delivery Action by Jeremy Harris, as
+      EXPERIMENTAL_TPDA.
+
+TL/14 Bugzilla 1217 - Redis lookup support has been added. It is only enabled
+      when Exim is compiled with EXPERIMENTAL_REDIS. A new config variable
+      redis_servers = needs to be configured which will be used by the redis
+      lookup.  Patch from Warren Baker, of The Packet Hub.
+
+TL/15 Fix exiqsumm summary for corner case. Patch provided by Richard Hall.
+
+TL/16 Bugzilla 1289 - Clarify host/ip processing when have errors looking up a
+      hostname or reverse DNS when processing a host list. Used suggestions
+      from multiple comments on this bug.
+
+TL/17 Bugzilla 1057 - Multiple clamd TCP targets patch from Mark Zealey.
+
+TL/18 Had previously added a -CONTINUE option to runtest in the test suite.
+      Missed a few lines, added it to make the runtest require no keyboard
+      interaction.
+
+TL/19 Bugzilla 1402 - Test 533 fails if any part of the path to the test suite
+      contains upper case chars. Make router use caseful_local_part.
+
+TL/20 Bugzilla 1400 - Add AVOID_GNUTLS_PKCS11 build option. Allows GnuTLS
+      support when GnuTLS has been built with p11-kit.
+
+
+Exim version 4.80.1
+-------------------
+
+PP/01 SECURITY: protect DKIM DNS decoding from remote exploit.
+      CVE-2012-5671
+      This, or similar/improved, will also be change PP/11 of 4.82.
+
+
+Exim version 4.80
+-----------------
+
+PP/01 Handle short writes when writing local log-files.
+      In practice, only affects FreeBSD (8 onwards).
+      Bugzilla 1053, with thanks to Dmitry Isaikin.
+
+NM/01 Bugzilla 949 - Documentation tweak
+
+NM/02 Bugzilla 1093 - eximstats DATA reject detection regexps
+      improved.
+
+NM/03 Bugzilla 1169 - primary_hostname spelling was incorrect in docs.
+
+PP/02 Implemented gsasl authenticator.
+
+PP/03 Implemented heimdal_gssapi authenticator with "server_keytab" option.
+
+PP/04 Local/Makefile support for (AUTH|LOOKUP)_*_PC=foo to use
+      `pkg-config foo` for cflags/libs.
+
+PP/05 Swapped $auth1/$auth2 for gsasl GSSAPI mechanism, to be more consistent
+      with rest of GSASL and with heimdal_gssapi.
+
+PP/06 Local/Makefile support for USE_(GNUTLS|OPENSSL)_PC=foo to use
+      `pkg-config foo` for cflags/libs for the TLS implementation.
+
+PP/07 New expansion variable $tls_bits; Cyrus SASL server connection
+      properties get this fed in as external SSF.  A number of robustness
+      and debugging improvements to the cyrus_sasl authenticator.
+
+PP/08 cyrus_sasl server now expands the server_realm option.
+
+PP/09 Bugzilla 1214 - Log authentication information in reject log.
+      Patch by Jeremy Harris.
+
+PP/10 Added dbmjz lookup type.
+
+PP/11 Let heimdal_gssapi authenticator take a SASL message without an authzid.
+
+PP/12 MAIL args handles TAB as well as SP, for better interop with
+      non-compliant senders.
+      Analysis and variant patch by Todd Lyons.
+
+NM/04 Bugzilla 1237 - fix cases where printf format usage not indicated
+      Bug report from Lars Müller <lars@samba.org> (via SUSE),