1
0
Fork 0

Adding upstream version 4.98.2.

Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
This commit is contained in:
Daniel Baumann 2025-06-21 14:27:17 +02:00
parent b600454cc3
commit 802ab461a9
Signed by: daniel.baumann
GPG key ID: BCC918A2ABD66424
421 changed files with 269728 additions and 0 deletions

2
.ctags Normal file
View file

@ -0,0 +1,2 @@
--recurse
--exclude=build-*

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
ACKNOWLEDGMENTS encoding=utf-8

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
Local
build-*
tags
cscope.*

9
ABOUT Normal file
View file

@ -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

476
ACKNOWLEDGMENTS Normal file
View file

@ -0,0 +1,476 @@
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 website and mailing list
Managing the website 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 Mostly idle; some security bits still.
David Woodhouse Dynamic modules. Security.
Contributors
------------
Andrew Aitchison Spotted cmdline AV scanner regression with -bmalware
exim_msgdate
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
Jasper Wallace Patch for LibreSSL compatibility
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 :

10
CHANGES Normal file
View file

@ -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.
****

56
CONTRIBUTING Normal file
View file

@ -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

340
LICENCE Normal file
View file

@ -0,0 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<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.

29
LICENSE.opendmarc Normal file
View file

@ -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.

118
Makefile Normal file
View file

@ -0,0 +1,118 @@
# 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) The Exim Maintainers 2022 - 2023
# Copyright (c) University of Cambridge, 1995 - 2018
# SPDX-License-Identifier: GPL-2.0-or-later
# 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
# The buildname defaults to "<os-type>-<arch-type>". It can be
# overridden by the "build" parameter when invoking make (e.g. make
# build=xxx) This does not provide an override for the OS type and
# architecture type used during the build process; 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.
#
# EXIM_BUILD_SUFFIX gets appended to the buildname. (This enables
# parallel builds on a file system shared among different Linux distros
# (same os-type, same arch-type). The ../test/runtest script honours the
# EXIM_BUILD_SUFFIX when searching the Exim binary.)
buildname=$${build:-`$(SHELL) scripts/os-type`-`$(SHELL) scripts/arch-type`}$${EXIM_BUILD_SUFFIX:+.$$EXIM_BUILD_SUFFIX}
# 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.
# If Local/Makefile-<buildname> exists, it is read too.
all: Local/Makefile configure
@cd build-$(buildname); $(MAKE) SHELL=$(SHELL) $(MFLAGS)
# This pair for the convenience of of the Debian maintainers
exim utils: Local/Makefile configure
@cd build-$(buildname); $(MAKE) SHELL=$(SHELL) $(MFLAGS) $@
# For testsuite builds
exim_openssl exim_gnutls: 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" >> $@
-bd=build-$(buildname); [ -d $$bd ] && echo -e "$$bd/config.h\n$$bd/Makefile" >> $@
find src Local OS exim_monitor -name "*.[cshyl]" -print \
-o -name "os.[ch]*" -print \
-o -name "*akefile*" -print \
-o -name config.h.defaults -print \
-o -name EDITME -print >> $@
FRC:
# End of top-level makefile

153
NOTICE Normal file
View file

@ -0,0 +1,153 @@
THE EXIM MAIL TRANSFER AGENT
----------------------------
Copyright (c) 2004 University of Cambridge
SPDX-License-Identifier: GPL-2.0-or-later
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,

1059
OS/Makefile-Base Normal file

File diff suppressed because it is too large Load diff

330
OS/Makefile-Default Normal file
View file

@ -0,0 +1,330 @@
##################################################
# The Exim mail transport agent #
##################################################
# Copyright (c) The Exim Maintainers 2022
# SPDX-License-Identifier: GPL-2.0-or-later
# 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=-lpcre2-8
# 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
# 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
# If you want to use local_scan() at all, the support code must be included
# by uncommenting this line.
# HAVE_LOCAL_SCAN=yes
# 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
# A very simple example points to a template function that doesn't actually do
# any scanning, but just accepts the message. A compilable file must be
# included in the build even if HAVE_LOCAL_SCAN is not defined.
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 variable 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

56
OS/Makefile-FreeBSD Normal file
View file

@ -0,0 +1,56 @@
# Exim: OS-specific make file for FreeBSD
#
# Copyright (c) The Exim Maintainers 2020 - 2023
# SPDX-License-Identifier: GPL-2.0-or-later
CHOWN_COMMAND=/usr/sbin/chown
#STRIP_COMMAND=/usr/bin/strip
CHMOD_COMMAND=/bin/chmod
# FreeBSD Ports no longer insert compatibility symlinks into /usr/bin for
# scripting languages which traditionally have had them.
PERL_COMMAND=/usr/local/bin/perl
HAVE_SA_LEN=YES
# crypt() is in a separate library
LIBS=-lcrypt -lm -lutil -lexecinfo
# Dynamically 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

