Change log file for Exim from version 1.921
-------------------------------------------


Version 3.16
------------

1. Debugging output listing the value of errors_to after forwarding, wasn't
giving the right value when a filter file had changed it (change 9 of 3.14).

2. Add errors_to to debugging output that says "queued for xxx transport".

3. If a user filter changed the errors_to field, this wasn't getting put into
the right storage pool, and might be corrupted.

4. Change 8 of 3.15 was bungled, leading to a message which had been frozen in
a system filter being discarded when manually thawed instead of delivered,
under some circumstances.

5. $value was being reset to empty at the start of a $lookup item. This has now
been changed; it retains its former value except when processing the "success"
string. This makes nested lookups, where the second is in the "success" string
of the first, work.

6. A transport name given as the second field in the string returned by a
queryprogram router was being ignored.

7. When a host that had no reverse DNS was RBL blacklisted, the two messages
confused people. Cut out the comment about no reverse DNS when rejecting for
RBL reasons. Instead, say explicitly, "host is blacklisted".

8. If a message was failed with \-Mg\ the system filter was still run before
the addresses were failed. This no longer happens.

9. The handling of "freeze" and "fail" in system filters has been changed.
Deliveries set up in the filter are honoured (previously they were discarded).
The same is true for non-system filters that have allow_system_actions set. A
consequence of this is that first_delivery now becomes false after freezing in
a system filter, whereas previously it did not.

10. An explicit setting of "owners =" (i.e. explicitly unsetting it) on a
forwardfile director was failing, and likewise for owngroups.

11. Added support for Berkeley DB version 3.1 (they changed the API again).
Unknown if this works with 3.0.

12. Update OpenBSD Makefile to give location of chgrp command (/usr/sbin/chgrp).

13. Introduced LIBS_EXIM and EXTRALIBS_EXIM which are on the Exim binary only,
to make it easier to avoid unwanted bits of the TCP wrappers library in the
other binaries.

14. Arranged for the pcre documentation to be in the doc directory instead of
being hidden away in src/pcre, and for pcretest to be put in the util
directory after building.

15. Added the argument of MAIL FROM to the log line when rejecting because of
lack of authentication.

16. When the /skiprelay option was set on an RBL domain, and a host that was
not in host_accept_relay tried to relay, a segmentation fault could occur, or a
screwed-up log message (the relay error message was not getting correctly set.)

17. The use of -N for testing by bypassing deliveries was not being logged with
"*>" for local deliveries (it was OK for remote ones).

18. When log_subject was set, if the subject contained newlines they got logged
as \\n instead of \n; and there was similar duplication for other non-printing
characters that were escaped.

19. Removed the test_expand testing program; it is no longer needed now that we
have exim -be.

20. -qqf was not working; deliveries were being done on the first scan if 'f'
was present in the option.

21. The SIZE_STRIPCHART and SIZE_STRIPCHART_NAME settings for Eximon couldn't
be overridden by EXIMON_SIZE_STRIPCHART[_NAME] at run time.

22. The exicyclog script was broken if the string "syslog" happened to occur in
the path set in log_file_path, e.g. /var/syslog/exim-%s. (It is supposed to
remove the item "syslog" from the value, and screwed up.)

23. Nothing was being logged when a message was rejected because SIZE was
larger than the maximum permitted size. This case is now logged in the same way
as rejection after an overlarge message has been received.

24. Added an in-memory cache of DNS lookups that fail or give DNS failures such
as timeouts. This means that a message with many addresses at the same domain
that times out won't take an excessively long time to route. There is no
caching for successful lookups - we rely on resolver and name server caching in
that case.

25. Improved one case when an overlong header could cause a bomb out if
referenced via $h_ in a filter file.

26. Previously, only the current group was tested against trusted_groups. This
has been changed so that the supplementary groups are tested as well.

27. Some file servers don't have the concept of inodes, and return -1 when
asked how many are free. Don't check against check_spool_inodes when this is
the case.

28. The use of IS NOT and DOES NOT (in caps) in filter files was not working,
giving syntax errors.

29. If one_time was set on an alias or forward file, and one of the generated
addresses then passed through a smartuser director with a new_address and a
transport, and got deferred, the generated address was incorrectly marked
"delivered" (instead of the parent address).

30. Added $body_linecount for Mutt users (data was there, just the variable
needed adding).

31. Minor wording change to bounce messages. Discussions on the mailing list
are continuing...


Version 3.15
------------

1. The "belowhome" test in appendfile used realpath() to get rid of any
symbolic links in the file being created, before comparing against the home
directory. However, it wasn't using realpath() on the home directory, which
could cause false failures if the home directory had symbolic links in it.

2. With headers_check_syntax, a missing double quote in a header line
containing very many addresses could cause a very long "address" to be created.
This could push the error message over 4096 bytes, which caused trouble in an
SMTP response. The amount of address quoted is now limited - the whole address
that follows was already limited for this very reason.

3. Changes in support of terminology change from "fail" to "decline":
  (a) Generic router synonyms:  "pass" for "fail_soft", "fail" for "fail_hard".
  (b) Ditto for host_find_failed in domainlist.
  (c) Queryprogram: "decline" for "fail".
  (d) Routers that definitely pass the domain on to the next router always
      override no_more.
  (e) Changed return values in code from FAIL to DECLINE and FAILMORE to PASS.
  (f) Wording of debugging messages changed from "failed" to "declined".

4. Installed PCRE release 3.2 (bug fix).

5. If local_interfaces contained an IPv4 address on an IPv6 system, the daemon
failed to set up the listening socket correctly.

6. Flattening the environment (3.14/40) turns out to be a *very* bad idea.
Apart from anything else, it makes -Meb fail to work. This change has been
backed off.

7. Revised time zone handling implemented: added timezone option to set what is
required.

8. When testing a system filter with -bF, if "freeze" or "fail" was
encountered, it was not treated as a significant delivery, leading to a
misleading message about normal delivery.

9. System filter files do not in fact need #Exim filter at the start; they are
always interpreted as filter files. However, -bF didn't know this.

10. $recipients was accepted in a pipe command in a system filter if the
transport did not have use_shell set, but was rejected if it did.

11. If an address passed through several directors, added headers were
eventually added in reverse order. Change this to output them in the order that
is probably expected.

12. Permit envelope sender addresses to be rewritten to <>.

13. The default connect_timeout in the smtp transport has been changed from
zero (use system default) to 5 minutes because on some systems, the system
default doesn't always seem to work. The value of 5 minutes is as recommended
by RFC 1123.

14. The error message for freeze/fail in a system filter was sometimes getting
lost or mangled.

15. If a system filter generated a pipe, file, or autoreply delivery, and no
transport was set, the unhelpful message was "No transport set by director".
This has been improved.

16. A better error message is given if a closing brace is omitted after a
variable name.