32
OS/Makefile-GNU Normal file
View file

@ -0,0 +1,32 @@
# Exim: OS-specific make file for GNU and variants.
#
# Copyright (c) The Exim Maintainers 2020
# SPDX-License-Identifier: GPL-2.0-or-later
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

39
OS/Makefile-Linux Normal file
View file

@ -0,0 +1,39 @@
# Exim: OS-specific make file for Linux. This is for modern Linuxes,
# which use libc6.
# Copyright (c) The Exim Maintainers 2020
#
# 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
# The system cc may be gcc or clang; do not force gcc
CC=cc
# 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 = -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

32
OS/Makefile-OpenBSD Normal file
View file

@ -0,0 +1,32 @@
# Exim: OS-specific make file for OpenBSD
# Copyright (c) The Exim Maintainers 2022 - 2023
# SPDX-License-Identifier: GPL-2.0-or-later
CHOWN_COMMAND=/usr/sbin/chown
CHGRP_COMMAND=/usr/sbin/chgrp
CHMOD_COMMAND=/bin/chmod
CC=cc
CFLAGS=-O2 -Wall -Wno-parentheses -Wno-self-assign -Wno-logical-op-parentheses
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
CFLAGS += -DNO_EXECINFO
# OpenBSD ships with a too-old Berkeley DB. NDBM is the default if we don't specify one.
#USE_DB=yes
# End

26
OS/Makefile-SunOS5 Normal file
View file

@ -0,0 +1,26 @@
# Exim: OS-specific make file for SunOS5
# Copyright (c) The Exim Maintainers 2020 - 2023
# SPDX-License-Identifier: GPL-2.0-or-later
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
OS_C_INCLUDES=setenv.c
CFLAGS += -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1 -D__EXTENSIONS__
CFLAGS += -DNO_EXECINFO
# End

44
OS/eximon.conf-Default Normal file
View file

@ -0,0 +1,44 @@
# 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.
# Copyright (c) The Exim Maintainers 2022
# SPDX-License-Identifier: GPL-2.0-or-later
# 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

215
OS/os.Configuring Normal file
View file

@ -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 ***

50
OS/os.c-FreeBSD Normal file
View file

@ -0,0 +1,50 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) Jeremy Harris 1995 - 2020 */
/* Copyright (c) The Exim Maintainers 2021 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* See the file NOTICE for conditions of use and distribution. */
/* FreeBSD-specific code. This is concatenated onto the generic
src/os.c file. */
/*************
Sendfile shim
*************/
ssize_t
os_sendfile(int out, int in, off_t * offp, size_t cnt)
{
off_t loff = offp ? *offp : 0;
off_t written;
if (sendfile(in, out, loff, cnt, NULL, &written, 0) < 0) return (ssize_t)-1;
if (offp) *offp = loff + written;
return (ssize_t)written;
}
/*************************************************
TCP Fast Open: check that the ioctl is accepted
*************************************************/
#ifndef COMPILE_UTILITY
void
tfo_probe(void)
{
# ifdef TCP_FASTOPEN
int sock;
if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) >= 0
&& setsockopt(sock, IPPROTO_TCP, TCP_FASTOPEN, &on, sizeof(on) >= 0)
)
f.tcp_fastopen_ok = TRUE;
close(sock);
# endif
}
#endif
/* End of os.c-Linux */

57
OS/os.c-GNU Normal file
View file

@ -0,0 +1,57 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) The Exim Maintainers 2020 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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 */

166
OS/os.c-Linux Normal file
View file

@ -0,0 +1,166 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) University of Cambridge 1997 - 2018 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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 */
/*************
* Sendfile *
*************/
#include <sys/sendfile.h>
ssize_t
os_sendfile(int out, int in, off_t * off, size_t cnt)
{
return sendfile(out, in, off, cnt);
}
/* End of os.c-Linux */

17
OS/os.c-SunOS5 Normal file
View file

@ -0,0 +1,17 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) University of Cambridge 2016 */
/* Copyright (c) Jeremy Harris 2016 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* See the file NOTICE for conditions of use and distribution. */
/* Solaris-specific code. This is concatenated onto the generic
src/os.c file. */
#if defined(MISSING_UNSETENV_3) && !defined(COMPILE_UTILITY)
# include "setenv.c"
#endif
/* End of os.c-SunOS5 */

84
OS/os.h-FreeBSD Normal file
View file

@ -0,0 +1,84 @@
/* Exim: OS-specific C header file for FreeBSD */
/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* See the file NOTICE for conditions of use and distribution. */
#include <sys/types.h>
#include <sys/param.h>
#define HAVE_BSD_GETLOADAVG
#define HAVE_SETCLASSRESOURCES
#define HAVE_MMAP
#define HAVE_SYS_MOUNT_H
#define HAVE_GETIFADDRS
#define SIOCGIFCONF_GIVES_ADDR
#define HAVE_SRANDOMDEV
#define HAVE_ARC4RANDOM
#define EXIM_HAVE_OPENAT
#define EXIM_HAVE_FUTIMENS
/* Applications should not call arc4random_stir() explicitly after
* FreeBSD r227520 (approximately 1000002).
* Set NOT_HAVE_ARC4RANDOM_STIR if the version released is past
* that point. */
#if __FreeBSD_version >= 1000002
# define NOT_HAVE_ARC4RANDOM_STIR
#endif
typedef struct flock flock_t;
/* iconv arg2 type: libiconv in Ports uses "const char* * inbuf" and was
* traditionally the only approach available. The iconv functionality
* in libc is "char ** restrict src".
*
* <https://www.freebsd.org/doc/en/books/porters-handbook/using-iconv.html>
* says that libc has iconv since 2013, in 10-CURRENT. FreeBSD man-pages
* shows it included in 10.0-RELEASE. Writing this in 2017, 10.3 is the
* oldest supported release, so we should assume non-libiconv by default.
* (Actually, people still using old releases past EOL; we shouldn't support
* them but I don't want to deal with howls of complaints because we dare
* to not support the unsupported, so guard this on FreeBSD 10+)
*
* Thus we no longer override iconv.
*
* However, if libiconv is installed, and anything adds /usr/local/include
* to include-path (likely) then we'll get that. So define a variable
* which makes the libiconv try to not interfere with OS iconv.
*/
#if __FreeBSD__ >= 10
# define LIBICONV_PLUG
#endif
/* for more specific version constraints, look at __FreeBSD_version
* from <sys/param.h> */
/* When using DKIM, setting OS_SENDFILE can increase
performance on outgoing mail a bit. */
#define OS_SENDFILE
extern ssize_t os_sendfile(int, int, off_t *, size_t);
#ifdef PID_T_FMT
# undef PID_T_FMT
#endif
#define PID_T_FMT "%d"
/*******************/
#define EXIM_TFO_PROBE
#define EXIM_TFO_FREEBSD
/* for TCP state-variable values, for TFO logging */
#include <netinet/tcp_fsm.h>
#define TCP_SYN_RECV TCPS_SYN_RECEIVED
/*******************/
#define EXIM_HAVE_KEVENT
#define EXIM_HAVE_STRCHRNUL
/* End */

35
OS/os.h-GNU Normal file
View file

@ -0,0 +1,35 @@
/* Exim: OS-specific C header file for GNU/Hurd */
/* Copyright (c) The Exim Maintainers 2020 - 2021 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include <features.h>
#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 */
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* setgroups(0, NULL) succeeds, and drops the gid group
as well as any supplementary groups*/
#define OS_SETGROUPS_ZERO_DROPS_ALL
#if _POSIX_C_SOURCE >= 200809L || _ATFILE_SOURCE
# define EXIM_HAVE_OPENAT
#endif
/* End */

107
OS/os.h-Linux Normal file
View file

@ -0,0 +1,107 @@
/* Exim: OS-specific C header file for Linux */
/* Copyright (c) The Exim Maintainers 2021 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2020 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* See the file NOTICE for conditions of use and distribution. */
/* 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>
#include <sys/types.h>
#define CRYPT_H
#define GLIBC_IP_OPTIONS
#define HAVE_MMAP
#define HAVE_BSD_GETLOADAVG
#define HAVE_SYS_STATVFS_H
#define HAVE_GETIFADDRS
#define NO_IP_VAR_H
#define SIG_IGN_WORKS
/* When using DKIM, setting OS_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. As of 2017 those are declared
to be too old to build by default. */
#define OS_SENDFILE
extern ssize_t os_sendfile(int, int, off_t *, size_t);
#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
#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
#if _POSIX_C_SOURCE >= 200809L || _ATFILE_SOURCE
# define EXIM_HAVE_OPENAT
# define EXIM_HAVE_FUTIMENS
#endif
/* TCP Fast Open support */
#include <netinet/tcp.h> /* for TCP_FASTOPEN */
#include <sys/socket.h> /* for MSG_FASTOPEN */
#if defined(TCP_FASTOPEN) && !defined(MSG_FASTOPEN)
# define MSG_FASTOPEN 0x20000000
#endif
#define EXIM_HAVE_TCPI_UNACKED
#ifndef TCPI_OPT_SYN_DATA
# define TCPI_OPT_SYN_DATA 32
#endif
/* "Abstract" Unix-socket names */
#define EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
/* inotify(7) etc syscalls */
#define EXIM_HAVE_INOTIFY
/* Needed for uClibc */
#ifndef NS_MAXMSG
# define NS_MAXMSG 65535
#endif
#define EXIM_HAVE_STRCHRNUL
/* End */

66
OS/os.h-OpenBSD Normal file
View file