17. If the closing brace was omitted after a nested expansion, for example, if
a string was  ${expand:abcd   no error was diagnosed, and a garbled result
could be given.


Version 3.14
------------

1. Allow any user to specify -oMa etc when testing a filter.

2. $recipients wasn't getting set when testing a filter - only relevant to
system filters of course. However, only a single recipient can be set when
testing any kind of filter.

3. Transport filters were not working for SMTP output. This has been broken
since the reorganization of release 3.033.

4. Instead of importing the entire PCRE distribution, just import the files
needed for PCRE, excluding the POSIX interface and the test data, and all the
autoconf support material. Import the latest release of PCRE (3.0).

5. Eximon was mis-aligning the "..." at the end of a list of recipients.

6. Changed ${quote_mysql: so that it no longer quotes % and _ because these
must be quoted only when they are part of a pattern, *and not otherwise*. If
they are quoted in error, it doesn't work.

7. If an appendfile transport was set up with mbx_format but no file name,
it got the default locking wrong (i.e. didn't default to MBX locking).

8. $domain_data and $local_part_data were previously available only during the
running of directors and routers, but this caused confusion: (a) There was a
bug that meant they never got cleared - so *sometimes* were still set when a
transport was run; and (b) people expected them to be set in the transport,
especially if they set home_directory in a director/router (this doesn't expand
till transport time). The values are now preserved with the address and made
available at transport time.

9. Allow errors_to on deliver commands in user filters, provided that the given
address is the address that is causing the filter to run.

10. In the old days of IPv4, failure to create a socket usually meant things
were dire, and so Exim used to panic and die. However, with the arrival of IPv6
there are circumstances where IPv6 sockets fail, but IPv4 ones work, and if a
domain is routed to a mixture of IPv4 and IPv6 addresses, the right thing to do
is to let it try them all. Consequently, this error no longer causes a panic,
but instead gives an error return, and the smtp transport will carry on to the
next host, if there is one.

11. Added lock_fcntl_timeout to appendfile, to allow for blocking fcntl()
locking. The default remains blocking, however.

12. Updated exim_lock to allow for non-blocking fcntl() locking by specifying a
timeout.

13. Extended RBL handling, adding /accept, /skiprelay, and the facility to
check for specific IP addresses.

14. When autoreply complains about non-printing characters, give the character
number. Relax the rules, and allow any characters in the "text" option.

15. Ignore an ENOPROTOOPT error from the getsockopt() call for checking IP
options, instead of rejecting the call. This allows for OS such as GNU/Hurd,
which have the interface but not the underlying code.

16. Add "to <hostname>" to 550 EXPN not available, because the host check isn't
done till EXPN time (it's advertised if the list is not empty).

17. Don't suppress -oMr etc. values for non-trusted users when testing
addresses with -bv, -bvs, or -bt.

18. Include details of delivery errors in warning messages.

19. Gcc -Wall now gives a warning for subscripts of type "char" on machines
where "char" is signed. The source of Exim now has explicit casts in these
cases, which are entirely calls to isspace() etc. [I have learned my lesson.
The next program I write will explicitly use unsigned chars everywhere.]

20. Tweaked a couple of function definitions in the modified Athena widgets
code from old-style to standard C, to stop gcc giving warnings.

21. Sun's cc compiler gives warnings if an initializing value for an automatic
variable contains an operator that modifies something else, e.g. ++ or +=.
The few places in Exim where this was used have been changed.

22. Some cases of failing to close a file have been fixed: after reading an
interpolated file in a list, and after reading a header or body or message log
with -Mvh/-Mvb/-Mvl

23. The GNU Hurd allows a maximum of 2^31 open file descriptors, so Exim's
crude sledgehammer of closing all fd's before execve() calls, and when starting
up the daemon, caused a problem. This machinery has been revised. It now uses
FD_CLOEXEC on files that should not survive an exec. There has also been a
general tidying of the way it handles subprocesses with pipes. In the daemon,
explicit closing of stdin/stdout/stderr is used.

24. Relaxed restrictions on contents of maildir_tag to allow any graphic
characters, and only insert the initial colon if the first character is
alphanumeric. The expansion of the tag value now takes place after the file has
been written, and $message_size is updated to the accurate value of the file
before this expansion.

25. If quota is set on an appendfile transport, and one of the delivery modes
that writes a separate file for each message is being used, then when Exim
wants to find the size of a file, it first checks quota_size_regex. If this is
set to a regular expression that matches the file name, and it captures one
string, then that string is interpreted as a representation of the file's size.

26. Don't advertise AUTH if host in host_accept_relay, even if it is in
host_auth_accept_relay (unless "always advertise", of course).

27. Fixed some IPv6 buglets: (a) IN6ADDR_ANY_INIT doesn't need braces round it;
(b) reworked the code for outgoing calls so as to use entirely separate
structures for IPv4 and IPv6 addresses instead of trying to overlay them.

28. The "ultimate address timeout" only kicks in after a failed delivery
attempt. This means that if there are lot of messages and the destination is
going up and down, some never get tried, and so never hit this timeout. The
"ultimate message timeout" finally gets them, but in some configurations is may
be considerably longer than the address' maximum timeout. The rules for
retrying have now been changed: if a retry time has not been reached, but the
message has been on the queue for longer than the address' maximum timeout, a
delivery is attempted - if this fails, the ultimate address timeout will be
invoked. Thus the "ultimate message timeout" is no longer needed, and has been
removed from the code.

29. quota_warn_threshold was sending its message even if the actual delivery
failed because it completely overshot the quota.

30. Previously, if a lookup defered during a search of a host, or domain list,
Exim panicked and died. Now it takes less serious action (e.g. during delivery,
if this is in local_domains, it just defers the address it is checking.)

31. When displaying an IPv6 address, if it is a mapped IPv4 address, show it as
a plain V4 address without the preceding "::ffff:".

32. If a domainlist router encountered a DNS timeout (or other temporary error)
while looking up a host in a route list, it deferred (correctly), but did not
set up an appropriate message for the log.

33. It appears that more and more DNS zones are breaking the rules and putting
IP addresses on the RHS of MX records. Exim follows the rules and rejects this,
but other MTAs do support it, so allow_mx_to_ip has been added to permit this
heinous activity.

34. All configuration lines may now be continued by ending them with backslash
(ignoring trailing spaces), not just those in quotes.

35. Fixed problem in perl.c which was causing compilation failure with the
developer version of Perl (use of variable 'na').

36. Added support for Postgres SQL, analagous to MySQL.

37. Renamed forbid_reply in forwardfile as forbid_filter_reply, to go along
with other forbid_filter_xxx options, keeping the old name as a synonym.

38. All lists except log_file_path can not use an alternative separator to
colon by starting the list with <x where x is a punctuation character.

39. If Exim's spool partition got full, it was timing out on short SMTP
messages (that didn't do any writing till '.' was received) instead of giving
the correct error (a subsequent '.' gave the error - it hadn't noticed that the
'.' had been received). Some additional tidying concerned with input
termination was done in conjunction with fixing this bug.

40. I finally found out how to turn off the effect of any setting of TZ in the
environment, for most (but not all) OS. Setting "environ" to point to an empty
environment gets rid of all settings (none of which Exim needs), including TZ,
and that causes localtime() to revert to wall clock time. Exceptions: AIX,
DGUX, HP-UX, IRIX, and SCO. To cope with those, the new code is omitted if
HANDS_OFF_ENVIRONMENT is defined in the os.h file.

41. All timestamps are done in UTC if timestamps_utc is set.

42. Added local_from_check, local_from_prefix, local_from_suffix.

43. In an aliasfile director that uses a query-style lookup, "optional"
(previously ignored) now causes the address to be passed to the next director
if all the queries defer.

44. Added hosts_randomize to domainlist and smtp.

45. Queue runners with split spool now process each subdirectory separately,
except when queue_run_in_order is set.

46. Extended dnsdb lookups: (a) multiple records (b) support for different
record types.

47. If HELO was used during -bs message input, the data wasn't being preserved
in sender_helo_name.

48. Some OS (e.g. Linux) don't allow fsync() to be called for a FIFO, so skip
that call when writing to a FIFO.

49. Added forbid_include and forbid_special to aliasfile.

50. When Exim accepts a local message and forks a new process to do the
delivery in the background, it now closes stdin and stdout (and stderr unless
debugging) in the new process. Previously they were left open. This meant that
if the calling process had set up stdout as a pipe and was was trying to read
it, it didn't get the EOF until after the delivery process had finished, thus
causing the calling process to hang around longer than necessary.

51. When Exim is writing to a FIFO and the process reading it is not keeping
up, the write() function gets an EAGAIN error. Exim now waits one second and
tries again.

52. Added "tr" and "sg" expansion operators.

53. Add check_owner to appendfile, and use geteuid() instead of getuid() to
check ownership (change affects non-suid installations).

54. Re-organize uid/gid checks in local delivery process so as to work better
for non-suid installations.

55. Added sender_address_relay_hosts.

56. Added security=unprivileged for those that want to run all local deliveries
as the Exim user.

57. The "unable to get root" error for local deliveries was going only to the
panic log - send it to mainlog as well.

58. If SPOOL_DIRECTORY was not defined in Local/Makefile, the monitor would not
build.


Version 3.13
------------

1. Incoming SMTP timeouts were getting disabled after certain kinds of
verification.

2. The "senders" setting on directors and routers was getting string expanded
twice, by mistake. This mattered if after the first expansion there was a \ or
a $ in the string (e.g. in a regex).

3. Exim could crash if any rewriting rules that applied to envelope recipients
referred to the contents of any header lines.

4. If an attempt to authenticate using PAM failed because of some error
condition, Exim was accepting rather than rejecting the authentication.

5. Exim crashed if a test for first_delivery or queue_running in an expansion
string was part of an "or" group of which an earlier condition succeeded.

6. LDAP fallover to multiple servers in ldap_default_servers was not working
if an LDAP lookup included initial parameter settings for user, password,
time, etc.

7. A ${hash_n:xxx} expansion did the wrong thing if n was less than the length
of xxx, screwing up later text in the expansion string.

8. The second argument of the pam_converse() function is defined without a
leading "const" in Solaris, unlike Linux. This is now parameterized so that
different OS can use different values, and thereby avoid compile-time warnings.

9. A missing data string for PAM could cause a crash instead of passing back an
empty string.

10. A lookup defer while processing sender_reject was giving a 550 error code
to MAIL instead of 451. For sender_reject_recipients, a lookup defer was
rejecting recipients (with 550); now it gives a 451 to the MAIL command. If
there is a lookup defer while processing host_reject_recipients, it now rejects
the call instead of rejecting the recipients (so there will be a retry later).
If there is a lookup defer while checking host_accept_relay, the rejection now
uses 451 instead of 550.

11. A couple of 450 codes have been changed to 451.

12. Add "(another process is handling this message)" to "Spool file is locked"
to try to forestall the FAQ.

13. When looking up an IP address for a host obtained from MX records in an
IPv6-aware version of Exim, it deferred if the AAAA lookup deferred; now it
goes on to try for the A record in that circumstance. If either record is
found, it is happy (both are used if present); deferral happens only if one of
them deferred and the other did not succeed. Both must fail outright for it to
conclude that there is no available IP address.

14. The sed commands in the Makefile were not quoting their arguments, so if,
for example, something like MV_COMMAND was set to a string containing white
space, the command fell over. This change means that the quotes set up for
EXIWHAT_EGREP_ARG get passed through into the munged script, so remove the ones
in the script. (We can't remove those in Makefile-Default because we can't then
have leading white space in the value.)

15. Some monitor parameters had been overlooked in the default settings in the
eximon script, and not set up so that they could be overridden by environment
variables with names EXIMON_xxxx.

16. Made exiwhat sort process ids numerically. On some systems duplicate
information gets output, so remove duplicate lines in the output.

17. For filter testing (-bf and -bF) output the sender and recipient address at
the start, to avoid confusion.

18. Implemented auth_always_advertise (default TRUE).

19. If an address became local through routing (e.g. via self=local) and it
then passed through a filter which did no significant deliveries, it got passed
back to the routers instead of on to the next director.

20. Add the sender address to the log message for log_refused_recipients,
because recipients_reject_except_senders means that it might matter.

21. Add allow_fifo to appendfile to allow delivery to named pipes.

22. Reword "unavailable filtering command X" as "filtering command X is
available only in system filters".

23. Added qualify_preserve_domain to smartuser, to make it the same as
aliasfile and forwardfile.

24. Added -noduperr to exim_dbmbuild, to prevent an error return just for
duplicate keys.


Version 3.12
------------

1. After a successful delivery, the message log file was being fclosed twice;
some operating systems' C libraries just ignore the second fclose, but others
crashed; this caused -J files to be left lying about.

2. The "contains" operation in filter files was failing to find matches when
the initial character of the searched-for string was duplicated in the subject
string, e.g. searching for "[Boston]" in "[[Boston] ..." failed. The bug was in
the "strstric()" function, which would also have affected -R and -S operations.


Version 3.11
------------

1. For repeatable testing, arrange memory tracing output not to list addresses
in special regression testing case.

2. When reading a very, very long header line, Exim was continually copying the
string as it got longer, but never freeing any of the store. Thus it could
bloat to hundreds of megabytes. Improvements in this area:

  (a) It now frees up the intermediate blocks.
  (b) Instead of incrementing the header text size by 256 each time it runs
      out, it now doubles the size.
  (c) The memory debugging output shows the current total for pool memory
      so you can see it going up and down.
  (d) When scanning a header for rewrites and qualifications, it resets the
      pool memory when an address isn't changed.

3. Change 3.033/14 introduced a bug whereby the check_string didn't match the
very first line of the body of a message.

4. When a header got rewritten on input, the length of both the old and the new
was being included in the message's size.


Version 3.10
------------

1. Exim was crashing when lookup_open_max was exceeded if the type of file
being closed was different to the type of file being opened.

2. Some further tidies of the os-type and arch-type scripts.

3. ENOSPC is not treated in the same way as a quota error for the purposes of
retrying.

4. The revised exigrep (3.091/26) had "gz" and "Z" built in. Change it to check
for COMPRESS_SUFFIX.

5. If a reverse lookup done within a message failed because the name looked up
had no matching forward lookup, the error text for this got obliterated at the
end of the message, and so if it was needed for a subsequent message on the
same SMTP connection, junk got logged.


Version 3.093
-------------

1. The -bP option wasn't recognizing "authenticator xxx". It was recognizing
"auths" and "auth_list", but this abbreviation seems unexpected, so changed
those to use the full word.

2. Removed a now (since 2.12/3) useless optimization in the code for checking
whether two addresses have the same list of hosts.

3. After some calls to execv() the failure code wasn't being output.

4. Increased field widths in eximstats, as the numbers can be quite big on busy
systems.

5. Arrange for X-RBL-Warning: headers to be inserted when recipients are
allowed through by an exception list from an RBL domain that is set to reject.

6. Tidied error messages from -brw. Also, if an SMTP rewrite happens and the
source address isn't syntactically valid, just skip the other rewrites. Skip
them in any case if there are no rules with non-S flags. If there are no rules
at all, say so.

7. Reworded "no valid sender in message headers" error message, because it has
confused people. Tidied some related messages as well.

8. Added USE_DB=yes to the OpenBSD configuration.

9. Ignore check_log_space if log_file_path just contains "syslog".

10. Add closelog() to the function that closes all log files. The important
case of this is the call just before the daemon closes all file descriptors,
because otherwise it is closing the syslog one behind the system's back.

11. Two "frozen" messages were getting written to the message log in some
circumstances.

12. Bug in 3.091/23 (fixing an earlier bug) caused a crash if a list of MX
records with some identical host names came in a specific order (so it only
showed now and again).

13. In the arch-type script, when uname -p gives something containing spaces,
try uname -m. (Previously it did this only for "" or "unknown".)

14. Recognize i686 in scripts/arch-type.

15. Re-organize the os-type and arch-type scripts so that $OSTYPE and $ARCHTYPE
are now tried after uname rather than before, as many shells set silly values
in them. Manual overrides are now provided by EXIM_OSTYPE and EXIM_ARCHTYPE.


Version 3.092
-------------

1. Serious bug caused by 1-character typo: In very long messages, characters
could occasionally be lost (e.g. 3 lost in a 1.5M file). This bug was
introduced in the changes made for 3.033, so it was never in a main release.


Version 3.091
-------------

1. Exim was not reporting the actual error if there was an I/O error while
reading a message or writing the spool file during message reception. Nor was
it logging anything.

2. Some reorganization and tidying up of code for handling errors while writing
the spool header file.

3. When showing log messages for debugging, display the DIE flag when set.

4. Add logging of SMTP AUTH information to the "message received" log line.

5. Added forbid_lookup, forbid_existstest, forbid_perl to forwardfile (later
changed to better names forbid_filter_lookup etc.).

6. create_file = belowhome in appendfile could be defeated by the use of /../
in the name. Sigh. I'm not devious enough... Symbolic links could also defeat
it. These are now checked for by means of realpath(), which all the Unixes I've
checked do have. Also, Exim was creating any necessary directories before
checking create_file. It now creates directories only if it is permitted to
create the file.

7. Add more code to ldap to remember when a bind was done and with what
credentials so that it doesn't repeat the bind for a subsequent lookup with the
same credentials.

8. If create_directory was set on appendfile and the directory creation failed
for some reason, the error was not reported, so it appeared as if
create_directory had been ignored.

9. All directors except smartuser had current_directory and home_directory
options, to set values used at transport time. These options have now been made
generic, so now apply to all directors.

10. If a local delivery failed and created message longer than 256 characters,
it got truncated when logged.

11. Change "all" to "one or more" in bounce and delay messages.

12. The convert43t conversion utility didn't work for driver names containing
capital letters.

13. Change autoreply and other generated messages to use "Reply-To" instead of
"Reply-to" because that's the "suggested" form in RFC 822.

14. Pulled some common code out of aliasfile and forwardfile and made it into a
separate function which they each call.

15. The function for writing the -H file tried to create the directory if it
didn't exist, but it always will, because the -H file isn't written until the
-D file has been successfully written. So we can save a bit of code (which in
fact was buggy because it didn't support sub-directories).

16. Added move_frozen_messages, but only if SUPPORT_MOVE_FROZEN_MESSAGES
is defined. There is no current support for handling such messages.

17. If queue_smtp or queue_remote got set via queue_only_file for an incoming
SMTP message received by the daemon, the flag was not being passed on to the
delivery process.

18. An explanation to the long-standing problem of eximon menus not working
when num-lock is set has been received, and a workaround implemented.

19. Address rewrites that happened during delivery (typically on new addresses
from forward or filter files) were causing an X-rewrote-address dummy header to
be added to the message each time it happened. This could get embarrassing if
retrying went on for a long time.

20. Only write "children all complete" to the msglog file if the address has no
parent address with the same original address. Otherwise (e.g. in cases where
xxx is aliased to xxx and other things, and the new xxx gets further aliased by
another director) it can be confusing.

21. After successful directing, the debugging line showed the transport field
from the original address, which could be misleading if copied address had been
queued (e.g. by smartuser). As the general queuing function now outputs this
info, remove it at top level.

22. Smartuser was showing the old rather than the new address in its debugging
output.

23. If a broken MX list contained the same host more than once, Exim was coded
to keep only the lowest precedence, but if it saw a lower value after a higher
one, and had seen precedences between the two values, it screwed up the
sorting.

24. The revision of RFC 822 increases the encouragement for collapsing source
routed addresses from the MAY of RFC 1123 to SHOULD. I have therefore cut out
all the source route handling code, with the exception of parsing and
collapsing. The option collapse_source_routes now has no effect - they are
always collapsed. This has made it possible to make some tidies in various
places.

25. Rewrote the smartuser director - if no transport is specified, the
new_address option may now specify a list of addresses, and it may also specify
:blackhole:, :defer:, or :fail:.

26. Upgraded exigrep so that it automatically zcats compressed file.

27. Added expansion conditions first_delivery and queue_running.

28. When log_refused_recipients is set, give a reason in each log line.

29. Implemented +warn_unknown.

30. Allow EXIMON_LOG_FILE_PATH to override in eximon - useful when syslog is in
use.

31. -Mg was not forcing a thaw of frozen messages (an unwanted side effect of
change 17 in version 2.950).

32. -M and other delivery forcers (e.g. -qf) were not overriding
queue_remote_domains and queue_smtp_domains.

33. Added recipients_reject_except_senders.

34. When all deferred addresses have the same domain, it is set in $domain
during the expansion of delay_warning_condition. For pipes, files, or
autoreplies, this is the domain of the parent.

35. Changed the default configuration file to lock out domain literal support.
This is strictly contrary to the RFCs, but people don't understand about it and
it has been abused by spammers seeking open relays.

36. -Rr (and -Rrf, -Rrff) treat the string as a regular expression.

37. Added -S, which works like -R except that it checks the message's sender.

38. Added $message_age.

39. Make Exim ignore -n (no aliasing), and make -oitrue the same as -oi.

40. Typo in ldap code could cause junk to appear in the error message if a
search call failed (which it normally doesn't).

41. Source tidies to get rid of compiler warnings for possibly uninitialized
variables.


Version 3.040
-------------

1. Added additional parameters to LDAP lookups.


Version 3.039
-------------

1. Callers who have exim's gid as the current gid are now trusted.

2. Added new option admin_groups.

3. There was a bug in store handling for expansions involving very large
strings, e.g. if message_body_size was set large and was the subject of a
"match" filter condition. The symptom was a bus error.

4. Exim wouldn't build if LOG_FILE_PATH was set to any of the new syslog
variations.

5. A couple more compile-time tweaks for netBSD (default USE_DB=yes and look
for chown in /usr/sbin).


Version 3.038
-------------

1. Added support for PAM authentication.


Version 3.037
-------------

1. When forwardfile defers because it doesn't like the file's permissions,
include the offending bits in the error message.

2. General tidy of error messages from directors to remove duplicated
information. (e.g. director names, because they are also shown in the D= item
of log lines).

3. Pulled some general outgoing SMTP code out of transports/smtp.c and put it
in functions in smtp_out.c. This is also used by client authenticator code; the
interface is now cleaner.

4. Added log_queue_run_level.

5. When a message with very long headers was rejected, and the reflection of
the headers to the rejectlog filled up the log buffer, the terminating
separator line got lost, and the entry didn't necessarily end with \n. It now
always puts in the separator, and adds "*** truncated ***" if something has
been chopped off.

6. Updated eximon to cope with cases when syslog is being used. If only syslog
is being used, eximon cannot tail a log - omit that part of its window.

7. Updated exicyclog to cope with cases when syslog is being used. If only
syslog is being used, exicyclog can't cycle anything.

8. Fixed bug in base64 decoding function that was messing up CRAM-MD5
authentication for certain lengths of user name.


Version 3.036
-------------

1. Moved the logging of a message's freezing to just before the -H file is
updated, to minimize cases when the logging happens but the file doesn't get
updated (an incident was observed when a system was being shut down).

2. Ignore SIGTERM during the tidying-up phase at the end of a delivery, to
minimize the chances of things being half done.

3. Don't bother doing an RBL lookup if the host has already matched
host_reject_recipients.

4. Added "sort | uniq" into the exiwhat script, to cut out duplicates, which
sometimes happen in "ps" output.

5. Changed the file exiwhat uses to spool/exim-process.info instead of a log
file. This is so that it will continue to work when syslog logging is used.

6. Added support for syslog, configured in log_file_path.


Version 3.035
-------------

1. The debug_print option wasn't working for the smtp transport.

2. The responses to AUTH commands weren't being copied to debug output.

3. Changed the condition handling in the plaintext authenticator to allow for
forced DEFER returns ("", "0", "no", "false" => FAIL, "1"; "yes", "true" => OK;
anything else defers, text is message).

4. Added ${mask:} expansion operator.

5. Added translate_ip_address.


Version 3.034
-------------

1. When a header syntax check failed, a humungously long address that was too
much for string_sprintf to fit in the error message caused a panic exit. This
could happen, for example, if a double quote was omitted in a very long list of
addresses in a header. It now reflects just the first 1K of the address. Put a
similar limit on sender addresses in verify failed messages.


Version 3.033
-------------

1. Arrange for crypt.h to be included only on those OS that have it (Solaris,
IRIX 6, modern Linux), and for -lcrypt to be set up for those OS that need it
(FreeBSD, NetBSD, modern Linux).

2. Made MAXINTERFACES changeable in Local/Makefile.

3. When sending a delay warning message, quote the top-level original address
only, saying "an address generated from" if the actual problem is with a child.

4. Set a default for delay_warning_condition to skip precedence bulk/list/junk.

5. Allow for spaces around colons in temp_errors setting in smtp transport.

6. The "personal" test in filter files now checks for "list" and "junk" as well
as "bulk" in the Precedence: header.

7. Added retry_data_expire.

8. If a key in a partial match was very long (longer than the buffer for
string_sprintf()), Exim couldn't handle it.

9. Added expansion operator ${quote_xxx:} where xxx is a search type. Each
search type has its own (optional) quoting function. Added suitable functions
for NIS+, LDAP, and MYSQL.

10. Internal revision of the way the "From hack" and SMTP dot escaping is done
in preparation for extending appendfile. They are now unified, and are
therefore mutually exclusive.

11. The "From hack" was failing if the string "From " happened to be split
between two buffers when transporting the message.

12. If a non-SMTP message that was being read without -oi ended with "\n."
(no following NL) then the "." got lost.

13. Ensure that all non-SMTP messages have a final NL at input time, instead of
testing at delivery time. This simplifies the delivery code.

14. Replaced from_hack in appendfile and pipe by check_string and escape_string.

15. Added file_format to appendfile.


Version 3.032
-------------

1. If remove_headers contained a "fail" expansion, it caused a crash.

2. The generic headers_remove option in transports is now expanded. (Seems to
have been an oversight.)

3. Changed $host_authenticated to $sender_host_authenticated (oversight).

4. Added server_set_id generic option to authenticators and $authenticated_id
for accessing it.


Version 3.031
-------------

1. Removed unnecessary #ifdefs from lookups which don't have private header
files.

2. Added crypteq as a new expansion condition.

3. Make it recognise "netbsd" as equivalent to "NetBSD".

4. Updated the FSF's address in LICENCE and NOTICE files.

5. Code tidies for SMTP input to remove repetition of real and debugging
output by using a subroutine.

6. Added support for AUTH.

7. Source tidies of a lot of unnecessarily complicated calls to
string_nextinlist().

8. Source tidies in lookup handling.

9. Set XLFLAGS empty for IRIX6 as it doesn't seem to need anything.

10. Typo in code for decoding quota_<time> fixed; only effect would be to fail
to diagnose bad syntax.

11. -bv now runs interactively like -bt if no addresses are given.

12. Added -be for string expansion tests with configuration read.


Version 3.03
------------

1. The "failed to create child process" error wasn't including the error
information in the message.

2. The RBL function was failing to notice IPv6 addresses that were really
mapped IPv4 addresses, and so was looking up the wrong DNS names.

3. The initgroups setting on the forwardfile director was not being used unless
an explicit setting of "group" was present on that director. It now behaves as
documented and is used when either "user" is specified, or check_local_user is
set.

4. The error message for a non-absolute current directory path was quoting the
wrong path.

5. If home_directory set in a director contained a reference to $home, it got
replaced by the whole string during expansion at transport time, instead of by
the null string.

6. When opening an inline file in a host list failed, the name of the file was
omitted from the error message, and the name of the option being tested was
also missing unless debugging was in force. (It was given as NULL.)

7. A similar infelicity was present if an inline file opening failed while
checking a domain list or an address list (and in the latter case, no message
at might be written).

8. Installed PCRE 2.07.

9. An error on reading from a TCP/IP connection during the header part of a
message could lead to rubbish being added to the "unexpected disconnection" log
message.

10. The install script gave a misleading message if a file it was installing
didn't exist.


Version 3.024
-------------

1. "net24-lsearch" style host matches were failing on little-endian machines.

2. Added "net-lsearch" style, leaving off the mask value.


Version 3.023
-------------

1. If a lookup had nested lookups in the substring that was not used, the
first of them was skipped, but more deeply nested ones were not.

2. If a Return-Path: header was encountered while testing a filter file with
-bf, the value was being assigned to $return_path without removing the
enclosing <>.

3. In a system filter, the "deliver" command can now be followed by "errors_to
<some address>" to divert error reporting away from the original sender.

4. Some general code tidying for filter commands. The keyword "text" after
"fail" or "freeze" is supposed to be optional if a quote follows, but wasn't.



Version 3.022
-------------

1. tcsh sets HOSTTYPE to the OS name rather than the architecture, so ignore it
if runnining under tcsh in the arch-type script.

2. The iplookup router now sets a flag that prevents a sender address that is
being verified from being rewritten if the domain turns out to be local.

3. The double-check on the name found by an IP lookup pointing back to the
original IP address was failing when the IP address was ::ffff:<IPv4> address,
and the A records had only IPv4 addresses.

4. When something like host_accept_relay fails because a DNS reverse lookup
fails, make that clear in the rejectlog message.

5. Install pcre version 2.06 (new option plus optimisation).

6. If any normal deliveries followed in the same delivery process as ones down
a passed SMTP channel, they incorrectly got logged with "*" after the IP
address.

7. If Exim is built without EXIM_UID set, but exim_user is set in the runtime
configuration, and -C or -D is used when starting a daemon, then it gives up
root privilege on any re-execs from the daemon, but it wasn't noticing that
stderr is not provided in this situation, and when trying to write to it
instead of to the log, it wrote to file descriptor 2, which happened to be the
fd of the open -D file after a delivery attempt in some cases. It now always
has an attempt at writing the log if there is no stderr available. See also 11
below.

8. headers_sender_verify was looking only at the first address in each header.

9. Typo in top-level Makefile - ($SHELL) changed to $(SHELL).

10. If a domain is rejected in the lookuphost router because of the setting of
mx_domains, carry on with any configured widening.

11. Write to main and panic logs if called with -C or -D from an exim uid that
is defined only at runtime and not in the binary (because privilege gets lost
in that case).

12. Added configuration files for the GNU/Hurd OS.

13. Added quota_warn_threshold percent facility.

14. Added numeric hash expansion.

15. When testing with -bh, the "<=" log line wasn't being shown.

16. Added $host_lookup_failed.

17. Added the "failed to find hostname from IP address" phrase to the "relaying
prohibited" 550 message - other 5xx messages had it already.

18. Abolish the build-time settings HEADER_MAXLENGTH and HEADER_MAXHEADERS,
and replace them with a single setting HEADER_MAXSIZE that defines the maximum
size of the entire header section, defaulting to 1Mb.

19. Make Exim ignore options -oo (old style headers) and -Btype (set 7/8 bit).

20. The message id of the last message received was being attached to the
"closed by QUIT" log message for messages arriving via inetd.

21. dbmbuild used to ignore all but the last of a set of duplicate keys without
warning. Now it warns, and uses the first duplicate unless -lastdup is set, and
gives return code 1 if any duplicates are found.

22. The conversion of a textual IPv6 address to binary had a bug which could
cause it to give the wrong result sometimes (when the address wasn't followed
by *two* binary zeroes).

23. A system with IPv6 libraries, allowing Exim to compile with HAVE_IPV6, may
nevertheless not support IPv6 in the kernel. The daemon now reverts to trying
to use an IPv4 socket for listening if it can't create an IPv6 one and the
address it is listening on is not an explicit IPv6 address.

24. Added ldap_default_servers and did some tidying on the LDAP lookup code.

25. Add a terminating zero on to strings read by DBM lookup, in case there
isn't one already included. This might have caused odd effects in the past, but
not if the DBM file was built by dbmbuild, because that includes the zero by
default.

26. Added lookup type dbmnz, included with LOOKUP_DBM, that uses no trailing
zero on the key string.

27. Added option -nozero to dbmbuild, to leave off the trailing zeros on both
the keys and the data.

28. Add a 1-second delay before logging a SEGV during a DBM read, to guard
against logs filling up too fase.

29. Added MYSQL support.


Version 3.02
------------

1. When both domains and local_parts were specified on a router or director,
Exim did the expansion of both options before testing either of them (domain
first). This meant it might do a totally unnecessary lookup. Also tidied up for
senders checking.

2. Insert an explicit $(SHELL) in the Makefiles before all calls to scripts in
the scripts directory. This makes it possible to override /bin/sh easily for
those strange systems in which it isn't Bourne-compatible.

3. A smartuser director with no transport and no new_address setting (a
situation allowed only if verify_only was also set) was looping.

4. A tweak to scripts/os-type to handle SCO OpenServer v5.0.4, which is
identified as SCO_SV in 'uname -s' but sets $OSTYPE to 'sco3.2v5.0.4'.

5. When checking headers for headers_sender_verify, Exim was not ignoring
totally empty headers, which it used to do. Also, it now says which header
failed if there is a syntax error, and that the check was a result of
headers_sender_verify.

6. Tidied up matching of domains/hostnames and domain/host lists with regard to
caselessness. Inter alia, this fixes a bug where hosts_treat_as_local wasn't
working caselessly.

7. Add explicit fflush(smtp_out) after responding to SMTP QUIT. Some OS don't
seem to send out the response otherwise, and some MUAs don't like that.

8. Typo ("long_int" for "long ing") in rarely used optional code in readconf.c.

9. Show status of terminated process in debug output from daemon.

10. Rework timeout handling for SMTP input so as to call alarm() once per
buffer instead of once per line (can now do this because of 2.950/15).

11. Rework the way the queue runner waits for all descendents of the first
delivery process when it passes SMTP channels on. By passing a pipe to all the
processes, the end can be detected when a read() on the pipe unblocks (with
EOF). This should be faster because it involves no sleeping.

12. Debugging output of the final SMTP "OK" message was at level 9 instead of 3
(as all the other responses are).

13. Yet more information added to README.UPDATING as more wrinkles are
discovered.

14. Expansion of an ${if} item was doing the lookups in the substring that
wasn't going to be used, instead of skipping them.

15. If a timeout occurred while reading SMTP commands in BSMTP input, no error
message was generated.

16. Some versions of NetBSD set $ARCHTYPE to "NetBSD", which isn't helpful.
Ignore this value in a similar fudge to that used for $OSTYPE.

17. Removed out-of-date comment about pid files from src/EDITME.

18. In Sunos4, chown is in /usr/etc/chown, not /usr/bin/chown. Amazing nobody
had pointed this out before (it affects exicyclog).



Version 3.01
------------

1. Exim wasn't always handling (i.e. ignoring) white space following an
exclamation mark introducing a negative item in a domain, host, or address
list.

2. Exim was failing to compile under SunOS4 because on that OS getc, ungetc,
feof, and ferror are defined only as macros and not as assignable functions
(which Exim now needs). A suitable lash-up has been provided for this operating
system.

3. Additional information added to README.UPDATING and in comments output by
convert4r3.


Version 3.00
------------

1. The documentation has been brought up-to-date for release 3.00.

2. The -oMr option is documented as working for non-SMTP and batch SMTP input.
It was being ignored for batch SMTP. This has been fixed.

3. Add #define DN_EXPAND_ARG4_TYPE u_char * to OS/os.h-SCO because it seems
   that it is one of the operating systems that defines the fourth argument
   of dn_expand this way.


Version 2.954
-------------

1. Log reception of the SMTP "debug" command.

2. Bug introduced by 2.950/15: Exim was incorrectly assuming a dropped SMTP
call if the message's data contained a byte with the value 255. (Signed
character problem in the private "getc()" code. Sigh.)


Version 2.953
-------------

1. Typo in filter.c fixed; some compilers didn't like it, while others were
happy.

2. Make "fail_soft" for the "self" and host_find_failed domainlist options
override a generic setting of no_more.

3. Set $self_hostname when self=fail_soft in a router.

4. Added /warn and /reject to rbl_domains.

5. Reject messages with too many headers instead of just silently pushing the
rest into the body.

6. Recoded handling of multiple headers in expansion to be (hopefully) more
efficient in store usage.

7. Restrict the amount of store used by a $h_ expansion to 64K (to catch
lunatic messages with a zillion To: headers).

8. Add the operator "escape" to string expansions: it escapes all non-printing
characters in its argument.

9. Make HEADER_MAXHEADERS into a config.h macro to match HEADER_MAXLENGTH so it
can be changed easily.

10. If Exim reads EOF on an incoming SMTP connection, it assumes a broken
connection, but neverthless writes an error response. This was erroneously
using a 554 error code instead of 421.

11. The private "getc()" code for TCP/IP inputs had the feof and ferror tests
the wrong way round (but it shouldn't have mattered much).

12. Blank lines were getting written to the log after some "no immediate
delivery" messages.

13. Increase the maximum length of RBL TXT record data that Exim reads from 127
to 511.

14. Include IP address in RBL rejection message.

15. To aid in debugging "unexpected disconnection" errors, if the result of
read() is negative, the errno message is now added to the logged error.


Version 2.952
-------------

1. White space was not being ignored after a search type ending in "*" or "@*"
in a lookup expression in an expansion.

2. If the smtp waiting database failed to open, the error message wasn't
printing out the interpretation of the value of errno.

3. The negative item "!@" was not being correctly handled in a host list.

4. Changed the expansion of $tod_full so that the day number is always given as
two digits (to match the times, and it helps for regression testing).


Version 2.951
-------------

1. Installed PCRE 2.05 (anchoring bug fix).

2. Retrying was not timing out properly when a message suffered a temporary
address error. This could result in retrying every queue run after the time
when it should have bounced.

3. Implemented once_repeat option for the autoreply transport, and a
corresponding "once_repeat" option for the mail and vacation commands in mail
filters. The vacation command now defaults once_repeat to 7 days.

4. Added $message_body_size.


Version 2.950
-------------

1. Big, INCOMPATIBLE re-arrangement of the handling of domain/host/net/address
lists by adding negation and reducing the number of options.

2. Remove a number of obsolete features; another INCOMPATIBLE change.
   (1) Obsolete options - see README.UPDATING.
   (2) No longer allow for pre-0.57 spool files without their names at the top.
   (3) No longer cater for spool files that don't have a -body_linecount
       setting. This came in at 1.91, but affects only SIZE for smtp output,
       so older spool files might still work.
   (4) No longer ignore commas and semicolons for driver options.

3. Installed PCRE 2.04 - bug fixes and tidies.

4. The API of DB 2 changed at release 2.5.x by adding an additional option
field to the function for starting a cursor. Fixed dbfn.h to cope with both
styles - luckily the version number is defined by macros.

5. The LDAP library in Solaris 7 has yet another way of handling errors from
the search functions - different from either UMich LDAP or the Netscape LDAP
SDK. (A pity, since everything else appears to be source-compatible.) It does
not seem to be possible to detect the differences automatically. There was a
previous fudge to distinguish UMich and Netscape, but I haven't found out how
to extend it. Anyway, it gets messier and messier. Instead, there is now a
configuration option LDAP_LIB_TYPE which the builder of Exim must set. (If not,
the current heuristic still applies.)

6. Some tidies in the smtp transport; some error status information might have
got lost when debugging was turned on (failing to preserve errno).

7. Host names used as part of keys in the retry database were not getting lower
cased; consequently if a host appeared in two differently-cased forms (e.g. in
MX records, or in a domainlist rule), separate retry records were being
created.

8. Improve wording of some expansion errors.

9. Exim now takes note of the list of alias host names when it uses
gethostbyaddr() to look up a host name. Host checks for relaying etc. now check
against the alias list as well as against the primary name.

10. In the smtp transport, Exim was relying on errno remaining zero after a
valid read() call, though one shouldn't really look at its value except in
cases of error. It was getting set on at least one OS.

11. Because "service" is not what people expect, add "port" as a synonym to all
the relevant options.

12. The -bh option wasn't giving any commentary on the testing of the sender
address (or any other address testing).

13. Lower case local parts as well as domains when doing tests of address
lists, but allow for exception with +caseful.

14. Make scripts/os-type recognize "sunos4*" instead of just "sunos4".

15. When reading from an incoming SMTP call, Exim was always flushing the
output after every command. This causes an unnecessary number of TCP/IP packets
to be used when the remote client is using pipelining. Instead of using the
standard C library functions (getc() etc.) in this case, Exim now reads
directly from the socket, and flushes the output only when it needs to refill
its input buffer.

16. Re-vamp of the handling of incoming batch SMTP, as suggested by Ian
Jackson: (i) sender_verify_batch defaults false. (ii) Always give up entirely
on encountering any error while receiving, writing to stdout/stderr and setting
a return code. (iii) EOF is now an error.

17. Make -R[f] and -qf skip frozen messages by default, and implement -Rff
etc to force thawing.

18. Log ETRN from hosts that are not in the permitted list.

19. The use of log_level to cut out "retry time not reached" from the message
log file now applies only to second and subsequent delivery attempts. This
means that during the first attempt, something gets written to the file for all
addresses, both toplevel ones and generated ones.

20. Added START_SMALL to monitor build-time configuration to start up with
small sized window.

21. Added $interface_address to hold the incoming interface address, and -oMi
to force it.

22. Cast uids and gids to long int when [s]printf-ing them.

23. Typo in source: if an alias file used :fail: for an address that was being
verified, a 450 rather than a 550 error was given.

24. Log (main and reject logs) when a VRFY or EXPN command is rejected on
policy grounds. Also log (on main log) when an accepted VRFY command fails to
verify the address - this is already done for failing verification of RCPT.

25. For RBL rejections, if prohibition_message is set, use it, with the RBL
text in $rbl_text. Otherwise show the text as before.

26. Implemented $message_body_end. In the process, fixed a possible bug
involved with $message_body - the data was being put into non-permanent store,
so if the variable was used more than once, there could have been problems.

27. If the pattern in a route_list item in the domainlist router is a lookup,
the data looked up is now available as $value in the hostlist item.

28. Added the "environment" option to the pipe transport.

29. If -odi is set (synchronous delivery), pass it on to any re-execs or other
calls of Exim (e.g. to send error messages). This helps with automatic testing.

30. The converter to Texinfo format was turning @sc{xxx} into actual capital
letters in section headings, but not in menu items that refer to them. The
latest version of Texinfo picks this up. Menu items are now also capitalized.

31. The change that forces euid=uid when Exim is called by root broke the
special processing when CONFIGURE_FILE_USE_EUID is set. This has been fixed.

32. If an LDAP lookup found an entry, but it had no attributes, it was
returning junk. Now it behaves as if the entry was not found.

33. During a -qq run, delay warnings were being sent after the first pass.

34. Access to headers in expansion strings is documented only via the syntax
$h_name: or $header_name: but *not* using {}. For example, ${h_to} is not
documented as legal; by accident it used to work, but ${h_to:} did not because
it was taken as an invalid abbreviation for ${hash_to:}. The "accident" has
been undone.

35. Patch to scripts/os-type to cater for Unixware 7 and 7.1.

36. Changed SCO_SV configuration (for SCO 5) using Tony Earnshaw's information.

37. Created a Unixware7 configuration using James FitzGibbon's information.


Version 2.12
------------

1. Adjusted scripts/os-type to cope with IRIX 6.5.2m which has to be
treated as a different OS.

2. Removed #define SYSCTL_IP_INTERFACES from OS/os.h-IRIX, because this feature
is only in IRIX versions greater than or equal to 6.2.

3. Removed the optimization for copying routing from one address to another
with the same domain. This should have been cut out as soon as the possibility
of using $local_part in router configurations was recognized. Also, using
"unseen" on a router causes problems as well.

4. The use of "unseen" on a router or director was not working properly if
there was a deferment of delivery. Whichever of the unseen/real deliveries
deferred did not get tried again because Exim thought it had delivered the
original address.

5. Error message when remote closed connection had spurious ": NULL" on the end
of it.

6. Eximon: if a message had no undelivered addresses, Eximon was omitting it
from its queue listing.

7. The name of a driver was not being macro-expanded.

8. Remove the old "expiring address" code from smartuser, as it hasn't been
compiled for a long time, and was throwing up comments in Y2K testing.

9. Added USE_DB=yes to the FreeBSD Makefile, since all versions come with
Berkeley DB.

10. Added /usr/include/mit in the XINCLUDE for Ultrix, since some versions need
it.

11. Modified the arch-type script to call uname -m if uname -p returns
"unknown", which apparently happens on some Linux systems.

12. If a forward file contained an unterminated quote or comment, it caused the
address not to be terminated at the end of the line, thus swallowing subsequent
lines.

13. Split the HP-UX configuration files into HP-UX-9 for release 9 and HP-UX
for the current release, which is more POSIX compliant. This has been tested on
release 11.00. Anybody using release 10 may have to fiddle with them.

14. Changed tests on __hpux in the libident library to tests on hpux. This
picks out the pre-POSIX releases of HP-UX where different argument types are
required for select(). In the current release, hpux is, quite correctly, not
defined (__hpux is defined).

15. Fiddled with the dummy functions in various places to stop the picky HP-UX
ANSI compiler from complaining that they were infinite loops.

16. Fixed problem which occurred when a source-routed address was routed to the
local host. It should get rewritten with the first host stripped off; this was
screwing up the original address, causing problems with (a) logging and (b) the
contents of the header file if the delivery was deferred.

17. Added qualify_single and search_parents options to domainlist router.

18. From: headers are not checked (to see if Sender: is needed) when the caller
is trusted - previously a trusted caller had to use the -f option to prevent
this check.


Version 2.11
------------

1. Adjustment of code for catching over-long multi-line SMTP responses to
do a better job in the case of packets not ending in \r\n.

2. Ignore any user-supplied whitespace (in particular, newlines) at the end of
smtp_banner; previously it was starting a continuation response, and then never
completing it, as there was nothing left.

3. Eximstats: computed incorrect total size of local deliveries.

4. If NO_SYSEXITS is set, don't make assumptions about the existence of exit
definitions in the strexits() function in os.c.

5. Tweak DGUX os.h file for strsignal and add HAVE_MMAP.

6. If a bounce message was constructed without any directing/routing having
occurred, Exim crashed. This could be provoked by -Mg, or if routing/directing
was deferred until the message retry time was exceeded. The bounce message
could be sent multiple times in the latter case, and did not contain a copy of
the original.

7. Don't insist on a transport for the domainlist router if verify_only is set.

8. The count of lines in messages read from stdin with the -i option (ended
only by EOF) was not getting set correctly.

9. When calling itself to send an error or a warning message, Exim wasn't
setting the -oi option, thus causing truncation of any enclosed text such as a
copy of the incoming message or the output of a pipe if it contained a line
with only a full stop in it.

10. Added dns_check_names_pattern to provide control over the syntax check.

11. If a DNS MX lookup fails the syntax check, don't go on to look for an A
record; and if called from lookuphost, don't go on to try widening the name.

12. Add the identity of the RBL domain to the log when in RBL warning mode,
and also to the messages output during -bh testing.

13. Do not stop scanning the list of RBL domains when one matches in warning
mode; ensure that X-RBL-Warning headers are added for all that match.

14. When testing with -bh, output a reminder after the final 250 after "." that
this is not for real.

15. Added max_username_length.

16. The log phrase "Error while handling error message" has been made more
accurate by changing it to "Error while reading a message with no usable sender
address", and a reference to the generating message added if there is one.

17. If -oee was set and the sender of a malformed incoming message was <>, so
that no error message could be sent, the return code was zero rather than 1
(i.e. it wasn't noticing it hadn't sent an error message).

18. If a non-SMTP message contains no recipients and error reporting is by mail
and no error message can be sent, the return code from Exim is now 2 instead of
1. This is so it can detect this case in the autoreply transport.

19. If the autoreply transport detects return code 2 for the message it has
submitted (no recipients) it no longer defers delivery. This means that
autoreplies to $sender_address when that is <> just get ignored (but there is
an entry on the log for the error).

20. Improved the error message that is given when an alias file or route list
file has the wrong mode, since this seems to confuse people.

21. Treat disconnection after end of data as a message error rather than a host
error.

22. Expanded the "file has wrong uid/gid" message to include the uids or gids
which don't match.

23. Installed PCRE 2.02 (minor tidies).

24. If a system filter discarded a message (by "seen finish" or similar) then
the log said "original recipients ignored", but had no => line. Now it contains
"=> discarded (message_filter)" instead, to be like the logging that happens
when a user filter discards a message.

25. Exinext was not displaying routing delays for specific addresses if the
domain successfully routed to a remote host. These can now exist in these
circumstances after temporary recipient-specific errors. Likewise it was not
capable of picking out message-specific retry data when given a message id.

26. Pipe delivery timeouts were not working if the writes to the pipe got
blocked (they only worked while waiting for the process to complete after doing
all the writing). Furthermore, after a timeout Exim just killed the process it
had created; if that process created further subprocesses they got left
running. It now makes the created process a process group leader, and kills the
whole process group, which will catch simple cases that don't themselves start
new process groups. Also, after detecting a timeout and killing the subprocess,
the third process that was reading from the output pipe didn't always die
immediately. The reading process is now forcibly killed along with the timed
out process group.

27. If a queryprogram process timed out, Exim wasn't killing it. It now kills
the whole process group, as for pipes (see 26 above).

28. If a pipe produced output, any error message was omitted from the bounce
message (this was to avoid "output message generated"), but this omitted
information about timeouts. The error information is now included except for
DEFER and OK returns.

29. Added "hosts_override" to the smtp transport.

30. Fixed two code infelicities in mailstore format delivery: (a) after opening
RDONLY, a stream of type "w+" was made (this fails on Linux), and the call to
fdopen() was not checked for errors; (b) the fd was closed directly, instead of
the stream.


Version 2.10
------------

1. The log message for a skipped syntax error in a filter file needed tidying.

2. After a "foranyaddress" condition succeeds in a filter file, the value of
$thisaddress is available in the commands. It holds whatever what the last
value tested.

3. Another adjustment to the FreeBSD makefile to make it work in ports and
non-ports environments.

4. scripts/Configure-Makefile was testing for PERL_COMMAND in the local
configuration without anchoring the check to the start of a line.

5. Give the error "no local part" instead of "missing colon in route" for
addresses like <@abcd>.

6. Nested ${lookup} and ${if} items in expanded strings were not working
correctly if "fail" was present in one of the internal items.

7. A macro expansion at the start of a continuation line of a string was
getting ignored.

8. Escapes such as \n are now handled conventionally in string expansions.

9. Added numeric comparisons to string expansions.

10. Changed the space checking to use the f_bavail field returned by the
stat(v)fs function instead of f_bfree, thus testing non-superuser space only.
Also, for those OS which have it, changed from f_ffree to f_favail for checking
the number of inodes.

11. Errors in expanding the name of a perl function or its arguments were not
being passed back correctly.

12. The count of lines in a message (which is used for computing the value for
the SIZE option on outgoing messages) was not being correctly set for incoming
non-local SMTP mail.

13. If no_smtp_check_spool_space is set, Exim refrains from checking that there
is enough space in the spool partition when it receives a SIZE setting on an
incoming message.

14. Added message_size_limit_count_recipients.

15. Implemented quota_warn_threshold in appendfile.

16. Running exim with -q but without -bd could cause it to crash.

17. In the delivery log line, don't print the original address in <> if the
only difference from the original address is in the case of the domain(s).

18. Removed the "debug" transport as I haven't used it for years and it is
simply clutter.

19. Write a log line when a message is abandoned because of a ridiculously long
header line.

20. If an error is detected while receiving a batch SMTP message (using -bS)
the error message that is sent now contains information about the sender and
recipients, and a copy of the headers, when such information has been read
before the error was detected.

21. If errors_to was set in forwardfile, and a headers_add option used
$local_part or any other address-specific expansion, the expansion went wrong.
(The verification of the errors_to address was clobbering the values.) This
could have applied to other directors and routers too.

22. The smtp_log_connections option should really be called
log_smtp_connections to fit in with other naming. Added the "correct" name as
a synonym, and hide the old one in displays.

23. If daemon_smtp_service was set to a named service on a machine with a byte
order different to network byte order, Exim listened on the wrong port. This
might have been introduced by change 12 of 2.03.

24. helo_verify wasn't working in the case where the helo argument was a valid
(but incorrect) host name.

25. Missing information in log for failures from multiple remote hosts.

26. If a malformed response to an SMTP command contained newlines, they were
written verbatim to the log. They are now converted to \n (and other
non-printing characters are also escaped).


Version 2.054
-------------

1. Insert missing fflush() if starting an SMTP session is rejected.

2. In the default configuration, changed the retry specification to

 *  *  F,2h,15m; G,16h,1h,1.5; F,4d,8h

The difference is that after trying every 15 minutes for 2 hours, it next tries
one hour later rather than two hours later.

3. Remove the definition of os_strsignal from the FreeBSD os.h, as it seems it
doesn't have it (ditto BSDI) and also from OpenBSD, just in case. My assumption
that it's on all BSD systems (based on NetBSD) is clearly false.

4. Updated exim_tidydb so that with the -f flag, it checks for the continued
presence of a message that has a message-specific retry record.

5. Fix exiqsumm so that it correctly recognizes domain literals in recipient
addresses.

6. The install script should now install the Texinfo documentation if
INFO_DIRECTORY is defined, and the source is available.

7. If a screwed-up host sent an SMTP response that contained LF characters,
they got left as LFs when included in the retry database. This could mess up
the format of the output from exim_dumpdb. They are now converted into \n.

8. Multiline responses from a remote host are better formatted when -d is set
for the smtp transport.

9. Fixed a very low-probability file descriptor leak in eximon; if a -J file
existed and reading the -H file failed, the -J file didn't get closed.

10. Added to the FreeBSD makefile, on Sheldon Hearn's recommendation:

.if ${PORTOBJFORMAT} == "elf"
XLFLAGS+=-Wl,-rpath,${X11BASE}/lib
.endif

It allows eximon to be built on FreeBSD ELF systems.

11. Fixed bug in libident/support.c causing crashes on malformed ident data.
Also fixed another typo bug in libident.

12. If headers_sender_verify was set and there was a syntax error in a header,
the error message just said "no valid sender". Now it gives details of the
syntax error.

13. If the expansion of headers_add for pipe and smtp transports failed, the
reason for the failure was not included in the error message (it was for
appendfile).

14. Added the "check_local_user" magic to {current,home}_directory in
forwardfile.

15. Changed the way the Makefile works when embedding Perl. The user need now
specify only EXIM_PERL=perl.o. The Makefile builder sets default values for the
other parameters at the top of the file, using the setting of PERL_COMMAND to
run Perl, when EXIM_PERL is set.

16. When an alias lookup defers because no addresses generated, include the
syntax error message in the message.

17. In the forwardfile director, the skip_syntax_errors option now applies to
filter files as well as to conventional .forward files. Added
syntax_errors_text option to forwardfile and aliasfile.

18. Fixed potential segfault crash in MBX delivery (while computing the
timestamp).

19. Added $parent_domain, $parent_local_part, $address_file, $address_pipe.

20. The router and director options "domains", "local_parts", "senders", and
their matching "except_" partners are now expanded.

21. The -bp option wasn't reading messages' -J files, and so wasn't marking
addresses "delivered" as early as it could.

22. Added the queue_only_file option.

23. The autoreply transport now has a reply_to option, and the "mail" command
in filters supports "from" and "reply-to" keywords.

24. Pedantic message correction: "all its recipients" => "all of its
recipients".

25. Added default definition of EX_CONFIG for systems that don't have it.

26. Set no_expn on the forwardfile director in the default configuration.

27. Skip logwrite in filter files when run as a result of EXPN.

28. Allow leading dots in local parts. Exim is already extended to allow null
components inside or at the end of local parts (e.g. a..b.@xyz) so it doesn't
seem worth making this extension specifically configurable.

29. Added rbl_log_rcpt_count and rbl_log_headers.

30. The setting of KEEPALIVE on an incoming socket was not being bypassed when
-bh was in use, leading to a warning message.

31. There was a long-standing problem with queue runners when a delivery that
was started by a queue runner passed on one or more TCP/IP connections to
another process. The problem was that the queue runner did not know this, and
went on to start more deliveries. If there were a large number of messages
queued for one host, this could cause too many delivery processes to be
running. The queue runner process is now told about additional descendent
processes, and it waits for them all to finish before moving on to the next
message.



Version 2.053
-------------

1. Reword message for not-found driver to emphasize which kind of driver.

2. Give pid and ppid in message about process creation failure.

3. If addresses on the command line for a -t message cause all included
addresses to get deleted, give a special "no recipients" error, mentioning the
cause. (Previously the message just never got delivered to anybody.)

4. If a user's filter file has "seen finish" with no significant deliveries,
write a log line of the form "=> discarded <address> D=director" to indicate
what has happened.

5. Added match_directory to forwardfile.

6. If match_directory was set on localuser, and it was an expanded string, and
the resulting pattern was a regular expression, and more than one address was
processed by this director such that the expansions gave differing patterns,
then things went wrong because the first pattern was used every time owing to
caching of the compiled regular expression.

7. When doing a 2-stage queue run (using the -qq option) a message about
queue_smtp was written to each individual message log (though suppressed on the
main log).

8. If the log level is set less than 5, messages about retry time not reached
are no longer written to individual message logs.

9. If the replacement string for a rewrite rule is "*" then addresses matching
the patterns and the flags are not rewritten, and no further rules are tried.

10. Added -bpr, -bpru, -bpra which are like the versions without the 'r', but
display the list in random order.

11. Added log_smtp_syntax_errors.

12. Added ${uc:} operator.

13. Added ignore_fromline_nets and ignore_fromline_local.

14. After SMTP transport errors such as "connection reset by peer" the text of
the error appeared twice in the log line.

15. Added :unknown: for use in alias files.

16. Give full search_type in debugging info for aliasfile.

17. Added generic transport option message_size_limit.

18. Added quota_filecount to appendfile, to apply when delivering into a
directory.

19. When delivering into a directory and quota was exceeded, the "time since
last read" field, which applies to individual mailboxes, was getting set to to
junk values, and could cause a retry record to time out prematurely.

20. Show sender address in debugging output.

21. Allow non-trusted users to use -f when running -bt or -bv.

22. If a transport returns PANIC, Exim used to panic log and die. Now it just
panic logs - so other addresses do get processed.

23. In aliasfile and forwardfile, the *_transport options can now be expanded
strings. If the result isn't a named transport, the address gets deferred, and
the message gets frozen.

24. Expanded transport names on directors and routers are now checked only if
the driver handles the address.

25. Bug introduced in new SMTP temporary problem handling meant that the
wait-smtp database wasn't always updated when it should have been.

26. Added support for MBX mailboxes (a) the format and (b) the locking.
Upgraded exim_lock.

27. Added body_only and headers_only generic transport options.


Version 2.052
-------------

1. Added return_path generic option to the transports. This can re-expand the
return path at transport time and do things like sticking in the recipient's
address (i.e. it makes VERP support possible).

2. If, during a remote parallel delivery in a subprocess, an SMTP error
response had a humongously long text associated with it, Exim crashed.

3. When there are no deferred addresses, convert any message-specific retry
record updates into deletes. This does some useful tidying in cases when one
host produces such an error and a subsequent one succeeds or fails hard.

4. If retry_include_ip_address was set false in an SMTP transport, then the
retrying was not searching for a rule keyed on the domain in addition to a rule
keyed on the host.

5. Added "rewrite" option to smartuser, cf aliasfile and forwardfile.

6. When verifying or testing an address, if both a director and router are set,
show both in the output, as is done on log lines for deliveries.

7. Implemented lookup_open_max for controlling the maximum number of cached
lookup opens for lookup types that use real files.


Version 2.051
-------------

1. Added bsdi4.0 as an os-type, equivalent to BSDI.

2. Removed definition of DN_EXPAND_ARG4_TYPE as u_char * for IRIX 6.5, as that
release of IRIX is now compatible with most other OS so the default is OK.

3. The exiwhat script no longer uses "cut" to fish the process numbers out of
"ps" output because it doesn't work on all systems. (IRIX 6.5 has longer pids.)
It now uses awk instead, to get the first field, whatever length it is.

4. Installed PCRE version 2.01 (Perl 5.005 compatible).

5. Revamped the way the working makefile in the build directory is created.
This also involved some modification to some of the files in the scripts
directory. At the top level one still runs "make" on its own, but this no
longer involves a nested call to "make" in order to create the lower-level
makefile (which is now called Makefile with a capital M). If run from within
the build directory, it is no longer capable of re-building itself. Further
revampings were done to ensure that the behaviour is the same on IRIX as on
other systems with regard to rebuilding. The "make" program on IRIX behaves
differently in regard to targets that are forced but don't actually rebuild the
file of that name.

6. The source has been tidied in places as a result of a -fullwarn run on the
IRIX 6.5 compiler. In Exim itself, one set of warnings, in store.c, remains; I
haven't been able to find a way to write the code so that it doesn't generate
them. In the Exim monitor, there are warnings for the modified StripChart and
TextPop modules taken from the Athena widgets.

7. LFLAGS has been set to -Wl,-LD_MSG:off=85 for IRIX 6.5. This suppresses the
warning about StripChart and TextPop overriding those in the Xaw library when
linking eximon.bin.

8. Unwanted \n at end of log message for too many message in one connection
removed.

9. Log entries for queued messages on a single SMTP connection other than the
first such message were incorrectly given as if the queueing was for too many
SMTP connections, instead of for too many messages or load average too high.

10. Changed the OS/Makefile-FreeBSD setting to X11=$(X11BASE) instead of
X11=/usr/X11.

11. Improved the output for host testing with the -bh option; more detail of
the order of testing accept/reject lists etc. is now given.

12. The pipe transport now gives the signal name in the log message when its
child is ended by signal. For Solaris 2, BSD-derived systems, and Linux, the
strsignal() function is called. For the rest, there is a built-in function that
covers the most important signals.

13. The pipe transport now attempts to give a possible explanation when its
child is ended by a non-zero exit code. As these aren't standardised, it has to
use the uncertain phrase "could mean".

14. Helo_accept_junk_hosts wasn't allowing the junk to start with [.

15. Remove trailing spaces from Local/Makefile when building Makefile, as
they can cause trouble in some of the sed commands for building scripts.

16. A new test for options settings threw up two obscure ones that were out of
alphabetical order in the source. Also some poorly worded configuration error
messages.

17. The domainlist router wasn't accepting the route_queries option if
route_list wasn't set, complaining "either route_list or route_file or
route_query required".

18. The queryprogram router had options called "user" and "group" which
conflicted with the generic options of the same name (which got invented
later, for 1.929). The options for queryprogram have been renamed
"command_user" and "command_group".

19. When the -t option was set, Exim was barfing at header lines like

  To: Recipient list not shown:;

and complaining about "empty address", even if there were valid addresses in
the Cc or Bcc headers.

20. The second part of change 10 for 2.05 was a disaster in the case of
temporary errors after MAIL FROM, DATA, and ".", because it meant that one
dodgy message could hold up other mail for the recipients involved. Backed it
out. However, the action after RCPT TO is OK, and remains.

21. If a listening daemon was run without a -q option to start queue-runners,
it could occasionally crash when a message-accepting process ended.

22. Added smtp_accept_max_per_host. Required smtp_accept_max to be set if this
or smtp_accept_queue is set.

23. Added keepalive options for incoming and outgoing SMTP.

24. Reworded the message that is output at the end of filter testing, as it was
confusing to users. (It wasn't clear that 'delivered is false' meant that the
message would be delivered normally.)

25. Bug in handling exceedingly long configuration lines fixed.

26. Added Malcolm Beattie's patch for calling Perl from string expansion.

27. A new approach to handling temporary errors in the smtp transport. Details
documented in NewStuff.

28. Bug in exiqsumm showed up under Perl 5.005; the sorting wasn't working
correctly.


Version 2.05
------------

1. Updated calls to pcre_exec() in preparation for PCRE 2.00 by increasing the
size of the working vector that is passed.

2. Unnecessary setting of sender_local = sender_host_unknown = FALSE in
daemon.c and elsewhere removed.

3. If routing deferred on a domain which subsequently got expanded when routing
succeeded (e.g. mail to xxx@yyy routed yyy to yyy.zzz.com) then the retry item
for routing the unexpanded domain never got deleted. Consequently, if routing
to it deferred again some time later, the message could get incorrectly timed
out, or at least use an incorrect retry timing.

4. The test_host testing program was crashing if given a non-existent host name
when testing "byname".

5. The option check_dns_names should really be called dns_check_names for
uniformity. Added a synonym, leaving the old name omitted from the -bP list.

6. If sender_verify_reject is false and verification suffers a temporary error,
accept as if sender_try_verify were set.

7. When sender_verify_fixup or headers_sender_verify was set and one of the
addresses in the headers was the return path address, Exim was verifying it a
second time, unnecessarily.

8. When -bh was used to test a remote host connection, sender verification was
not happening as it should.

9. Changes to sender verification on incoming messages when a temporary error
occurs: (i) Use the reject hints database as for permanent errors so as to give
4xx errors to MAIL FROM after the first, thereby not cluttering up the logs
with the headers each time. (ii) Keep a rate of temporary rejections (per
hour); if greater than sender_reject_max_retry_rate (default 12, 0 means unset)
turn into a permanent error. Reset after 24 hour gap between incidents.

10. Changes have been made to outgoing SMTP delivery when a temporary SMTP
error occurs. Previously no error recording happened, and the message would be
tried again at the next queue run. The error is now remembered for the
recipient address as a kind of routing or directing defer. The address won't
get tried again until the appropriate time has passed. This applies to 4xx
errors given to RCPT TO, and also to 4xx errors on MAIL FROM, DATA, and ".". In
all cases other than RCPT TO, the error is deemed to apply to all recipient
addresses, and so multiple retry records get created.

11. Made some changes to the IRIX6.5 and IRIX632 makefiles on the advice of
Arthur Hagen <art@broomstick.com>.

12. Fixed crashing when verifying that a name obtained by looking up an IP
address really is that IP address, if the name has no IP address. This
double-check was introduced by change 10 of 2.03.

13. For Berkeley DB 2.4.14 it is (now?) necessary to clear the datum field as
well as the key field before doing a lookup. Otherwise crashes may occur.

14. Add log entries at level 4 for incoming messages that don't get immediate
delivery because of too many connections or too much load or too many messages
per connection.

15. The one_time options of aliasfile and forwardfile were not working owing to
a silly typo (semicolon omitted).


Version 2.04
------------

Host checking in 2.03 was accidentally turned off when the incoming call came
via inetd.


Version 2.03
------------

1. Under some circumstances, in particular, the reception of several messages
in the same SMTP connection, the contents of mainlog_name could get corrupted,
leading to crashes.

2. System filter: ignore leading whitespace at the start of the argument for
"headers add". If the resulting string is empty, ignore it. If it does not end
with a newline, add one.

3. Added smtp_accept_queue_per_connection to limit the number of delivery
processes when a client is throwing lots at a server.

4. Removed the default CFLAGS=-O setting from Makefile-Default and added it to
those OS/Makefile-<ostype> files that didn't already have a CFLAGS setting,
with the exception of FreeBSD. This allows FreeBSD's "make" default to operate
as the default.

5. For inetd input, if several messages were received in one SMTP session and
certain host-specific checks were enabled (e.g. receiver_verify_except_hosts),
the store associated with those checks could get overwritten for the second
and subsequent messages, causing either crashes, or the checks not to work.
Also tidied up the handling of sender_host_name, which might have suffered a
similar fate.

6. For -bh testing, the store wasn't getting reset between messages as it is
for actual reception, making it less useful for testing.

7. As a result of discussion on the DRUMS group about VRFY, Exim now uses the
252 return code in the case when VRFY is disabled or when the given address is
not a local one. Also, the address itself is repeated in a positive response.

8. The addresses yielded in response to EXPN are now placed in angle brackets,
as this seems to be what the new standards want.

9. The daemon used to do DNS forward lookups of all host names in hostlists
such as sender_host_reject_recipients when it started up, and remember the IP
addresses. Discussion on the list concluded that this was a Bad Thing, and
that the caching in the resolver should be relied on instead, so these advance
lookups have been removed.

10. The looking up of hostnames from IP addresses has been made more secure by
the inclusion of a subsequent forward lookup, to verify that the name really
does correspond to the IP address. (Testing this revealed that on at least 2
operating systems, gethostbyaddr() already does this double-check, so maybe
this is overkill?)

11. Updated the Makefile for IRIX 6.5 on advice from Olav Kolbu
<olav.kolbu@usit.uio.no>, and also fixed os-type to recognize `irix6.5'.

12. If a numeric SMTP listening port was set by daemon_smtp_service, it got
converted to network byte order twice, thus scrambling it on hosts where the
network byte order is different to the natural byte order.

13. Include the malformed response in the error message "malformed SMTP
response..."

14. Updated configuration for HI-OSF and added HI-UX, including hacks to
libident (same as for HP-UX). Changed statvfs and f_frsize macros to STATVFS
and F_FRSIZE so they work on systems where the originals are themselves
macros. Inserted a number of missing (uid_t) and (gid_t) casts. Made
EXIM_CHMOD not null when not required. Revised rubric at the head of
src/EDITME to make it clearer (I hope).

15. Found a missing dependency on config.h in the Makefile; I had tried to be
clever and compile only those modules that needed it after a config.h change,
but it now affects the vast majority of them, so I moved it to the general
header list, which causes everything to rebuild.

16. Merged Stuart Lynne's patches for the LDAP lookup to enable it to link
with the Netscape LDAP SDK. However, I haven't been able to test this.

17. Arrange for there not to be SHELL=$(MAKE_SHELL) at the top of the default
makefile when it is building the real makefile (even though SHELL is not used
in that case) because AIX doesn't like this when MAKE_SHELL is not defined.

18. The cache of hosts found to be unusable during a delivery run was not
recording that a retry time had expired.

19. If an expired host was tried because its retry time had passed, but then
still failed, the fact that it was expired was not remembered for the benefit
of other addresses that routed to the same host. This could lead to some
addresses timing out while others hung on for one more delivery attempt.

20. If one of a set of MX records pointed to a non-existent host, a message
never timed out except by the maximum length on queue timeout. Now it will
time out according to the retry rules for the hosts that do exist.

21. If there were multiple recipients for the same remote domain, and all its
hosts had passed the maximum retry time, only one address was timed out per
delivery attempt. They are now all timed out together.

22. It is reported that, in Solaris 2.6, a stat() of an entry in an indirect
map which is currently unmounted does not cause the mount to occur, but
instead returns dummy data. This defeats the object of the stat() in
forwardfile which attempts to check the availability of the home directory
before looking for a .forward file. I have changed the code to first try a
stat() of "<directory>/." in order to force the mount (because it has to look
inside the directory). However, this might fail (after mounting) for
permission reasons, so to be on the safe side, if it fails, the original
stat() of the home directory is still done.

23. The logic surrounding the call to write() which is used to transport a
message has been improved. There are differences between operating systems in
the way write() is handled. On certain types of error (EDQUOT, EPIPE) some
systems give an error immediately; others return a positive code which is less
than the number of bytes that were specified for writing. If you try the
write() again, you then get the error. I knew about this for EDQUOT, and I
knew you didn't always get EPIPE but didn't realize you could force it by
writing again. Furthermore, in some OS at least (see Solaris 2.6 man page),
write() can be interruped by signals and behave in the same way, or return -1
with EINTR when no bytes have been written. Exim now handles all these cases
by attempting to continue with the write(), up to 100 times (just in case). If
it gets one of these states 100 times, it generates an error. The previous
logic, where an incomplete write for a pipe was simply ignored could lead to
occasional truncation of messages if a signal happened to interrupt a write to
a pipe.

24. While sorting out 23 above, the code for writing data additional to the
message itself in the pipe transport (prefix, suffix, SMTP stuff) has been
tidied up and improved.

25. In both the pipe and appendfile transports, the SMTP commands for batch
SMTP weren't strictly correct, in that there was a space before the < that
introduces an address. (This was fixed in smtp long ago, but I obviously
forgot about bsmtp at that time.)

26. One instance of an (int *) cast should have been (uit_t *). This was in
the function called by -bP to print option values, so wouldn't affect the
running of Exim, but could cause incorrect data to be output on systems where
uid_t is not int.

27. Eximstats: if the first log line was a => line, the $thissize variable was
unset. Arrange for it to be zero in this case.

28. Some duplication in logging has been removed; during SMTP delivery, a
failure related to a specific message was always logged per host, and then
with the ** or == line for the address. If there is only one host, or if the
failure is hard, this led to duplication of information on the log. The
per-host logging is now suppressed for hard errors or if there are no further
hosts to try.

29. When creating a bounce message, Exim was putting all failed addresses
into X-Failed-Recipients: willy-nilly. This could lead to an unacceptably long
header. It has been changed to start a new header every 50 recipients.

30. If an attempt to create a bounce message fails (a "should-never-happen"
event) Exim keeps the message on the spool to try again, but if the problem is
hard you don't really want to keep trying too often. If there are no genuine
deferred addresses in the message, it now gets frozen. Also, an entry is
written to the message log, which didn't happen before.

31. The "initgroups" option was not available on routers (accidentally left
off the generic options list).

32. Implemented smtp_log_connections, and tidied up various SMTP disconnection
messages.

33. Change 8 of 1.921 was botched, and done only for batch SMTP. Made the
change for interactive SMTP (error codes for too many recipients to be 552 and
452, in line with RFC example).

34. LFLAGS wasn't present on any of the makefile lines for building the test
programs such as test_host, etc.

35. The daemon now writes its pid file as root instead of exim, for the
benefit of systems where the pid file is in a directory that can be written to
only by root.

36. There was a spurious colon after 421 in the SMTP response when the fork()
of an accepting process failed. Also changed the text to "Fork failed" from
"Connection refused".

37. If :fail: or :defer: in an alias file has a non-empty message associated
with it, this is now used in the SMTP response when verification fails
during a RCPT TO or VRFY command.

38. If exim is called by root, set the effective uid and gid to the real ones
at the start. This makes a difference if, as happens in some unusual
configurations, Exim is setuid to something other than root.

39. The regex for matching message ids was assuming that the final two
characters could only be digits.

40. If -oMa was set for a -bs non-inetd connection, the host address was not
getting treated as it is for a real SMTP connection. In particular, it wasn't
getting into the Received: line.

41. If -oMt "" is given, the sender ident field is unset.

42. Implemented the C macro SYSCTL_IP_ADDRESS for use on IRIX systems to run
the special code that is needed on them for finding the complete list of IP
addresses on the local host, including the aliases. A comment that came with
the code is: "On 6.2 you need the libc patch to get the sysctl() stub and the
networking kernel patch to get the support."

43. Minor casting tweaks to cdb.c to get rid of warning messages from Sun's C
compiler.

44. When a message was frozen by the system filter, the time of freezing wasn't
being correctly recorded, leading to auto_thaw triggering too soon.

45. 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. So

  extern double strtod(const char *, char **);

has been put into OS/os.h-SunOS4.

46. Keep only a single space character at the start of a continuation line when
looking up lsearch data.

47. [This item added 12-Oct-98, retrospectively, as it got forgotten]. In
lsearched files, whitespace is now permitted before the colon that terminates
the key, for compatibility with Sendmail. This means that, if the data for a
key starts with a colon (e.g. :fail:) then the key must have its otherwise
optional terminating colon.



Version 2.02
------------

1. If helo_verify_except... was set, it didn't except the host from supplying a
HELO command, even though it didn't check it.

2. Setting helo_accept_junk didn't allow though no argument at all for HELO.

3. String expansions for the "mail" and "vacation" commands in filter files
were happening when the commands were read rather than when they were obeyed.
This meant that numerical variables set by "if" weren't available for the
expansions.

4. Setting smtp_banner to some string that did not actually include any
expansion items caused memory corruption and assorted chaos. Another bug
introduced by the store-handling reorganization of 1.921/18.

5. IRIX 6.5 is sufficiently different that it has proved simplest to treat it
as a different OS, with its own configuration files.

6. LFLAGS wasn't set on the linking command for eximon.bin.

7. If a file or user name in a require_files list is the empty string, ignore
it.

8. A missing double quote in a To: or Cc: or Bcc: line when -t was in force
caused Exim to write a bad address to the spool file instead of diagnosing an
error.

9. Tidied up the error reporting for headers_check_syntax; also skip the checks
for To: Cc: and Bcc: if -t is set, since that will detect malformations.

10. Add uid/gid to debugging initial message to be sure what's going on when
Exim reinvokes itself.

11. If message_id_header_text expands to an empty string, ignore it.

12. Fixed typo in error message "it appear that the DNS operator...".

13. As a result of some net.discussion, cease waiting for a response to the
QUIT command when sending out SMTP. This has the benefit of transferring the
TCP/IP TIME_WAIT state to the client.

14. The RFC specifies that, in the Received: header, the "id" item precedes
the "for" item. Exim was putting these the other way round, but eventually
somebody noticed. Pedant. :-) The default expansion string has now been
changed.

15. The message log was being closed too early, causing the writing of
"children all complete" to a closed stream in the case when a child failed,
(when the writing happens after sending a delivery error message). In some
circumstances (some OS, under gdb) this had no effect; in others it caused a
crash, thus failing to remove the message from the queue.


Version 2.01
------------

1. "make test_host" was failing to make the testing program.

2. Bug in filter processing could cause "mail" commands to try to mail to
invalid addresses. The message got deferred and often it worked OK the next
time.

3. With sender_verify set, senders received over SMTP were getting passed
through the rewriting rules twice. Luckily in many cases the second pass
wouldn't have matched anything.

4. Recognize BODY=7BIT as well as BODY=8BITMIME.

5. Include euid/egid in the error message when failing to open the log file,
for help when debugging.

7. Internal error -27 (failure to completely write a data block) was not giving
an explanatory message for appendfile or smtp transports.

8. Forbid the definition of a macro whose name contains the name of a
previously defined macro.

9. When a "To:" header was manufactured from the recipients list (for a non-
SMTP message) it was being rewritten, but since the recipients list had already
been rewritten, this caused double rewriting, which is not right.

10. If a user set up two separate autoreplies from the same filter file to the
same recipient or list of recipients, only one got delivered, because they fell
foul of the de-duplication code. Now any number are delivered.

11. Remove the paranoid check in appendfile for a / in a local part that is
used in the expansion of a file name. It is a weak check and causes problems if
the local part is used in an expansion but doesn't form part of the file name.

12. Failure to open a log tries to write to stderr if available; it isn't
available if this happens from the daemon, but the check wasn't correct. Also,
the existence of stderr wasn't being checked when Exim was re-exec'd from the
daemon; panic logging could get written to file descriptor 2, which just might
be open for something else.

13. Added patches supplied by Harald Meland for building on ULTRIX.

14. Allow spaces between the key name and the colon in lsearch data files, for
compatibility with Sendmail alias files. Exim_dbmbuild now also accepts files
in this form.


Version 2.00
------------

1. When routing, only domain and localpart were set as variables; things like
original_domain were not. This was an oversight. (Hindsight: this actually
changed the value of $domain in routers to the address domain instead of the
route_domain value it had previously. This matters only if an address has
passed through an instance of domainlist that passed on a different domain.
Thinking about it, I have decided to leave it alone - the routing domain can
be obtained in subsequent domainlist routers by $0, and it will be the address
domain that is set in any transports.)

2. Reset header list empty before leaving accept.c. Otherwise a second message
into the same process that logged sender rejection writes the previous headers
(possibly mangled) into the reject log.

3. Messages that had been on the queue more than 99 days messed up the layout
in eximon. Change to weeks after 99 days, and to years after 99 weeks (just in
case).

4. If a message was addressed to a (non-existent) domain ending in digits, the
digits got chopped off when the spool file was first read in, thereby mangling
the domain. (Bug introduced by changes 6 and 9 of 1.950.)

5. Added debug_print to all drivers to help with debugging.

6. When log_subject was set, an empty Subject: header wasn't always logged
correctly (junk characters).

7. Both appendfile and pipe forced return_path_add, envelope_to_add, and
delivery_date_add to be FALSE if bsmtp was set. Now that appendfile no longer
has these options TRUE by default, this seems an unnecessary restriction, and
has been removed.

8. If RBL warnings were on and a host that was in the RBL list subsequently
had recipients rejected for another reason, the RBL message was given rather
than the real rejection message.


Version 1.950
-------------

1. Tidied up the logging of multi-line SMTP responses so that the internal CR
characters are removed so they don't show as ^M in eximon windows.

2. Added queue_list_requires_admin, default TRUE.

3. Added temp_errors to the pipe transport.

4. Split build directory to be different for BSDI4 and BSDI3.

5. Tidies on the QNX front.

6. Added "one_time" to aliasfile and forwardfile.

7. Fix 1 of 1.928 locked out the use of quoted pairs in local parts (change 1
of 1.750). Put back the status quo ante.

8. The :defer: and :fail: feature of aliases got broken after release 1.92 by
the store pool changes. They were treated as errors in the alias file.

9. Some preliminary work for possible support of DSN, conditional upon the
definition of SUPPORT_DSN. This is not complete.

10. Added fallback_hosts as a generic router/director option, applicable when
the driver queues an address for a remote transport.

11. Made envelope_to_add, delivery_date_add, and return_path_add generic
transport options, defaulting FALSE. Changed default configuration file to turn
them on for instances of the appendfile transport.

12. Added check_secondary_mx to lookuphost.

13. Made quota work for directory deliveries in appendfile.

14. Added hosts_treat_as_local.


Version 1.929
-------------

1. Sending waiting messages down the same SMTP connection wasn't working if
split_spool_directory was set. How embarrassing!

2. If a message was sent down an existing SMTP connection to a multihomed host,
the IP address written to the log was a random choice from the host's IP
addresses rather than the actual one used.

3. Filter: if an expansion for the "headers" command is forced to fail, the
command is just ignored. Other failures cause Exim to panic.

4. Add explanatory message after "all MX records point to non-existent hosts"
when the host "name" is an IP address.

5. Added sender_{host,net}_reject_relay_except.

6. Moved the call for the -brw code later so that the originator_* variables
are set during the rewriting.

7. If a "From " line had the address "<>" then Exim tried to qualify it, which
isn't helpful.

8. Yet another store-handling bug: searches were returning a pointer to the
cached data instead of copying it, and the callers were expecting a private
copy that wouldn't get overwritten.

9. Bug introduced after 1.92: Exim was not resetting after rejecting an SMTP
sender, so a broken or malicious MTA that continued with RCPT could still get a
message through.

10. The "user", "group", and "initgroups" options are now generic, and
available on all directors and routers. They have an effect only when a driver
directs or routes an address to a transport.

11. Allow comma as a valid maildir tag character.

12. Support for QNX added.

13. Change 9 of 1.927 below wasn't correct: it was giving the "non-existent"
hosts message when it should have been giving the retry message. Hopefully it
is now correct in both cases.


Version 1.928
-------------

1. Abandoned the use of iscntrl() in favour of explicit character value
testing, since (a) all topbit characters are given as controls in Linux and (b)
locale-specific testing isn't really appropriate for international email.
Similarly for isgraph(). Macros are now used for both these functions.

2. Change the load average function for Linux from using /proc/loadavg to
getting the value from the sysinfo() call.

3. The test_dbfn compilation wasn't working.

4. Added support for cdb files, courtesy of Nigel Metheringham.

5. Added support for linking in the tcpwrappers library and calling it to do
host checks.

6. Added -Mvb, -Mvh, and -Mvl options.

7. If Exim PANIC bombed out while in the middle of reading an SMTP message, it
wasn't sucking the remainder of the message before giving an SMTP response.
This could lead to a zillion SMTP error responses. One cause of this could be
rewriting failures while syntax checking the headers.

8. Removed the restriction on the length of local part that Exim is prepared to
rewrite (was 255 characters).

9. Since 0.56, Exim has insisted there be a domain following the ':' in a
source-routed address. Removed some redundant code in rewrite.c and deliver.c
that handled cases where there wasn't a domain, since these cases now never
make it through the parser.

10. Mode values in the configuration file are now assumed to be octal.

11. Exiqsumm: message sizes listed by -bp without a K or M suffix were being
mangled by exiqsumm by losing the final digit.

12. Smartuser didn't used to create a parent address when a transport was
specified and a new address was given. It now does. This means that
$original_{domain,local_part} are now available at transport time.

13. Added maildir_tag to appendfile.

14. Added first_delivery and manually_thawed conditions to filters


Version 1.927
-------------

1. Implemented smtp_etrn_command.

2. The "mail" command in filters wasn't allowing continuations in strings set
up as headers. It now permits \n followed by whitespace in those options. This
is particularly relevant when the contents of existing headers are inserted.

3. All calls to signal(SIGALRM,handler) have been changed to calls to
os_non_restarting_signal(SIGALRM,handler) which attempts to ensure that the
handler is set up so as to interrupt system calls. Unfortunately, some OS are
different to others, and what happens in Linux depends on what library you are
using.

4. Instead of adding fallback_hosts to each individual host list at transport
time, failing addresses with fallback hosts get put on a separate queue which
is delivered after remote deliveries are complete. Thus if several domains have
the same fallback host (quite common), there is the chance of a single copy of
the message being sent.

5. If a fallback host is down for a while, messages waiting for it should now
be sent down a single SMTP connection when it comes up again and something is
delivered to it. Previously this would not have happened.

6. The temporary headers that get added for rewrites were added in the wrong
storage pool if they occurred during .forward file processing.

7. Already-delivered addresses on the spool were being read with a 256-byte
limit on their length. Extraordinary pipe commands longer than this have been
seen. The buffer into which they are read was in fact 1024 bytes long, so the
correct length is now used.

8. If the system filter directed an address to /dev/null, this got entered in
the log line as "/dev/null@domain".

9. If all hosts listed on an smtp transport have MX records pointing to
non-existent hosts, give an appropriate error message saying so. Previously the
default "retry time not reached" message happened, which was confusing.

10. The -bS option was accidentally generating the greeting header line (a bug
introduced after 1.92). Also, it was setting the protocol to local-smtp instead
of local-bsmtp.


Version 1.926
-------------

1. Yet another store-handling bug (filter). I sure did shake up the code a lot.


Version 1.925
-------------

1. Added settings to OS/os.h-AIX for determining the load average.

2. Added MAKE_SHELL to EDITME to allow for setting up a different shell for use
by the make process.

3. Add AR macro to the build-time configuration, defaulting to "ar cq", for
systems where the default doesn't work.

4. Exicyclog: (a) change the statements that try to find the user and group of
the existing mainlog so that they work in Bash as well as the Bourne and Korn
shells; also make them work when ls -l and ls -lg return the same output; (b)
some uses of mv should have been $mv.

5. When a router specifies headers_add or headers_remove, do not automatically
copy its hosts to other addresses at the same domain, but run the router for
them, because we want the headers options to get re-expanded for each address
within the routing environment.

6. Yet another bug in 921 store handling (local_interfaces).


Version 1.924
-------------

1. Close SMTP channel tidily after various failures at the start of processing
a continuing message.

2. Don't continue with a frozen message.

3. Give error message rather than crash if argv[0] == NULL.

4. Fixed bug in 921 store handling (sender_fullhost).


Version 1.922
-------------

1. "Failed to create spool file" wasn't giving the actual error.

2. Added $originator_{uid,gid}.

3. Don't change received_time for an incoming message if the clock has gone
backwards since the last message was received by this process.

4. close() rather than fclose() the smtp input streams when forking to do a
delivery for -bs and -bS input. Otherwise, if the stream is a file, the file
pointer can get disturbed.

5. Fixed bug in 921 in setting up host/helo/ip-address string.


Version 1.921
-------------

1. If expansion of a headers_add option results in an empty string, or a forced
expansion failure, nothing is added. Also, a forced expansion failure of
headers_remove on a director or router causes nothing to be removed. (Other
failures are treated as configuration errors.)

2. Added helo_accept_junk_{hosts,nets}.

3. Lines in the configuration file that are longer than 1024 characters are now
handled.

4. Added retry_include_ip_address option (default true) to smtp transport.

5. If serialization was specified for a remote host, the logic for sending
multiple messages down the same TCP/IP connection could be defeated by a race
condition. The serialization check is now skipped when delivering down an
existing connection.

6. Renamed the very old non_mx_domains options in smtp and lookuphost as
mx_domains_except, to fit with more recent naming schemes and indicate better
what they actually do. (The old names retained as hidden synonyms.)

7. Added extract_addresses_remove_arguments.

8. Changed the error codes for too many recipients to 552 and 452, which is
in line with the example in the RFC.

9. Return a 501 error if RSET, DATA, or QUIT are followed by argument data.

10. Domains in addresses that come in via SMTP commands (MAIL FROM, RCPT TO,
VRFY) are now checked according to the more restrictive RFC 821 syntax rather
than RFC 822 syntax. This syntax is that of a DNS domain.

11. Added check_dns_names to do syntax check before calling resolver, as some
give temporary errors on bad characters.

12. If called as "newaliases", set -bi option (sendmail compatibility).

13. Exim used to write each header line with a separate call to write(). Now
the entire message data gets buffered up, so for small messages only a single
write() happens. This might improved performance in that it might reduce the
number of TCP/IP packets. It might also help with writing to files. At the same
time, for SMTP output, the terminating "." line is included in the final buffer
instead of being written separately. Because of buffering at both ends of a
TCP/IP connection, there is really no gain in keeping it separate.

14. Header lines starting with "." (legal in RFC 822, believe it or not) were
not being correctly received over an SMTP connection.

15. If size_addition is set less than 0 in the smtp transport, the SIZE
parameter is never used. This provides a way of turning it off.

16. A partial search on a key string that contained a lot null components (e.g.
a.......b.c.d) could cause overwriting and various crashes. Every other null
component was missed, causing the count to get out of step.

17. Received_protocol was not being saved and restored from the spool.

18. Massive re-organization of dynamic store handling, hopefully to be more
efficient. Included removal of redundant code for header handling, and
improvements in string expansion store handling.

19. Change from a single lookup cache record to one per open file/database.

20. Buffer up the EHLO response into a single write.

21. Appendfile is now prepared to attempt to make any number of directory
levels.

22. For testing without root access, if a local delivery is unable to become
root in order to change uid/gid, carry on instead of crashing if the current
uid/gid are in fact the ones wanted.

23. Added the host_number option.

24. Added the format_mailstore option to appendfile.

[Entries for earlier versions of Exim have been archived]

****