@ -0,0 +1,66 @@
/* Exim: OS-specific C header file for OpenBSD */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* Copyright (c) The Exim Maintainers 2021 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* See the file NOTICE for conditions of use and distribution. */
#define HAVE_BSD_GETLOADAVG
#define HAVE_MMAP
#define HAVE_SYS_MOUNT_H
#define HAVE_GETIFADDRS
#define EXIM_HAVE_OPENAT
#define EXIM_HAVE_FUTIMENS
#define HAVE_ARC4RANDOM
/* In May 2014, OpenBSD 5.5 was released which cleaned up the arc4random_* API
which removed the arc4random_stir() function. Set NOT_HAVE_ARC4RANDOM_STIR
if the version released is past that point. */
#include <sys/param.h>
#if OpenBSD >= 201405
# define NOT_HAVE_ARC4RANDOM_STIR
#endif
typedef struct flock flock_t;
#define os_strsignal strsignal
#define OS_STRSIGNAL
typedef struct __res_state *res_state;
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
#ifndef EPROTO
# define EPROTO 71
#endif
/* We need to force this; the automatic in buildconfig.c gets %ld */
#ifdef OFF_T_FMT
# undef OFF_T_FMT
# undef LONGLONG_T
#endif
#define OFF_T_FMT "%lld"
#define LONGLONG_T long long int
#ifdef PID_T_FMT
# undef PID_T_FMT
#endif
#define PID_T_FMT "%d"
#ifdef INO_T_FMT
# undef INO_T_FMT
#endif
#define INO_T_FMT "%llu"
#ifdef TIME_T_FMT
# undef TIME_T_FMT
#endif
#define TIME_T_FMT "%lld"
/* seems arpa/nameser.h does not define this.
Space-constrained devices could use much smaller; a few k. */
#define NS_MAXMSG 65535
#define EXIM_HAVE_KEVENT
/* End */

59
OS/os.h-SunOS5 Normal file
View file

@ -0,0 +1,59 @@
/* Exim: OS-specific C header file for SunOS5 aka Solaris */
/* Copyright (c) The Exim Maintainers 2021 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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 EXIM_HAVE_OPENAT
#define EXIM_HAVE_FUTIMENS
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
#if _POSIX_C_SOURCE < 200112L
# define MISSING_UNSETENV_3
#endif
#if _POSIX_C_SOURCE < 200809L
# define MISSING_POSIX_MEMALIGN
#endif
/* SunOS5 doesn't accept getcwd(NULL, 0) to auto-allocate
a buffer */
#define OS_GETCWD
#ifndef MIN
# define MIN(a,b) (((a)<(b))?(a):(b))
# define MAX(a,b) (((a)>(b))?(a):(b))
#endif
/* End */

View file

@ -0,0 +1,29 @@
# Exim: OS-specific make file for AIX
# Written by Nick Waterman (nick@cimio.co.uk)
# Modified by PH following a message from Mike Meredith
# SPDX-License-Identifier: GPL-2.0-or-later
# 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

View file

@ -0,0 +1,22 @@
# Exim: OS-specific make file for BSDI aka BSD/OS. Its antique link editor
# cannot handle the TextPop overriding.
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,114 @@
# OS-specific file for Cygwin.
# SPDX-License-Identifier: GPL-2.0-or-later
# This file provided by Pierre A. Humblet <Pierre.Humblet@ieee.org>
HAVE_IPV6 = yes
HAVE_ICONV = yes
# Use c99 to have %z
CFLAGS= -g -Wall -std=c99 -U __STRICT_ANSI__
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 normally 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
#DISABLE_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_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
# All modes are in octal and must start with 0
EXIMDB_DIRECTORY_MODE = 01777
EXIMDB_MODE = 0666
EXIMDB_LOCKFILE_MODE = 0666
INPUT_DIRECTORY_MODE = 01777
LOG_DIRECTORY_MODE = 01777
LOG_MODE = 0666
MSGLOG_DIRECTORY_MODE = 01777
SPOOL_DIRECTORY_MODE = 01777
SPOOL_MODE = 0600
# End

View file

@ -0,0 +1,33 @@
# Exim: OS-specific make file for DGUX
# SPDX-License-Identifier: GPL-2.0-or-later
#
# 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

View file

@ -0,0 +1,34 @@
# Exim: OS-specific make file for Darwin (Mac OS X).
# SPDX-License-Identifier: GPL-2.0-or-later
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
#
# 2020/05/12 disable TLS resume support; it results in
# "1 select() failure: No such file or directory"
# being logged by the daeomn (sending the testsuite red...)
CFLAGS=-O -no-cpp-precomp -DDISABLE_TLS_RESUME
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

View file

@ -0,0 +1,33 @@
# Exim: OS-specific make file for DragonFly
# SPDX-License-Identifier: GPL-2.0-or-later
#
# 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

View file

@ -0,0 +1,30 @@
# Exim: OS-specific make file for GNU and variants.
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,30 @@
# Exim: OS-specific make file for GNU and variants.
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,9 @@
# Exim: OS-specific make file for HI-OSF/1-MJ and HI-UX/MPP
# SPDX-License-Identifier: GPL-2.0-or-later
CC=cc
CFLAGS=-O
RANLIB=@true
EXIWHAT_EGREP_ARG='/exim( |$$)'
# End

View file

@ -0,0 +1,13 @@
# Exim: OS-specific make file for HI-UX
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,28 @@
# Exim: OS-specific make file for HP-UX later than 9
# SPDX-License-Identifier: GPL-2.0-or-later
# 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
OS_C_INCLUDES=setenv.c
# End

View file

@ -0,0 +1,16 @@
# Exim: OS-specific make file for HP-UX 9
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,13 @@
# Exim: OS-specific make file for IRIX
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,14 @@
# Exim: OS-specific make file for IRIX6 on 64-bit systems
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,18 @@
# Exim: OS-specific make file for IRIX 6 on 32-bit systems.
# SPDX-License-Identifier: GPL-2.0-or-later
# 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

View file

@ -0,0 +1,17 @@
# Exim: OS-specific make file for IRIX 6.5
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,28 @@
# Exim: OS-specific make file for NetBSD (ELF object format)
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,25 @@
# Exim: OS-specific make file for NetBSD (a.out/COFF object format)
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,11 @@
# Exim: OS-specific make file for OSF1
# SPDX-License-Identifier: GPL-2.0-or-later
CFLAGS=-O
LIBS=-liconv -lm
HAVE_CRYPT16=yes
HAVE_ICONV=yes
HOSTNAME_COMMAND=/usr/bin/hostname
EXIWHAT_EGREP_ARG='/exim( |$$)'
# End

View file

@ -0,0 +1,18 @@
# Exim: OS-specific make file for OpenUNIX
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,31 @@
# Exim: OS-specific makefile for QNX
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,29 @@
# Exim: OS-specific make file for SCO
# SPDX-License-Identifier: GPL-2.0-or-later
# 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

View file

@ -0,0 +1,35 @@
# 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>
# SPDX-License-Identifier: GPL-2.0-or-later
# 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

View file

@ -0,0 +1,17 @@
# Exim: OS-specific make file for SunOS4
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,19 @@
# Exim: OS-specific make file for SunOS5 on a HAL
# SPDX-License-Identifier: GPL-2.0-or-later
# 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

View file

@ -0,0 +1,19 @@
# Exim: OS-specific make file for Ultrix
# SPDX-License-Identifier: GPL-2.0-or-later
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

View file

@ -0,0 +1,25 @@
# Exim: OS-specific make file for SCO SVR4.2MP (and maybe Unixware)
# SPDX-License-Identifier: GPL-2.0-or-later
#
# *** 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

View file

@ -0,0 +1,34 @@
# Exim: OS-specific make file for Unixware 2.x
# SPDX-License-Identifier: GPL-2.0-or-later
#
# 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

View file

@ -0,0 +1,33 @@
# Exim: OS-specific make file for Unixware7
# Based on information from James FitzGibbon <james@ehlo.com>
# SPDX-License-Identifier: GPL-2.0-or-later
# 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

View file

@ -0,0 +1,17 @@
# Exim: OS-specific make file for RiscOS4bsd
# SPDX-License-Identifier: GPL-2.0-or-later
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

14
OS/unsupported/README Normal file
View file

@ -0,0 +1,14 @@
Files in this directory are historical. They may have worked once but the
project has no assurance that they still do.
If you need to use one for a build for your platform, copy it up one directory
level first. We'll reinstate it given a current version and evidence of testing.
For the latter please look into the project regression testsuite, and please
consider operating a buildfarm animal in the long term (it runs the testsuite).
The buildfarm status page is:
https://buildfarm.exim.org/cgi-bin/show_status.pl
There's a "register" link there with a link to how-to instructions. Please do
monitor the status of your animal on an ongoing basis. The exim-users or
exim-dev mailinglist are good places to ask for help and to discuss any regressions
seen in test runs. There is also the #exim IRC channel on Freenode.

20
OS/unsupported/os.c-BSDI Normal file
View file

@ -0,0 +1,20 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) 2016 Heiko Schlittermann <hs@schlittermann.de> */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* See the file NOTICE for conditions of use and distribution. */
/* BSDI-specific code. This is concatenated onto the generic
src/os.c file. */
#ifndef OS_UNSETENV
#define OS_UNSETENV
int
os_unsetenv(const uschar * name)
{
unsetenv(CS name);
return 0;
}

View file

@ -0,0 +1,36 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) University of Cambridge 2001 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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 */

17
OS/unsupported/os.c-HP-UX Normal file
View file

@ -0,0 +1,17 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) University of Cambridge 2016 */
/* Copyright (c) Jeremy Harris 2016 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* See the file NOTICE for conditions of use and distribution. */
/* HP-UX-specific code. This is concatenated onto the generic
src/os.c file. */
#ifndef COMPILE_UTILITY
# include "setenv.c"
#endif
/* End of os.c-SunHP-UX */

120
OS/unsupported/os.c-IRIX Normal file
View file

@ -0,0 +1,120 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) The Exim Maintainers 2022 */
/* Copyright (c) University of Cambridge 2001 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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, GET_UNTAINTED);
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 = CS 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 */

120
OS/unsupported/os.c-IRIX6 Normal file
View file

@ -0,0 +1,120 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) The Exim Maintainers 2022 */
/* Copyright (c) University of Cambridge 2001 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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, GET_UNTAINTED);
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 = CS 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 */

120
OS/unsupported/os.c-IRIX632 Normal file
View file

@ -0,0 +1,120 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) The Exim Maintainers 2022 */
/* Copyright (c) University of Cambridge 2001 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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, GET_UNTAINTED);
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 = CS 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 */

120
OS/unsupported/os.c-IRIX65 Normal file
View file

@ -0,0 +1,120 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) The Exim Maintainers 2022 */
/* Copyright (c) University of Cambridge 2001 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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, GET_UNTAINTED);
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 = CS 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 */

37
OS/unsupported/os.c-OSF1 Normal file
View file

@ -0,0 +1,37 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* Copyright (c) University of Cambridge 2001 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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 */

532
OS/unsupported/os.c-cygwin Normal file
View file

@ -0,0 +1,532 @@
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Cygwin-specific code. December 2002. Updated Jan 2015.
This is prefixed to the 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);
}
#ifndef COMPILE_UTILITY /* Utilities don't need special code */
#ifdef INCLUDE_PAM
#include "../pam/pam.c"
#endif
#include <alloca.h>
unsigned int cygwin_WinVersion;
/* Conflict between Windows definitions and others */
#ifdef NOERROR
#undef NOERROR
#endif
#ifdef DELETE
#undef DELETE
#endif
#include <windows.h>
#include <ntstatus.h>
#include <lmcons.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 fakesetugid = 1; /* when not privileged, setugid = noop */
#undef setuid
int cygwin_setuid(uid_t uid )
{
int res = 0;
if (fakesetugid == 0) {
res = setuid(uid);
if (cygwin_debug)
fprintf(stderr, "setuid %u %u %d pid: %d\n",
uid, getuid(),res, getpid());
}
return res;
}
#undef setgid
int cygwin_setgid(gid_t gid )
{
int res = 0;
if (fakesetugid == 0) {
res = setgid(gid);
if (cygwin_debug)
fprintf(stderr, "setgid %u %u %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,
};
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;
if (ret == (CREATE_BIT))
break;
}
}
else
fprintf(stderr, "has_create_token_privilege %u\n", GetLastError());
if (hToken)
CloseHandle(hToken);
return ret;
}
/*
We use cygwin_premain to fake a few things
and to provide some debug info
*/
void cygwin_premain2(int argc, char ** argv, struct per_process * ptr)
{
int i, res, is_daemon = 0, is_spoolwritable, is_privileged, is_eximuser;
uid_t myuid, systemuid;
gid_t mygid, adminsgid;
struct passwd * pwp = NULL;
struct stat buf;
char *cygenv;
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') {
ssize_t size;
wchar_t *win32_path;
argv[i][1] = 'n'; /* Replace -c by -n */
cygwin_debug = TRUE;
fprintf(stderr, "CYGWIN = \"%s\".\n", cygenv);
if (((size = cygwin_conv_path(CCP_POSIX_TO_WIN_W,"/", win32_path, 0)) > 0)
&& ((win32_path = store_malloc(size)) != NULL)
&& (cygwin_conv_path(CCP_POSIX_TO_WIN_W,"/", win32_path, size) == 0)) {
fprintf(stderr, " Root / mapped to %ls.\n", win32_path);
store_free(win32_path);
}
}
else if (argv[i][1] == 'b' && argv[i][2] == 'd') {
is_daemon = 1;
cygwin_setpriority();
}
}
}
/* Nt/2000/XP
We initially set the exim uid & gid to those of the "exim user",
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 allow exim imposed restrictions (bypassable by recompiling)
and to avoid exec that cause loss of privilege
If not privileged and unable to chown,
we set the exim uid to our uid.
If unprivileged and /var/spool/exim is writable and not running as listening daemon,
we fake all subsequent setuid. */
/* Get the system and admins uid from their sids */
if ((systemuid = cygwin_internal(CW_GET_UID_FROM_SID, & SystemSid)) == -1) {
fprintf(stderr, "Cannot map System sid. Aborting\n");
exit(1);
}
if ((adminsgid = cygwin_internal(CW_GET_GID_FROM_SID, & AdminsSid)) == -1) {
fprintf(stderr, "Cannot map Admins sid. Aborting\n");
exit(1);
}
priv_flags = get_privileges ();
is_privileged = !!(priv_flags & CREATE_BIT);
/* Call getpwnam for account exim after getting the local exim name */
char exim_username[DNLEN + UNLEN + 2];
if (cygwin_internal(CW_CYGNAME_FROM_WINNAME, "exim", exim_username, sizeof exim_username) != 0)
pwp = getpwnam (exim_username);
/* If cannot setuid to exim or and is not the daemon (which is assumed to be
able to chown or to be the exim user) set the exim ugid to our ugid to avoid
chown failures after creating files and to be able to setuid to exim in
exim.c ( "privilege not needed" ). */
if ((is_privileged == 0) && (!is_daemon)) {
exim_uid = myuid;
exim_gid = mygid;
}
else if (pwp != NULL) {
exim_uid = pwp->pw_uid; /* Set it according to passwd */
exim_gid = pwp->pw_gid;
is_eximuser = 1;
}
else {
exim_uid = systemuid;
exim_gid = adminsgid;
is_eximuser = 0;
}
res = stat("/var/spool/exim", &buf);
/* Check if writable (and can be stat) */
is_spoolwritable = ((res == 0) && ((buf.st_mode & S_IWOTH) != 0));
fakesetugid = (is_privileged == 0) && (is_daemon == 0) && (is_spoolwritable == 1);
if (is_privileged) { /* Can setuid */
if (cygwin_setgid(exim_gid) /* Setuid to exim */
|| cygwin_setuid(exim_uid)) {
fprintf(stderr, "Unable to setuid/gid to exim. priv_flags: %x\n", priv_flags);
exit(0); /* Problem... Perhaps not in 544 */
}
}
/* Set the configuration file uid and gid to the system uid and admins gid. */
config_uid = systemuid;
config_gid = adminsgid;
/* Pretend we are root to avoid useless exec
and avoid exim set limitations.
We are limited by file access rights */
root_uid = getuid ();
if (cygwin_debug) {
fprintf(stderr, "Starting uid %u, gid %u, priv_flags %x, is_privileged %d, is_daemon %d, is_spoolwritable %d.\n",
myuid, mygid, priv_flags, is_privileged, is_daemon, is_spoolwritable);
fprintf(stderr, "root_uid %u, exim_uid %u, exim_gid %u, config_uid %u, config_gid %u, is_eximuser %d.\n",
root_uid, exim_uid, exim_gid, config_uid, config_gid, is_eximuser);
}
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
Uses NtQuerySystemInformation.
This requires definitions that are not part of
standard include files.
This is discouraged starting with WinXP.
*************************************************************/
/* 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 */
} cygwin_perf_t;
static struct {
HANDLE handle;
pid_t pid;
cygwin_perf_t *perf;
} cygwin_load = {NULL, 0, NULL};
#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: %u (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: %u (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: %u (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;
}
/*****************************************************************
*
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);
/* 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;
}
}
/*****************************************************************
*
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;
if (!LoadNtdll()) {
log_write(0, LOG_MAIN, "Cannot obtain Load Average");
cygwin_load.perf = NULL;
return -1;
}
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 %p\n", (void *) 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 %p\n", (void *) 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 */

29
OS/unsupported/os.h-AIX Normal file
View file

@ -0,0 +1,29 @@
/* Exim: OS-specific C header file for AIX */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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;
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

16
OS/unsupported/os.h-BSDI Normal file
View file

@ -0,0 +1,16 @@
/* Exim: OS-specific C header file for BSDI */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#define HAVE_BSD_GETLOADAVG
#define HAVE_SETCLASSRESOURCES
#define HAVE_MMAP
#define HAVE_SYS_MOUNT_H
#define SIOCGIFCONF_GIVES_ADDR
#define OS_UNSETENV
typedef struct flock flock_t;
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

29
OS/unsupported/os.h-DGUX Normal file
View file

@ -0,0 +1,29 @@
/* Exim: OS-specific C header file for DGUX */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

View file

@ -0,0 +1,65 @@
/* Exim: OS-specific C header file for Darwin (Mac OS X) */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* #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
#define EXIM_HAVE_OPENAT
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* seems arpa/nameser.h does not define this */
#define NS_MAXMSG 65535
/* There may be very many supplementary groups for the user. See notes
in "man 2 getgroups". */
#define _DARWIN_UNLIMITED_GETGROUPS
#define EXIM_GROUPLIST_SIZE 64
/* TCP Fast Open: Darwin uses a connectx() call
rather than a modified sendto() */
#define EXIM_TFO_CONNECTX
/* MacOS, at least on the buildfarm animal, does not seem to push out
the SMTP response to QUIT with our usual handling which is trying to get
the client to FIN first so that the server does not get the TIME_WAIT */
#define SERVERSIDE_CLOSE_NOWAIT
/* End */

View file

@ -0,0 +1,14 @@
/* Exim: OS-specific C header file for DragonFly */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#define HAVE_BSD_GETLOADAVG
#define HAVE_MMAP
#define HAVE_SYS_MOUNT_H
#define SIOCGIFCONF_GIVES_ADDR
typedef struct flock flock_t;
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

View file

@ -0,0 +1,26 @@
/* Exim: OS-specific C header file for GNU/kFreeBSD */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

View file

@ -0,0 +1,26 @@
/* Exim: OS-specific C header file for GNU/kNetBSD */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

View file

@ -0,0 +1,13 @@
/* Exim: OS-specific C header file for HI-OSF/1-MJ and HI-UX/MPP */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#define HAVE_SYS_MOUNT_H
typedef struct flock flock_t;
#define F_FREESP O_TRUNC
#define DN_EXPAND_ARG4_TYPE u_char *
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

22
OS/unsupported/os.h-HI-UX Normal file
View file

@ -0,0 +1,22 @@
/* Exim: OS-specific C header file for HI-UX */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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;
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

35
OS/unsupported/os.h-HP-UX Normal file
View file

@ -0,0 +1,35 @@
/* Exim: OS-specific C header file for HP-UX versions greater than 9 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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)
/* Determined by sockaddr_un */
struct sockaddr_storage
{
short ss_family;
char __ss_padding[92];
};
/* End */

View file

@ -0,0 +1,24 @@
/* Exim: OS-specific C header file for HP-UX version 9 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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;
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

18
OS/unsupported/os.h-IRIX Normal file
View file

@ -0,0 +1,18 @@
/* Exim: OS-specific C header file for IRIX */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* End */

17
OS/unsupported/os.h-IRIX6 Normal file
View file

@ -0,0 +1,17 @@
/* Exim: OS-specific C header file for IRIX */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* End */

View file

@ -0,0 +1,19 @@
/* Exim: OS-specific C header file for IRIX */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* End */

View file

@ -0,0 +1,17 @@
/* Exim: OS-specific C header file for IRIX 6.5 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* End */

View file

@ -0,0 +1,32 @@
/* Exim: OS-specific C header file for NetBSD */
/* Copyright (c) The Exim Maintainers 2021 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
#define EXIM_HAVE_KEVENT
/* End */

View file

@ -0,0 +1,6 @@
/* Exim: OS-specific C header file for NetBSD (a.out binary format) */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include "../OS/os.h-NetBSD" /* Same as for ELF format */
/* End */

17
OS/unsupported/os.h-OSF1 Normal file
View file

@ -0,0 +1,17 @@
/* Exim: OS-specific C header file for OSF1 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* End */

View file

@ -0,0 +1,20 @@
/* Exim: OS-specific C header file for OpenUNIX */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

25
OS/unsupported/os.h-QNX Normal file
View file

@ -0,0 +1,25 @@
/* Exim: OS-specific C header file for QNX */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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;
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

22
OS/unsupported/os.h-SCO Normal file
View file

@ -0,0 +1,22 @@
/* Exim: OS-specific C header file for SCO */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

View file

@ -0,0 +1,20 @@
/* Exim: OS-specific C header file for SCO_SV */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

View file

@ -0,0 +1,40 @@
/* Exim: OS-specific C header file for SunOS4 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

View file

@ -0,0 +1,15 @@
/* Exim: OS-specific C header file for SunOS5 on HAL */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

View file

@ -0,0 +1,19 @@
/* Exim: OS-specific C header file for Ultrix */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* 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;
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

View file

@ -0,0 +1,26 @@
/* Exim: OS-specific C header file for SCO SVR4.2 (and maybe Unixware) */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/**
*** 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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

20
OS/unsupported/os.h-USG Normal file
View file

@ -0,0 +1,20 @@
/* Exim: OS-specific C header file for Unixware 2.x */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

View file

@ -0,0 +1,19 @@
/* Exim: OS-specific C header file for Unixware 7 */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#define NO_SYSEXITS
#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 */

View file

@ -0,0 +1,42 @@
/* Exim: OS-specific C header file for Cygwin */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* This code was supplied by Pierre A. Humblet <Pierre.Humblet@ieee.org>
December 2002. Updated Jan 2015. */
/* 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
#define os_strsignal strsignal
#define OS_STRSIGNAL
#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
/* 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}}
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

28
OS/unsupported/os.h-mips Normal file
View file

@ -0,0 +1,28 @@
/* Exim: OS-specific C header file for RiscOS4bsd */
/* SPDX-License-Identifier: GPL-2.0-or-later */
#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[];
/* default is non-const */
#define ICONV_ARG2_TYPE const char **
/* End */

351
README Normal file
View file

@ -0,0 +1,351 @@
THE EXIM MAIL TRANSFER AGENT VERSION 4
--------------------------------------
Copyright (c) 1995 - 2018 University of Cambridge.
SPDX-License-Identifier: GPL-2.0-or-later
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 website at https://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>
Local/Makefile-<buildname>
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

Some files were not shown because too many files have changed in this diff Show more