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


Version 1.92
------------

1. Installed PCRE 1.09 (bug fix).

2. Corrected the Linux fudge in scripts/Configure-os.h to do it for Linux-libc5
as well (oversight).


Version 1.91
------------

1. The extraneous export of EXIMON_EXIM_CONFIG in the eximon script seemed to
cause trouble with some versions of /bin/sh (NetBSD). It seems to have been
there by mistake, so I have removed it, and added a note to the comment about
redefining $config.

2. Recognize os types "aix*" and "AIX*" as AIX.

3. Define T_TXT in dns.c if not defined (SunOS4).

4. Added openbsd*) os=OpenBSD;; to the os-type script.

5. In some filter messages, replaced "log" by "logwrite" (oversight).

6. If an MX pointed to a non-existent host, that host was shown in the -bt
address list with an empty name and no IP address, which was a bit confusing.
Now it shows [unknown] as the address and adds "** unusable **" to the line.

7. If a domainlist router used the bydns option and that produced a list of
hosts, some of which had no IP addresses, those ones were themselves re-
looked up in the DNS as if they were in the router's list; this could cause
looping if any domain names were repeated.

8. Installed PCRE 1.08.

9. scripts/os-type now distinguishes Linux-libc5 as special, retaining the old
configuration files. The main Linux files now assume libc6 and default to using
DB. Also, changed the ps arg for exiwhat to ax instead of -ax for the libc6
(now the default) version.

10. The size of an incoming message, as listed in the S= field in the log line,
was too big - it was including the entire size of the -H file, not just the
contents of the header lines, plus the file name that is put at the start of
the -D file.

11. Count the lines in the body as it is read, and preserve on the spool as
body_linecount; construct a complete message_linecount when reading in the -H
file.

12. The smtp transport now uses message_linecount to give a better estimate of
the size. It adds a fudge factor of 1024, which can be adjusted by a private
option called size_addition.

13. There are occasional esoteric circumstances when Exim tries to write to the
main log when the uid isn't root or exim (e.g. a non-setuid binary with
log_arguments set). Previously it bombed out. Now, if opening the log fails and
the uid is not root or exim, it directs the logging to stderr.

14. Check result of send() when writing SMTP commands, and give correct error
on failure.

15. If a continued delivery down an existing SMTP connection deferred, Exim
went on to try other hosts in an incorrect way, instead of deferring delivery.
This bug was introduced by change 64 of 1.890. Sigh. You mend some, you break
some...

16. The return of fclose() when writing the -H file wasn't being checked -
though it shouldn't fail since prior calls to fflush() and fsync() are checked.
But you never know.

17. Include expansion error text in message generated when added headers fail
to expand.

18. Reply 250 to RSET even when trying to flush a connection after an
unexpected failure.

19. Reply "421 Unexpected failure" to all (non-RSET) commands instead of "503
command out of sequence" when panic-closing with an SMTP channel open.


Version 1.90
------------

1. Automatically add \n to headers added by the generic router/director
headers_add option if the string doesn't end with \n.

2. -bF wasn't setting the flag to allow $recipients in expansions.

3. Always interpret mode values in filters for "save" and "logfile" as octal
numbers.

4. Predicate the "personal" test in a filter on the "system_filtering" flag
rather than on the non-existence of the "special_actions" flag, to allow it in
system-wide, address-specific filters with special_actions set.

5. Change ${local_part: and ${domain: to yield an empty string rather than an
expansion failure if the argument doesn't parse.

6. Make HELO syntax errors go to main log as well as reject log.

7. Reduce rfc1413_query_timeout to 30s.


Version 1.891
-------------

1. SunOS4 has no strtoul(). Add a macro to use strtol() instead.

2. Two options (log_defer_output and log_fail_output) out of alphabetical
order in pipe transport.

3. Ensure Exim links when no LOOKUP_ options at all are set.

4. Re-word timeout and other connection failure log reports for incoming SMTP
to use the phrase "from xxxx" to make it clear they refer to incoming
connections.

5. Forwardfile: rename forbid_filter_log as forbid_filter_logwrite, but keep
the old one as a synonym.

6. When searching for a valid sender address in the headers of a message (e.g.
to implement verify_sender_fixup), check all occurrences of a given header, not
just the last. This applies especially to resent-headers. Also, if a
resent-header is used, log the full name, including the "resent-".

7. Permit the variable $recipients to appear in a pipe command that is set up
in a system filter.

8. When $1 etc were used in a pipe command in a filter, their values weren't
passed over, because the expansion happened at transport time. The values are
now saved with the address and so preserved.

9. In a system with security=seteuid, SIGCHLD was being ignored during
non-synchronous delivery of messages received from the command line or -bs,
leading to errors about missing processes. Change 11 below provoked this.

10. Added ${local_part: and ${domain: operators.

11. -bF tests system filters.

12. Fix 64 below broke the code for adding "*" to the IP address after a
continued delivery.

13. When passing on an SMTP connection from a queue-runner delivery, wait a
little bit before proceeding if there are yet more messages waiting
for the same host, to allow the new process to get on with it before the queue
runner resumes.

14. If the exec caused by SIGHUP failed, the resulting log write was missing an
argument.

15. At least one MTA has been seen that fails to recognize EHLO even though it
sends out "ESMTP" in its banner line. Arrange to fall back to sending HELO if
the response to EHLO is a failure code.

16. When reading a message for filter testing, if the headers were terminated
by '.', another '.' was needed to terminate the body.

17. The "handling incoming connection" exiwhat message now contains the host
name (where known) as well as the IP address.

18. Arrange to chdir("/") before running the command in the queryprogram
router.

19. Add user, group, and current_directory options to queryprogram.

20. Add EXIWHAT_PS_CMD to build-time configuration.

21. The expansion ${reply-to} caused a crash on Linux if there was a From: or
Reply-to: header with no content. For some reason it didn't crash on Solaris 2.

22. A queryprogram router would not run as an incoming message verification,
because SIGCHLD was set to SIG_IGN when running the subprocess, causing loss of
the child.


Version 1.890
-------------

1. Added the -bh host testing facility.

2. Added the use_crlf option to appendfile and pipe.

3. Added freeze_exec_fail to pipe.

4. If an existing SMTP connection was passed to a new Exim to deliver a
waiting message, and the host list was supplied in the transport, but for some
reason no host matched the connected host, Exim behaved as if all retry times
for all the hosts had expired, and incorrectly bounced the address.

5. Exim was testing the host name for continued delivery over an SMTP channel
before looking up the IP address, in the case where the host was supplied on
the transport. If the lookup changed the name (e.g. by qualification) the match
was failing when it should have succeeded.

6. Exim was refraining from delivering when queue_smtp was set before looking
up the IP address of a host named on the transport. If the lookup would have
changed the address (e.g. by qualification) then the wrong host name ended up
in the waiting database.

7. Add log_defer_output option to pipe.

8. Added allow_commands option to pipe.

9. Added different IP options code for Linux's glibc 2.0.6, conditionally
compiled.

10. If there is only a single recipient address in a message, then when the
Received: header line is being built, the expansion variable $received_for is
set to contain that address. Otherwise that variable is always empty. The
default setting of received_header_text has been changed to include the use of
this new variable when set.

11. Set SIGCHLD to SIG_IGN in the inetd case for delivery processes that are
not synchronous, to avoid defunct processes waiting until the original process
ends. (cf change 48 of 1.60!)

12. Added the "add" command and variables n0 - n9 to filters, with sn0 - sn9
referring to values from the system filter.

13. Improved error message for malformed addresses like <a@b@c>.

14. Add qualify_preserve_domain to aliasfile and forwardfile.

15. Changed the handling of \name in forward and alias files so that it always
preserves the incoming domain name.

16. A check_ancestor option added to aliasfile.

17. Renamed add_headers and remove_headers as headers_add and headers_remove
(keeping the old names as synonyms) to be similar to the new filter options.

18. Added the "headers" command to filters, for the system filter only.

19. The option allow_systems_actions on forwardfile permits the "freeze" and
"fail" filtering commands.

20. The freeze and fail filter commands can now be followed by "text" and a
text string, giving an error message.

21. Exicyclog now uses 01, 02, ... instead of 1, 2, ...

22. EHLO response wasn't strictly in accord with the RFC (for some reason lost
in the mists of time). Also removed colon after the domain name.

23. Allow -oMr to override the protocol name "bsmtp" for -bS input.

24. Protocol was given as "smtp" for local smtp, instead of "local-smtp".

25. Installed PCRE 1.07 (bug fixed).

26. After EHLO, SIZE would be recognized only on the first message.

27. If an excessive SIZE was given, Exim gave an error message, but carried on
and also gave an OK message.

28. Arranged for the amount of disc space available to be checked whenever SIZE
is received on a MAIL FROM command, independently of whether message_size_limit
or check_spool_space is configured. A temporary error is given if there isn't
enough.

29. Add PIPELINING to the supported facilities list on receiving EHLO, since
Exim works fine with pipelined input.

30. Added the foranyaddress condition.

31. Eximon: Force size stripchart always to be x10; add "%" after it. Make size
and queue stripchart names configurable.

32. Filter testing: output the values of individual sub-conditions.

33. Filters: added IS, CONTAINS, MATCHES for caseful comparisons.

34. Filters: added begins, BEGINS, ends, ENDS.

35. Added message_filter_xxx_transport options to set transports for pipes,
files, and auto-replies from the system filter.

36. After failure to open a file, if the error is "Permission denied", add the
current euid and egid to the error message.

37. Added helo_verify_except_{hosts,nets}.

38. Added queue_smtp_except.

39. Added local shadow transports - somewhat experimental.

40. Replaced the ancient DGUX configuration files with Ken Bailey's new ones.

41. Added dns_again_means_nonexist.

42. Added log_all_parents.

43. Added sender_{host,net}_reject_except.

44. Added -qq feature.

45. Added print_topbitchars

46. Added ${hash_n_m:<string>} to expansions.

47. Added "*@" option to single-key search types.

48. Added headers_add and headers_remove to directors and routers.

49. Added -nolc option to dbmbuild.

50. Send EHLO instead of HELO if "ESMTP" is contained in the greeting.

51. If SIZE is listed as an available facility in the response to EHLO,
add a SIZE= option to the MAIL FROM command, estimating the message's size.

52. A setting of message_filter_user was ignored when doing a local delivery to
a pipe, file, or autoreply.

53. There was some very old code that attempted to permit the first option
after a driver name to be on the same line. However, this facility has never
been documented, and the code wasn't working - leading to unhelpful error
messages if a colon was accidentially place after an option name. Removed the
non-working code.

54. The "log" command in a filter file was being obeyed when testing an address
with -bt (and -bv if configured run the filter while verifying).

55. It seems that CC:Mail is braindead, and assumes that the SMTP greeting
message is all contained in a single IP packet. The original code wrote out the
greeting using several calls to fprint/fputc, and on busy servers this could
cause it to be split over more than one packet - which caused CC:Mail to fall
over when it got the second part of the greeting after sending its first
command. Sigh. To try to avoid this, build the complete greeting message first,
and output it in one fell swoop. This gives a better chance of it ending up as
a single packet.

56. Added errmsg_text, $errmsg_recipient, $return_size_limit, errmsg_file,
$warnmsg_delay, $warnmsg_recipients, warnmsg_file. Added warning time to
default subject.

57. Weekday absent in some forms of From_ line. Make optional in the regex.

58. Add X-Failed-Recipients header to delivery failure messages.

59. If relay_match_host_or_sender is set, check that sender_address_relay is
set, because it doesn't make sense otherwise.

60. Added helo_strict_syntax for those who care.

61. Log ** message for timeouts was giving only the end address, not the parent
as for other failure messages.

62. Arrange to bypass delivery of /dev/null at top level.

63. When starting a new Exim to deliver down the same TCP/IP connection, the
socket was being passed on both stdin and stdout, which is unnecessary. Now it
is passed only on stdin.

64. When Exim was processing a message with a passed TCP/IP connection, and
there were two addresses that had the passed host in common, and remote_max_
parallel was set, it started two processes writing down the same connection,
causing protocol errors. Now remote_max_parallel is forced to 1, and it is
cleverer about noticing that there is more than one (set of) address(es) that
can go down the same channel.

65. Filter: the "log" command renamed as "logwrite", to avoid confusion with
the "log" option of "mail". However, keep the old name as a synonym.

66. In an attempt to improve error messages, changed

  550 Unknown local part in <xxxx@a.b.c.d>

to read

  550 Unknown local part xxxx in <xxxx@a.b.c.d>

since naive users probably don't know what "local part" means.

67. Changed retry behaviour for local addresses and local deliveries. When not
part of a queue run, directors are always be run, and local deliveries
attempted. This makes for better behaviour when one message is causing
difficulties.

68. Sendmail compatibility: do not require space after -qR in command line.
This conflicts with the -[q]Rf option. Insist on space after -[q]Rf for it to
be recognized.

69. Add the -R text to the end-of-queue log line to make it easier to match up
with the start.

70. Eximon: if shift-click occurred on a non-queue bit of window (causing "No
message selected" to be displayed) after a menu had previously been displayed
for a message, Eximon looped.

71. Build scripts altered so that on Solaris systems the name of the build
directory includes the version number.

72. A connection that issued ETRN didn't close down properly until the spawned
queue-runner process completed (forgot to close the file descriptors).

73. Added smtp_etrn_serialize, default TRUE.

74. It appears that stat() can get stuck if an NFS host is taken off line, thus
delaying the delivery of a message if one of the recipients' .forward files
suffers this. A timeout of 30 seconds has been placed round the home directory
stat() that happens for .forward files.


Version 1.854
-------------

1. Bugs in eximstats fixed: (a) gave undefined variable warnings if any
:blackhole: deliveries in the log; (b) gave substr warning on log lines shorter
than 39 chars (could happen if logging arguments).

2. Further to 1.853/10: The form of the log line when a local delivery was
caused by a router showed only the local part, as for a directed local
delivery. Changed the log line to look the same as for remote deliveries; made
one consequential change to eximstats.

3. Exim used to count Received headers and check for looping only for remote
deliveries. However, since many sites are using local deliveries to pass
messages on to other transport mechanisms, it has been changed to do this for
all deliveries.

4. The errors_to option is now a generic option for all directors and routers.

5. For sendmail compatibility, if an incoming, non-smtp message has a From:
header containing just the unqualified login id of the calling user, stick it
in angle brackets, with the gecos field in front.

6. If helo_verify was set, a second message in the same SMTP transaction was
causing a "HELO required" error.

7. The sender_rcvhost variable (1.853/9) was not getting set for inetd calls,
or for daemon calls without HELO/EHLO.

8. Store bug in the lsearch lookup code could cause random chaos later, if any
looked up line was longer than 100 characters.


Version 1.853
-------------

1. If any macros were defined on the command line with -D, Exim was giving up
privilege, even if called by root or exim.

2. A buglet fix in a debugging statement in the LDAP code.

3. Limited the number of -D macro settings to 10; arranged that they get passed
on if a re-exec of Exim takes place.

4. The "percent-hack" facility now takes note of the relay control information,
and forbids unwanted relaying via the % mechanism.

5. Spaces before settings in Local/Makefile weren't being ignored.

6. If a prefix or suffix is active, the "personal" test in filter files now
checks for a prefixed and/or suffixed local part, as well as for the unadorned
local part, in tests of the "From" and "To" headers.

7. Some OS have chown in /usr/etc/chown. Fudge the install script so that, if
the setting is for "chown" and there is no /usr/bin/chown but there is a
/usr/etc/chown, use that.

8. Move PCRE_CASELESS from exec-time to compile-time in filter "matches"
condition (seems to have been an oversight).

9. To sort out the non-conformity of Received: lines, a new variable called
sender_rcvhost has been invented. (Details in NewStuff.)

10. If a router sent a message to a local transport, the log did not contain
the relevant R=xxxx item; instead it just said "D=". Now it names the router,
and also, if a host name was supplied by the router, there is also an H= item.

11. When handling a source-routed address, Exim retains a colon or comma at the
start of the local part as a flag indicating that the address is source routed.
For an address @a,@b:c@d we will have domain=a, local_part=,@b:c@d for example.
If a transport is actually making use of the local part (typically a local
transport for a remote address) the leading character isn't wanted, so remove
it.

12. Spaces round the separators in lists of users or groups were not being
ignored.

13. When called as "rmail" Exim now sets -oee as well as -oi. This is
compatible with Smail.

14. When an error is detected early on in a -bm message (e.g. malformed
address on the command line), Exim now goes on to check for a possible "From "
first line in the message, in order to obtain a better sender to whom to send
the error message, provided the caller of Exim is trusted.

15. Fixed buglet in eximon which screwed up hostname on OS where the second
argument to basename is treated as a pattern (Solaris 2).

16. If there is a failure to write a delivery error message, Exim leaves the
message on the queue to try again. It wasn't ever giving up, even after the
longest retry time had expired. Now it does so.

17. HELO/EHLO commands with -bs or -bS input now set sender_helo_name, if
the argument is valid, and this is included in the Received header.

18. Setting helo_verify could cause a non-inetd call with -bs to crash.

19. Additional arguments to HELO/EHLO got accidentally included in
sender_helo_name.

20. If an incoming sender address was verified by a smartuser director which
had both a transport and a new address specified, the sender address got
incorrectly changed to that new address.

21. If an incoming sender address contained a quoted local part, and the domain
was local, and sender verification was enabled, then the quotes got lost in
the saved copy of the sender address. This caused syntax errors if the message
was subsequently transported by SMTP, or if an error message had to be returned
to the sender.

22. Bug in eximstats in computing number of seconds since 1970.

23. Permit underscore in HELO host names, because it seems to be in common use.
Sigh.

24. Reword "unknown mail domain" as "unrouteable mail domain xxx".

25. Domainlist router: added host_find_failed option.

26. New option -bvs to verify a sender.

27. System filter "freeze" and "fail" commands weren't being shown properly in
-d10 output.

28. Installed PCRE 1.06.

29. The new rewrite flag S specifies a rewrite at SMTP time, using a regex. The
new flag Q causes unqualified addresses to get qualified. The flag R causes the
current rule to repeat. The flag X causes extra rewriting when checking sender
addresses for relaying. Added log_rewrite to cause all rewriting to get logged.

30. The match_sender() function couldn't cope with empty senders in its list
(to permit error messages to do things). It always failed to match if the
sender was empty.

31. Don't insist on a transport for directors or routers that have verify_only
set.

32. Tidy of code for address verification.

33. When smartuser with new_address was triggered during sender verification it
caused the sender to get incorrectly rewritten.

34. Top-level verification was stopping after smartuser with a new address. It
now continues with the generated address.

35. Don't try to log arguments when testing or verifying addresses.

36. Added alternative field extractor by separator character.

37. Added :defer: and :fail: for alias files.


Version 1.852
-------------

1. Tidies made and buglets fixed in the LDAP lookup code.

2. Bug in search.c: did not forget cached value on DEFER.


Version 1.851
-------------

1. If an :include:d file in an alias file contained :blackhole: Exim crashed.

2. Exiqsumm was giving the wrong values for mail volume.

3. Give more details for the "attempt to rewrite a local part that is longer
than 255 characters" error.

4. Include host identification in log of syntactic HELO rejection.

5. Domain-list and host-list options were being automatically lower cased; this
caused problems when lookups were included that involved uppercase letters in
the file names or queries. Now only the non-query items in these options are
lowercased when they are read.

6. Sender_address_relay was being lowercased on input.

7. Installed Stuart Lynne's LDAP lookup driver.


Version 1.850
-------------

1. Installed PCRE version 1.05, which has more bugs fixed.

2. Large code re-vamp to separate out individual file/database lookup code into
separate modules, in a subdirectory called lookups.

3. Separated the DNS-driving functions from the host lookup functions, and put
them in their own module.

4. Added the "dnsdb" lookup type for looking up TXT records.

5. Added the "testdb" lookup type to make it easy to test things that call
lookups.

6. Reduced the number of bomb-outs for badly specified uid/gid and used defers
instead.

7. Support for DEFER from file/database lookups where it makes sense (mainly in
routers/directors/transports).

8. Upgraded the NIS and NIS+ drivers to return DEFER when appropriate.

9. Added "queries" options to aliasfile and domainlist, to provide a
colon-separated list of queries.


Version 1.82
------------

1. If a delivery was marked "unseen" either by a filter file or by an option on
the director, and the local part had a prefix or a suffix, then the address was
not subsequently delivered again.

2. Installed PCRE version 1.03, which fixes some bugs (see its own ChangeLog).

3. The "quote" expansion operator quoted full stops (periods) which doesn't
seem right. It no longer does.


Version 1.81
------------

1. The os-type script now recognizes "linux-*" and "Linux-*".

2. "--" is now recognized as a terminator of the options.

3. If no_rbl_reject_recipients was set and two or more messages came in on the
same SMTP call from a blacklisted host, all but the first got their headers
corrupted.


Version 1.80
------------

1. Setting delay_warning = 0h caused a crash when trying to send a warning.

2. Changed the default of search_parents to FALSE.

3. The autoreply transport was adding an extra \n on the end of the
"in-reply-to" header that it adds, thus making it impossible to add any more
headers.

4. Put the sender address logged by log_received_sender in <>.

5. When listing recipients at the start of a reject log entry, say "recipients"
instead of "to" so that it doesn't look like a header line.

6. Corrected two minor inaccuracies in $message_size: it was counting the file
name at the start of the data file, and it was also including the length of
headers that weren't going to be output (e.g. old versions of re-written
headers).

7. Autoreply: change text to say "the message" rather than "your message".

8. Minor revision of code in write_block() in transport.c to cover very small
chance of a timeout not being seen (if timeout happened *and* return from the
write was equal to the size being written). This was seen to happen fairly
regularly in Linux, so it obviously isn't as rare as I thought.

9. When opening a lockfile for a database, if opening for writing fails with
EACCESS and the database itself is to be opened with O_RDONLY, try to open the
lockfile for reading. This makes the utilities like exim_dumpdb work when read
access is granted to them and the lockfile by virtue of a group permission.

10. IRIX makefiles: changed -Olimit 1500 to -OPT:Olimit=1500.

11. The message on failure to open the panic log now includes the original
error correctly.

12. Log when a recipient is accepted by virtue of being in the exception list.

13. The "condition" check was not logically happening before the "no_more"
check, making it different to "domains" and "local_parts". It now works like
they do.

14. Added an extra 12 hours to the "message retry time exceeded" test, to make
it more likely that a message will fail after a real delivery attempt rather
than after "retry time not reached for any host", which isn't very informative.

15. If -f was used with an unqualified address with -bv or -bt and the
configuration had drivers with the "senders" option set, Exim crashed.


Version 1.750
-------------

1. Relaxed the parsing of local parts to be in line with RFC 821, which permits
quoted pairs to appear without the need for double quotes. For example,

  mail from:<abc\,def@xyz>

is legal in RFC 821.

2. When actually doing a local delivery, remove quoting from a local part. Thus
the addresses <"tweedledum"@looking.glass> and <tweedledum@looking.glass> are
considered to be identical on the host for which looking.glass is a local
domain.

3. Added rbl_warn_header; if true (the default) and rbl_reject_recipients is
false, then an X-RBL-Warning: header is added to the message, containing the
warning text from the RBL lookup.

4. Added log_received_sender which adds a "from" item onto the end of the "<="
log line containing the unrewritten sender (c.f. log_received_recipients).

5. Relaxed the syntax for driver configurations. No line terminators are now
required (command and semicolon permitted for compatibility), and the options
can be mixed, provided that "driver" preceded any private options.

6. Added the address at fault to the error message given when headers_check_
syntax fails, and reworded messages given when headers_sender_verify fails, to
try to make it clear that the given retury-path is *not* the thing that has
failed.

7. When receiving a message, Exim writes the log entry before releasing the
lock on the message, so that the reception message must precede any delivery
message, and it waits until after this to acknowledge the final '.' of an
incoming SMTP message. This meant that, should the write to the log fail for
any reason - causing Exim to crash - there would be a valid messae on the
queue, but the far end would think it needed to send it again. Now it knows to
remove the incoming message if it cannot write to its log.

8. Created uucp_from_pattern and uucp_from_sender to make the recognition and
use of "From " lines more flexible.

9. If the -N flag is used for testing, the retry database is not updated.

10. The maximum length of driver instance names was inadvertently set to 24
instead of 64, which is the maximum length of options names. Made them the
same.

11. The ! (negation) operator in string expansions wasn't working if used
before "match".

12. Added daemon_smtp_service.

13. Log rejection of unqualified senders/recipients.

14. Sender_verify_except_{hosts,nets} now also suppresses the
headers_sender_verify check from matching hosts.

15. If sender_verify_fixup is set, but sender_verify_reject is not set, Exim
now logs what the fixup would have done.

16. If an smtp transport that specified the hosts itself was called more than
once in a single message delivery, the second and subsequent sets of addresses
were incorrectly failed because it failed to reuse the previously set up host
list correctly.

17. The batching of addresses for SMTP transmission was checking the address of
the errors-to fields for equality, but not the text of the errors addresses
themselves. Consequently, it wasn't always batching when it could have.

18. Exim was forgetting to close the system filter file once it had read it.

19. -qR made synonymous with -R and -qRf with -Rf.


Version 1.737
-------------

1. In converting the regular expression to match "From_" lines to use the new
regex library, I goofed. It was matching, but picking out the wrong sender.

2. Apparently some UUCPs use a "From_" line in different formats such as

  From xxxx Fri, 7 Jun 97 17:47:00 GMT
  From xxxx Mon, 11 Aug 1997 12:1:03

instead of the form

  From xxxx Fri Jun 7 17:47:00

which is the format seen in RFC 976 and in mailbox separators. The regex in
Exim has been extended to recognize the alternative format, permitting the year
to be 2 or 4 digits, and also allowing for only one digit in time fields.

3. Don't attempt to log arguments as a result of log_arguments if privilege has
been given up, or if -bP was used (it is called as root this way from exicyclog
and other utilities).

4. If there is output from a pipe to send back in an error message, omit the
error message generated by Exim.

5. Syntax errors in bsmtp input could cause rather a lot of messages to the
postmaster. Made it give up a bit more tidily.

6. The log messages for unfreezing by auto-thaw were not at log level 0, which
is needed for eximon to see them.

7. Extended delay_warning to take a list of times.

8. Change 34 for 1.735 had the effect of no longer ignoring "broken pipe"
(EPIPE) errors (i.e. the data wasn't completely read). Made it ignore them
again. Also, it appears that on some systems, EPIPE is not given; instead a
write() to the pipe just fails to write all the data it is given. Arrange a new
error code for this, and ignore it as well.

9. The automatic thaw caused by -M was not writing "unfrozen" to the log;
consequently, eximon wasn't noticing that a message was unfrozen by this means.

10. Added delay_warning_condition.

11. If -C specifies the screwed-in configuration file name, ignore the option,
thus causing Exim not to give up root privilege.

12. Eximon: If an alternate configuration file is passed by setting EXIMON_
EXIM_CONFIG, it is now also passed to exim when taking menu actions, as well as
being used to find where the spool directory and log files are.

13. If a message action resulted in failure to open a spool file, other than
for its non-existence, Exim always said "message is locked", when in fact it
could be a different error (e.g. permission denied).

14. Include the name of the alias file in the message "error in alias file..."

15. Replaced the old scheme of locking on the actual hints DBM files with a new
one which locks on an entirely separate, empty file created just for this
purpose. Several configuration options bite the dust...


Version 1.736
-------------

1. When there are duplicate addresses, arrange for Envelope-to: to contain all
the top-level addresses that relate to the current delivery.

2. Removed the obsolete "self_mx" option from lookuphost, as threatened since
version 0.57.

3. Added a new value for the "self" option: if it is set "local", the address
is passed back to the directors as if the domain were a local address, and the
name of the host that was found to be local is made available in the variable
"self_hostname" while directing and during any subsequent local deliveries.

4. When a host was specified by IP address on the smtp transport, the test for
"is this an address on the local host" was not being applied as it was for
hosts specified by name.

5. When a host specified on the smtp transport was found to be local, Exim was
panic-dying. This has been changed to freezing, so that other addresses get a
chance at one delivery, and the message log, etc. gets written.

6. The smtp transport now has the option "allow_localhost" which causes it to
send the message to the local host.

7. Added rbl_reject_recipients to allow for logging of RBL hosts only.

8. Change 25 below was buggy. Fixed.

9. Added rbl_except_nets.

10. If BSMTP was set on an appendfile transport being used for addresses that
alias to filenames, the file name rather than the parent address was being put
in the RCPT TO command.

11. Added the options directory_transport, directory2_transport, file_transport,
and pipe_transport to aliasfile and forwardfile, and reply_transport to
forwardfile.

12. Added queue_remote_except.

13. Code re-arrangement so that those generic tests that are common to both
routers and directors (domains, local parts, etc.) are now handled by a shared
function rather than being duplicated.

14. No error was being displayed if there was a problem in the configuration
file when the -bP option was used.

15. Implemented dynamically assigned transports.

16. Added generic "condition" option to directors and routers.


Version 1.735
-------------

1. Add bsmtp_helo to both pipe and appendfile transports.

2. Add PERL_COMMAND to the EDITME (with a value of /usr/bin/perl in the default
makefile) and use it to set up the Perl scripts in the util directory from
"sources".

3. Added recognition of "+allow_unknown" to host lists.

4. Check that HELO/EHLO is followed by a domain name or IP literal, optionally
followed by printing characters only. Reject the command otherwise.

5. Force a reverse lookup if HELO/EHLO gives this host's primary hostname, or
any name that is one of the local domains.

6. Create sender_helo_name and keep it different from sender_host_name, which
is now set only from a reverse lookup. Build sender_fullhost in appropriate
formats, depending on what is/isn't set. A lookup that happens because of a
host check now goes into sender_name, and is available for use in general.
Updated eximstats to allow for bracketed HELO name before IP number.

7. Rename "helo_verify_nets" as "host_lookup_nets", but keep the old name as a
synonym for backward compatibility.

8. Change 3 for 1.73 wasn't right; two sets of quotes are needed:

   WINDOW_TITLE=${EXIMON_WINDOW_TITLE-'"${hostname} eximon"'}

   Sigh.

9. If a reverse lookup of an IP address fails and there is a subsequent
rejection with "administrative prohibition", the fact that the lookup failed is
now stated in the error message.

10. Added the prohibition_message option.

11. If a multiline response from a remote host was displayed in an error
message, the carriage returns appeared as '\r'.

12. Added helo_verify.

13. Added -D macro=replacement option to the command line.

14. The expansion condition "def" can now be applied to test for the existence
of headers.

15. Added expansion operators "quote" and "rxquote".

16. Added expansion variable "$message_headers".

17. Added "return message" to the "mail" and "vacation" commands in filter
files.

18. Permit partial- and * search types for aliasfile.

19. Added domain_data and local_part_data variables when routers and directors
are constrained to particular domains that are looked up.

20. Some untidinesses in the exiqsumm script that caused Perl warning messages
have been fixed.

21. Replaced the Henry Spencer regular expression functions with PCRE.

22. If there was a rewriting rule containing the "s" flag but not the "F" flag,
then Sender headers created on the host were not getting their addresses
rewritten, because Exim was building them from the rewritten envelope sender
without using further rewriting.

23. When copying a message for delivery via SMTP, to add the CRs and .
escaping, the size of the output buffer was previously the same as the input
buffer. This meant that each input chunk required two write()s to send it,
since with the additional characters it wouldn't fit in the output buffer in
one go. The output buffer is now configured separately and has been made bigger
so that this no longer happens.

24. A local delivery should always be tried one last time before giving up.
This was not happening in the case when an address had not yet reached its
retry time, but the message had been on the queue for longer than the longest
retry time of any retry rule (the "long stop" check).

25. If a local pipe delivery returned text and a "defer" exit code (75) and the
message eventually got failed because of the overall timeout, the text didn't
get included in the error message.

26. With headers_check_syntax set, Exim was failing to recognize a header that
contained several "group" lists if any but the last of them was an empty list.

27. The lastest Solaris 2.5.1 defines __P() in resolv.h, causing problems later
in headers that also define it without checking that it is already defined.
Arranged to undefine it if resolv.h defines it.

28. Avoid passing the st_size member of a stat structure directly to any
printing function as it can be a long and may not therefore be an int.

29. -d0 was not overriding debug_level.

30. Diagnose -bs -t together as incompatible options.

31. Added a few words of explanation to the error text when a subprocess ends
with a non-zero status.

32. When a message was directed by a director to a remote transport, Exim
was likely to crash when trying to set up the process log text string, because
it was looking for a routing domain that didn't exist.

33. The signal handler for SEGV that is set while doing a DB read wasn't
getting cleared if the read failed, leading to strange occurrences if a SEGV
occurred for any other reason.

34. If add_headers was specified for an appendfile transport, and the expansion
of the string failed, the lock file on the mailbox was not removed. Also, the
incident was not correctly logged. Tidied up this failure in the pipe and smtp
transports as well as in appendfile.

35. Added ignore_enotdir and ignore_eaccess to the forwardfile director, for
people who run that way. Also suppressed freezing on any other file-opening
error.

36. Do not add the message to the "waiting for host" database if any RCPT TO
command received a 4xx error, as otherwise a message that is forever getting a
temporary failure could be tried far too often - indeed high-speed looping
could occur with two such messages.

37. Added rbl_domains to block SMTP calls by IP lookup.



Version 1.73
------------

1. Tidies to the eximon script:

  (a) Different versions of Linux put basename in /usr/bin/basename or
      /bin/basename. Extended the already-existing "look for it" facility for
      Solaris 2 to look in these places, and set the Linux Makefile to request
      looking for it.

  (b) Changed 2nd and subsequent occurrences of CONFIGURE_FILE in the script to
      $config (oversight), and defaulted config to EXIMON_EXIM_CONFIG to make
      overriding it easier.

  (c) The LD library was specified by a variable called X11R5LIB, set in
      eximon.conf. The "R5" part is rather dated, and also it seems better to
      define all the X11 things together, so now there is a variable called
      X11_LD_LIB which is set with all the others in Makefile-Default and can
      be overridden in Local/Makefile. Default setting have been added to those
      OS-specific Makefiles that had X11 settings other than just an include
      file.

2. Give an error if an IPv4 netmask does not consist of a sequence of 1s
followed by a sequence of 0s (either of which may be of length 0).

3. In the default eximon configuration, the line

  WINDOW_TITLE=${EXIMON_WINDOW_TITLE-'${hostname} eximon'}

requires double quotes, not single quotes.

4. Tweak the os-type script to ignore "386BSD" if set in $OSTYPE.

5. Top-bit-set characters enclosed in quotes in an address were causing
failures in the parsing on machines where such characters appear to be negative
numbers. This typically showed up with "headers_check_syntax" set.

6. Top-bit-set characters not enclosed in quotes were also causing failures on
some systems. This depended on what the result of calling iscntrl() on a
negative number was on systems with signed characters. It is undefined in the
ANSI standard. In some cases it just reads a random byte, and so may vary even
on the same system. Address parsing now runs using unsigned character
variables.


Version 1.72
------------

1. Eximon and the other utilities that included some Exim functions were
dragging in a log of unnecessary Exim code. By supplying, for example, an
alternate log_write() function, the size of all these things has been reduced.

2. Exim segv'd during address testing with -bt if an aliasfile director had an
errors_to setting.

3. The syntax checking and rewriting of addresses for "deliver" in filter files
was happening before the string was expanded. If valid syntax or rewriting
depended on an expansion having happened, things went wrong.

4. Fixed an overrun exposure in the static data when HELO is followed by a
large number of spaces and HELO verification is turned on.

5. The variable "stderr" was remaining set in the daemon, even after it closed
all file descriptors. This meant that anything written to the panic log from
the daemon or a sub-process thereof got copied to this stderr, if it happened
to coincide with a real file descriptor. Cases were seen where it ended up
going down the SMTP channel. As some systems don't allow stderr=NULL, a
different variable was introduced.

6. When a short domain name such as "foo" was looked up up in the DNS by
lookuphost, and got expanded into, say "foo.co.uk", and had a lowest-numbered
MX record pointing to the local host, but "foo.co.uk" is not a local domain,
Exim was freezing the address as an error ("lowest MX points to local host").
It now passes the address back for reprocessing by the routers, since it is
possible that some previous router (e.g. a domainlist) can handle the full form
of the domain.

7. A rather odd alias file such as

  philip.hazel   ph10@xxxxxx
  ph10           ph10@xxxxxx

where "xxxxxx" is a single-component name that expands to a FQDN for a local
domain when looked up in the DNS, was not working. (If FQDNs were used in the
alias file, all was well.) The effect was that Exim thought it had a duplicate
address when hitting "ph10@xxxxxx" for the second time, and so it discarded it.

8. The SMTP HELP command was not showing "ETRN" or "EXPN" (though they were
displayed in response to EHLO). They are now shown if there is the possibility
of any host being able to use them, but of course at the time of use the
host's address is checked.

9. The -Mg option (and equivalent eximon menu item) for telling Exim to give up
trying to deliver a message, now does an implicit thaw on the message if
necessary.

10. The use of "@" to stand for the primary host name was not working in host
lists.

11. Some of the rejectlog output generated by sender_verify_log_details (which
is really an Exim debugging thing) was confusing people who turned on that
switch. Did some slight re-wording.

12. Added clarifying words to the "unknown option" message to indictate which
kind of option was expected (and hint about a possible missing ";" for unknown
generic options).

13. Added additional debugging information to transports/smtp.c, retry.c,
dbfn.c, exim.c.

14. Added code to catch SEGV crashes when reading a dbm hints file. Assume the
record is not found and make main and panic log entries. The underlying cause
of these occasional crashes is not known.

15. Write to the log if a delivery process crashes during a queue run.

16. Changing a messages's sender wasn't removing the "user null sender" bit.


Version 1.71
------------

1. Tidying up and corrections to wording in some human-readable files.

2. The "length" expansion operator was broken. It always yielded the complete
substring.

3. Changed the default configuration file to contain

  helo_verify_nets = 0.0.0.0/0
  sender_host_reject_relay = *

as per discussion on the list, to make the default tighter.


Version 1.70
------------

1. Change of operation style for Eximon. When expanded to full size, if the
window cannot be fully seen where it currently is, it is moved back to where it
was the last time it was at full size, rather than to the left and top.

2. Put the tab character in scripts/Configure-config.h into a variable which is
then substituted, because some tabs got lost again, causing an error from
/bin/sh - as it happens, a harmless one.

3. Tighten up the source somewhat, with security in mind. In particular, do
more checking to prevent potential string overflows.

4. Added "ESMTP" to the default smtp greeting banner, and removed "ready at",
which doesn't really add anything.

5. The iplookup router was changing the domain when verifying a sender address,
which isn't correct.

6. Upgraded the version of libident that is shipped with Exim to 0.21.

7. Fixed a crash that could occur on systems where uid_t is a short.

8. Added syntax_errors_to to aliasfile and forwardfile for generating mail when
a syntax error is skipped.

9. Added the -dropcr option.

10. As route addresses are getting more and more deprecated, remote any
reference to "route address" in error messages from the parser.

11. Typo "HAVE_IPv6" in host.c corrected; only some compilers notice.

12. The saved uid/gid when running a system filter were accidentally defined as
int rather than uid_t/gid_t.

13. Yet another fiddle with the makefile to ensure targets which are listed
as dependencies for exim (e.g. routers/routers.a) are actually present. It has
actually got a bit simpler.

14. Added headers_sender_verify[_errmsg], headers_check_syntax, and
headers_checks_fail.

15. SMTP rejections for policy reasons now all changed to 550 in line with
latest thinking.

16. Added use_shell to the pipe transport.

17. Added use_fcntl_lock, mode_fail_narrower, maildir_format, and
maildir_retries to the appendfile transport.

18. Added interpretation of file names from alias and forward (and filter)
files that end in / to be directory names, and the consequential addition of
address_directory to handle them.

19. Added hold_domains and hold_domains_except.

20. Add the result to the process info string after SMTP delivery attempt.

21. A deadlocking bug concerned with parallel remote delivery has been fixed.
If a single remote delivery subprocess was handling a large number (say 100) of
addresses (at the same domain, usually) the amount of data it wrote back to the
main process down its pipe could fill the pipe and therefore block. The main
process wasn't reading anything until the subprocess had finished. Silly me.
The pipes of subprocesses are now read whenever they contain any data.

22. Eximstats: buglet when called with only one option and no file name.

23. Eximstats: bug when volume of data overlowed the amount that can be
held in a 32-bit number. Now prints in GB if over 10GB.

24. primary_hostname was lower cased if specified explicitly, but not if
obtained automatically. Some people like uppercase letters in their host names
and hence in qualify domains. Exim no longer forces lower case for
primary_hostname and qualify_domain.

25. Retry after certain DNS unexpected failure cases instead of treating them
as domain not found.

26. Only try to write the remainder of the block if write() partially succeeds
when writing to a file, not to a pipe or socket.

27. Make -M require an admin user, to go along with -q. However, add the option
prod_requires_admin so the restriction can be relaxed.

28. Added log_arguments.

29. If CONFIGURE_FILE_USE_NODE was set, the installation script screwed up
finding the name of the configuration file.

30. The substr expansion operator can now take negative offsets for counting
from the end of the string. Also, the absence of a length => "the rest", either
to the left or right.

31. When exim cannot open its panic log, it tries as a last resort to write to
the system log. This is now opened with LOG_PID+LOG_CONS and the facility code
of LOG_MAIL. The message itself is written at priority LOG_CRIT.

32. No longer insist that SPOOL_DIRECTORY be set at build time; the run-time
value is expanded, so can contain the host name. Ditto for LOG_FILE_PATH
and PID_FILE_PATH.

33. sender_host_address, sender_host_name, sender_ident are now preserved on
the spool so they can be re-instated during delivery.

34. Added TEXT_DEPTH as an eximon configuration thing, and defaulted all
of them to 200 (for some reason, for header display it used 500).

35. Bug in eximon fixed: if an address generates other addresses via an alias
or forward file, and these addresses are deferred, eximon notices the deferral
on the log and adds the addresses to the list it displays. However, when such
addresses were subsequently delivered, it did not notice.

36. System filter: action not getting initialized.

37. Added the generic new_director option.

38. Added sender_reject_except.

39. If an address is routed via MX records, and the current host was in the
original MX list, ignore any fallback_hosts that are set on the smtp transport.
Also if any host in a list of hosts in a domainlist router is the local host
(causing the rest of the list to be ignored). This is to provide some
protection against loops.

40. Added -Rf.

41. IPv4 addresses in netlists can now be followed by single-integer mask
specifications, e.g. 123.123.0.0/16.

42. Netlist items can now be file names; the file must contain one net item per
line. Blank lines and lines starting with # are ignored, and indeed, # can be
used to add a comment to any line.

43. Add actual size and sender address to the reject log entry for incoming
SMTP messages that are rejected because they are too big.

44. If an aliasfile or forwardfile director set up an errors_to address with a
prefix or suffix, e.g. xxxx-request@yyyy, and the verification of that address
involved a director that had a prefix or suffix setting, then the address that
was eventually used for errors_to lost the prefix or suffix.

45. Added senders and except_senders to directors and transports.

46. Eximon looped if the first attempt to bring up a menu wasn't pointing
at a message.

47. Implemented split_spool_directory.

48. If the attempt to send a delivery error message failed, Exim correctly left
the failing addresses on the spool, but crashed on some systems instead of
ending cleanly after logging the incident. One cause of this was an incorrect
setting of exim_path.

49. If a non-trusted user used the -bS option and an error was detected in the
sender (MAIL FROM) address in a message, Exim crashed while trying to send an
error message.

50. Handling of errors in batch SMTP (-bS) input was poor; Exim was failing to
skip the remainder of the current message after an error in the envelope.

51. An error response to QUIT got logged without massaging to ensure control
characters were escaped.

52. Permit white space between :include: and the file name (previously it got
included in the file name, leading to a silly error message).

53. Implemented transport filtering.

54. The expansion function was accidentally starting off the new data block
with size "sizeof(string)+50" instead of "strlen(string)+50", but that
shouldn't have caused any serious problem.

55. Updated the call to getpeername() in exim.c for initd calls to use IPv6
data structures when HAVE_IPV6 is set. Updated the SunOS5 os.h for the latest
Sun IPv6 prototype release by removing renaming macros no longer needed.

56. If a $h_ expansion was used in a filter file, and there was more than one
header of the given type, Exim got a bit of store that was one byte too short
to hold the concatenated data. This could cause a crash if the strings were of
appropriate lengths.

57. Cope with race condition while creating maildir subdirectories.

58. Added the -oee option, for sendmail compatibility. Acts like -oem, but
gives return code 0 on error, provided an error message was successfully sent.

59. Added deliver_queue_load_max and queue_run_in_order.

60. Exim incorrectly logged "abandoning queue run" whenever it abandoned
*any* delivery because of a high load average.

61. Added $(LIBS) to the compile command for buildconfig; needed on the Mips
box to get -liberty, which provides strstr().

62. Give an error message if an option is set twice.

63. If a host list contains wild cards (other than "*") or if a host name
cannot be looked up in the DNS, an attempt to match the list causes a reverse
lookup of the IP address. If this failed, Exim was previously ignoring the
relevant item in the list. Now it behaves as if the host does not match in
cases where the list is permissive (e.g. sender_accept_hosts) and as if it does
in cases where the list is prohibitive (e.g. sender_reject_hosts).

64. Added smtp_expn_{hosts,nets}, support for EXPN, and the generic expn option
for directors.

65. The appearance of an item or the form user@lsearch;/x/y/z in one of the
sender accept or address lists caused the daemon to crash at start up.

66. Added the "@@" address-matching lookup feature.

67. Error message improved for unknown expansion operator.

68. Added the expiry stuff to smartuser. Later cut out pending discussion
of desirability.

69. Added receiver_verify_addresses.

70. Always qualify receiver "postmaster" as per DRUMS new draft for 821.

71. Upgrate the iplookup router to use an IPv6 socket if HAVE_IPV6 is set.

72. If any of the host-type options include "localhost" or equivalent, it
didn't always work correctly.

73. Sender headers weren't being treated as senders during rewriting. This
mattered only if there were different qualifying strings configured.

74. Qualification of unqualified addresses in headers is now controlled by the
same options that allow them in incoming SMTP commands. Locally-sourced
messages can always be qualified, of course.

75. If Exim suffers a disastrous error and consequently bombs out while there
is an SMTP call outstanding, it now tries to send a 421 error message, and
subsequently waits for QUIT (or a timeout) before closing the connection.

76. The test for not-reusing a director if it had previously handled an address
now includes checking suffix and prefix as well. This allows the smartuser
director to be used for various lookup transformations several times on an
address. As a long stop, a maximum of 100 parents has been imposed. Exim
panics if the limit is hit.

77. If a user has submitted a message with "-f <>" then the -bp listing now
shows the sender as <> with the user's address in brackets instead of showing
just the sender's address. Ditto for Eximon.

78. String overflow in a filter was giving an incorrect error message about a
missing " instead of saying "string too long".

79. Increased maximum string length for arguments of the "mail" command in
filter files to 1024.

80. Added recipients_reject_except.

81. Added ignore_errmsg_errors_after.

82. Added log_refused_recipients.

83. Fiddled a bit with Christoph Lameter's queue summary script, and installed
it in util.

84. Added check_{spool,log}_{space,inodes}.

85. Added interface option to the smtp transport.

86. DBM support: Changed the locking code for database files from a sleep loop
to a blocking call to fcntl with a timeout. Added DB_LOCKS_ITSELF to cut out
Exim's locking for libraries that do their own, and added sleep/wait loop for
open calls that return EAGAIN, both of these for gdbm. Renamed everything in
Exim that started db_ in order to avoid clashes with DB 2.x. Provided test_dbfn
as a way of checking up on the locking. Extended USE_DB to use native DB 2.x
calls.

87. Ignore setgroups() error if effective uid is not root.

88. Return code for relay rejection changed to 550 in line with latest
thinking.

89. Added relay_domains_inclode_local_mx.

90. Extended the regular expression facilities a bit with some Perlish things.

91. If a rewriting rule with the w flag was followed by one without, the w
didn't get noticed, and the original comments didn't get changed.

92. Modified libident modules ident.c and id_open.c and the header ident.h
to suppost IPv6 and adjusted Exim's makefile stuff to build it in the right
way.

93. Fixed serious bug in the handling of remote parallel deliveries. The
subprocess was just using the file descriptor for the data file that it
inherited from the parent. This meant that all parallel deliveries were working
with the same file pointer, leading to potential loss of data.

94. Removed unnecessary HAVE_SYS_PARAM_H option from the monitor; as
sys/param.h is already always included in Exim, it must be present in all
systems anyway.

95. Both the -bt and -bv options now give return code 2 if any address failed
outright, and 1 if no address failed outright but at least one could not be
resolved. Return code 0 is given only when all addresses succeed.

96. Added the "q" rewrite flag.

97. Address lists can now contain items of the form <xxx>@@ where the second
"@" stands for "primary_hostname"; cf domain lists.

98. Added sender_verify_batch.

99. Added uid/gid and "+" option to require_files.

100. If recipients_max_reject is set true, then Exim rejects messages
containing too many recipients by giving 550 errors to the surplus RCPT TO
commands, and a 554 error to the eventual DATA command.

101. Added -bpu and -bpa options.

102. Log the number of bytes written when an SMTP connection times out.

103. Fixed performance buglet. If a local address that contained uppercase
letters caused other addresses to be generated, and they were all delivered
but other addresses caused the message to be tried again later, Exim still went
through the process of generating the children of the address containing
uppercase letters the next time, even though they had previously been
delivered. It failed to record correctly that the parent address was complete.
This didn't cause any wrong deliveries or anything; just wasted work.

104. "partial0" was not working (to search right down to a "*" entry).

105. Added the "*" option to search types.

106. The regular expression for setting up eximon stripcharts wasn't correctly
recognizing the remote_smtp transport in the default configuration.

107. -bp, -bpu, -bpa can be followed by a list of message ids.

108. If a message disappeared (completed) after a list had been compiled but
before the data was read during -bp processing, an error was given.

109. Added include_domain to aliasfile.

110. Added generic transport options add_headers and remove_headers.

111. Added qualify_domain and qualify_recipient expansion variables.

112. Added $recipients expansion variable, valid only in the system filter
file.

113. Arranged for the rewriting function, when called from .forward file
processing, to change its uid/gid back to exim for the replacement expansion,
so that it can lookup in non-world-readable files.

114. Eximon wasn't taking note of -J files and consequently wasn't noticing
completed deliveries as soon as it might.

115. Split up the target in the toplevel makefile so that it is now possible to
do "make build-directory" independently.

116. Bug in the ipliteral router: the host wasn't being given a unique name,
and this could cause confusion in the processing for messages waiting for
transmission to that host.

117. Modified the conversion program that builds a TeXinfo source of the
documentation to make the node linking more the way TeXinfo documents are.

118. If local_domains ended with a colon and local_domains_includes_host
or local_domains_includes_host_literal was set, the doubled colon generated by
adding domains onto the end of the list was causing items in the list to get
concatenated. In addition to fixing this, the primay_hostname is now added at
the front of the list, as that seems more sensible.

119. Avoid trying to write to the log when called with -C from by unprivileged
user.

120. Implemented receiver_verify_senders.

121. Fixed :include: overrun exposure.

122. Moved sys/types.h before dirent.h in exim.h and em_hdr.h for FreeBSD.
I don't think it will screw up any other OS.

123. Freeze_tell_mailmaster wasn't being checked when the message was frozen by
a system filter.

124. Some more tightening up of string handling, thanks to someone who kindly
read the source carefully and pointed out things to me.

125. The daemon didn't log things if log_arguments was set.

126. If used in a system filter file, "personal" caused a crash. It doesn't
actually make must sense there, but it shouldn't crash. It now just yields
FALSE.

127. Change to makefile to avoid use of $(LOCAL) which caused a problem in some
systems during the config.h building.

128. If $OSTYPE is just "irix", ignore it and go on to find the real OS type
from uname.

129. The utilities exim_dumpdb and exim_fixdb needed "#include config.h" adding
in order to pick up USE_DB for use in the dbfn.h header.

130. Aliasfile lookups were accidentally being done as "partial0".

131. Added receiver_verify_senders_except.

132. If relay_domains set but no host or net accepts or rejects, assume reject
all instead of accept all.

133. If exim is not seteuid root, don't attempt to fork for delivery after
accepting a local message - there's no point, and it will give permission
denied if the original caller isn't an admin user.


Version 1.62
------------

1. The text widgets in the monitor now have the attribute editType set to
XawreadAppend. This causes the "replace" parts of the search pop-up window to
get greyed out on systems where the unmodified TextPop widget has to be used
because the modified one can't be linked in (BSDI, HP-UX). [The modified
version has the "replace" items totally removed from the pop-up window.]

2. Removed unnecessary definition of bcopy() from the modified StripChart
widget, since it is defined in Xfuncs.h.

3. Ensured that any ident value is added to the log messages for various
rejections (correcting oversight).

4. Make name of hitching post file appear in error message complaining that it
cannot be created.

5. Added commented-out entries setting group=mail and mode=0660 to the default
configuration for systems that work that way.

6. Re-jigged the makefile yet again. Now "make makefile" *just* rebuilds the
makefile; it does not go on to build everything else.

7. After a partial lookup for a domain, as well as having $1 set to the wild
part of the domain, $2 is now set to the fixed part. These might be $2 and $3
if a wild local part is part of the key being matched, e.g. in a rewriting
rule.

8. After a non-regular expression address-matching operation, $0 was getting
set to the local part rather than the whole thing.

9. The variables $1 and $2 now contain the wild/non-wild parts of the key
during the replacement text for a partial ${lookup operation. If there is no
partial lookup (or it fails), they keep their external values.

10. Linux version 2.1.15 uses the more sensible structure name "ip_options"
instead of just "options". Code changed to use the new name, and a fudge added
to define a macro converter on older systems.

11. The loop-detection logic for direction was testing only the local parts of
addresses. This caused incorrect operation when a director was handling several
different domains. It now compares both the local part and the domain.

12. Some minor C infelicities causing warnings from the Sun compiler fixed.
Included inventing DN_EXPAND_ARG4_TYPE because IRIX uses u_char * when all the
others (I've looked at) use char *.

13. Typo in the db.c file caused a file of the wrong name to be opened after an
EINVAL error.

14. Missing close of dbm file in transport.c when bad data detected in the
file.

15. More cases of errno usage (in exim.c, readconf.c, and retry.c) had been
overlooked. Renamed.

16. Added prototype support for IPv6. See README.IPV6.

17. Leading and trailing spaces removed from items in string lists.

18. Three bugs in smartuser concerned with the use of new_address; I suspect
nobody had ever used it before...

  (a) Trailing @ left on local part for a local transport.
  (b) Incorrect local part (contained domain) for a remote transport.
  (c) Domain & local part incorrect if new_address got rewritten by a
      rewrite rule and the length of the local part changed.

19. The functions string_{first,next}inlist() kept an internal state and
returned output in a static buffer. These functions are used independently and
also by match_isinlist(). There was one known instance (verify hostlist, when
local_interfaces was set) where they were called again before completing the
first sequence. They have been replaced by a single function called
string_nextinlist(), which does not keep any local state, making the whole
thing much safer.

20. Only the first suffix in a list of suffixes on a director was recognized.

21. If either of the sender_reject options contained a lookup, the daemon was
holding the relevant files open.

22. Under fvwm (and at least one other window manager), the "size" button in
eximon put the window furniture off the screen. Experiment seems to indicate a
difference in the way the different managers position windows, with twm
including the WM furniture, and the others not. I have kludged up the code so
that it works under twm and fvwm. I hope the kludge is good enough for other
window managers.

23. Reworked exim_install to avoid the use of "grep -h", which it seems is
non-standard.

24. Exim was allowing a "From " line in a message to override a sender set by
-f on the command line. Sendmail has the opposite priority, so Exim has been
changed to be the same.

25. Change 98 for 1.60 was incorrectly implemented. All addresses following the
empty one were ignored.

26. If appendfile was used for a "remote" delivery (e.g. batched SMTP) it could
crash because of a reference to deliver_localpart, which is unset in such
cases.

27. Parameterized chown and chgrp for exicyclog, because chown lives in sbin in
BSD systems. Also parameterized rm and mv while at it, just in case.

28. BSD systems can return structures of a non-standard length on the
SIOCGIFCONF ioctl (used for finding all local interface addresses). The
contained sockaddr structure may be longer than its sizeof, and there's a field
containing the length. If HAVE_SA_LEN is defined, code to use this is compiled.
This macro is set by default for BSD systems.

29. Bug in change 65 of 1.60; inadvertent use of strcat() instead of strcpy()
meant that text from the final line of the configuration file got included in
the inserted text if it was long enough.

30. When a queue run is abandoned because the load average is too high, the
log is now written from within the delivery process that aborted, so as to use
the same load average value. Previously the outer process read the average
again, and as it can change quite quickly, this could lead to confusing log
entries.

31. Warning added to error message when forward file starts with filter header
but filtering not enabled.

32. Added debug_level option; -d overrides.

33. Added check_ancestor to forwardfile and put it in as default in the default
configuration for .fowards.

34. When relaying is forbidden because the host is not acceptable, the logged
message now contains either "(host accept)" or "(host reject)" to indicate
whether it was failed by an accept list or a reject list.

35. Added relay_match_host_or_sender.

36. If a frozen message was delivered via the Eximon menu operation, Eximon
failed to notice that it had been unfrozen as part of the delivery, and
continued to display * next to it.

37. Improved error message for screwed-up local part in route address. Instead
of just saying "missing @" say "@ or . expected after xxxx".

38. There is a fundamental difference between BSD and SYSV in the matter of
groups (it has been discovered). On BSD systems there is a single group list,
and the first entry in it is the current group. On SYSV there is a
supplementary group list, which is in *addition* to the current group. The
existing code setgroups(0,NULL), which clears the supplementary group list on
SYSV, fails on BSD. Exim now tries setgroups(1,<main group>) when
setgroups(0,NULL) fails. This should make is clear out any supplementary groups
on both kinds of system.


Version 1.61
------------

1. Calling Exim (incorrectly) with just the -h option (not followed by a
number) causes a segmentation fault.

2. Exim could crash when handling multiple directions for a single message,
especially if caused by several chained aliases.


Version 1.60
------------

1. Include extended eximstats script in this version.

2. For historical reasons, the eximon script did its own check of the operating
system to find where the "basename" and "hostname" commands were. This code has
been replaced by settings derived from the main configuration files.

3. A binary zero in the first line of a message body that was not separated
from the headers by a blank line was not getting through.

4. A sequence of two or more "bare" CR characters in a message was getting
corrupted.

5. I have found a recommendation that LF's without CR's in incoming SMTP should
*not* be treated as line terminators, so Exim no longer does so, but it
applies this rule only to external incoming SMTP. HA! Later there was
discussion about this and it seems there are plenty of sites that do it, so
change 67 below reverses this one.

6. If there was a problem with one of the alternate configuration files, the
error message gave the generic name rather than the name of the alternate file.

7. If a file existence test (for require_files) causes an address to be
deferred because it cannot determine whether the file exists or not, the
deferment message now contains the strerror() output from the errno that was
returned by stat(), to help in debugging.

8. Make -bP output uid lists colon-separated.

9. Add sender information to the log line when a recipient verify fails.

10. Sender_address_relay wasn't working for non-regular expressions in cases
where the sender was a local address that got rewritten such that the local
part changed its length.

11. Put signal(SIGCHLD, SIG_DFL) at the start of Exim to cope with MUAs that
manage to call it with SIG_IGN set, which causes completed subprocesses not to
wait for wait(). Also, detect ECHILD in wait() loops, log an anomaly, and break
the loop.

12. Fetched the latest version of the libident library (0.20) to distribute
with Exim. It should get rid of some compiler warnings on HP-UX.

13. Lines longer than 256 characters in lsearch lookups were being chopped.
Increased the limit to 4096.

14. Give new address in log entry when fixing up return paths for
sender_verify_fixup.

15. Insist that only an admin user may start the daemon or force a queue run
with -q.

16. Put the Exim version number into the daemon start-up log line.

17. If the expansion of the hostlist item in a domainlist router was forced to
fail, just fail the router. An unforced fail still freezes.

18. Incorrect error message given for a string expansion if the expansion of a
substring in a condition failed.

19. Randomize MX records of equal priority, and randomize A records for
multihomed hosts.

20. Following discussion on the mailing list, the default configuration no
longer contains ignore_status in the address_pipe transport.

21. Messages listed with -bp are now sorted into file name order - which is the
order of message arrival. This is fixing an oversight.

22. Implemented log_level, always_bcc, queue_remote, -odqr, accept_8bitmime,
helo_verify_nets.

23. Failure of exec after SIGHUP logged on main log as well as panic log.

24. Added OS configuration files for SCO SVR4.2MP (and maybe Unixware), as
received from "Kevin" <kadokev@relay.ripco.com>.

25. Typo in deliver.c fixed; would have caused a crash if a parallel remote
delivery process failed to end cleanly.

26. A substring consisting of just the character "@" in a domain list matches
the primary name of the host. Thus local_domains = "@" is another way of doing
local_domains_include_host, and it also works for other domain lists such as
percent_hack_domains and the domains generic options of directors and routers.

27. Reworked retry matching rules: (1) Allow file lookups; (2) local domains
can appear without local parts, implying all local parts match; (3) check for
domain as well as host for remote failures. Added -brt option for testing.

28. Added -brw option for testing rewrite rules, and revamped the rewrite rule
syntax to make more flexible.

29. Colons can be got into colon-separated lists by doubling. This could be
useful for lists of addresses, which sometimes contain colons (in quotes).

30. Fixed obscurish bug in the code for scanning colon-separated strings. If a
loop was exited in the middle, and the next string to be scanned was in fact
NULL, then the remainder of the old string got scanned instead. Various odd
effects resulted.

31. Documented things in os.c and os.h in a new file called os.Configure, and
added the omitted HAVE_SETRESUID to Makefile-Default.

32. Improve the make files so that if the created makefile gets deleted owing
to a bomb-out during an initial make, it automatically gets rebuilt next time.

33. Improvements to the arch-type and os-type scripts.

34. Added missing (void *) casts to the second arguments of read() and write().

35. Give expanded pipe command in error messages when a pipe delivery fails,
rather than the unexpanded version.

36. If expansion of an argument in a pipe command failed, the pipe delivery
process crashed rather than giving a sensible error message.

37. Added connect_timeout to the smtp transport (I've realized how to do it).

38. When the only viable MX records point to a non-existent host, a better
error message than "unknown mail domain" is now given.

39. An obscure case where a timeout would not operate for the writing of chunk
of data has been fixed.

40. Eximon: suppress queue display updates while a menu is displayed. This was
previously the cause of some loops.

41. With sender_verify set, if the verification suffers a temporary failure,
Exim now goes on to read the headers and gives the 451 failure code after the
data instead of after MAIL FROM, thus allowing it to log the headers.
Furthermore, if sender_verify_fixup is set, it will now try to fix the sender
in this case.

42. When a local delivery is made to a pipe, file, or autoreply transport, and
the immediate parent address of the final target is not the top-level address,
that parent is shown in brackets after the address in the log entry.

43. Fixed typo: MAILER_DAEMON => MAILER-DAEMON in default prefix line in pipe
transport (it was ok in appendfile).

44. Put SHELL=/bin/sh at the top of the make files to make them work in systems
such as IRIX that use the SHELL variable and default to csh.

45. Reorganized all code concerned with uids and gids to allow them to be
negative for AIX. This has involved adding a flag variable to all those that
need to have a set/unset indication. At the same time, ensure they all use the
types uid_t and gid_t rather than int. This has been a pretty massive re-
organization all round. I wonder how much I have broken?

46. Option list for the forwardfile driver was out of alphabetical order; this
could have led to some options not being accessible, but there were no
complaints!

47. If the file for forward file was specified as absolute, the directory
wasn't getting passed over as HOME for pipe deliveries.

48. Set the SIGCHLD signal to SIG_IGN rather than SIG_DFL in the process for
receiving an incoming SMTP message. That way, child delivery processes should
(on some systems at least) go away immediately they complete instead of
becoming defunct and waiting for wait().

49. Added max_rcpt to the smtp transport.

50. Splitting of verify and fail_verify into separate _receiver and _sender
options for routers and directors.

51. Addition of verify_only to routers/directors.

52. The final "message accepted" message for an incoming SMTP message now has
the message id appended.

53. Added log_subject and log_smtp_confirmation.

54. If a number of addresses were passed to the smtp transport, and some were
delivered to one host and some to another (because they received temporary
failures from the first host), all but the first were logged with -> which
isn't right. At the same time, made suppressed deliveries because of -N use
"*>" in the log.

55. Updated the cunning locking algorithm in appendfile, after consultation
with its originator (the author or procmail). This will partly paper over the
problem that is seen in those versions of Linux that do not update their inode
cache after a link() call.

56. Added "rewrite" options to aliasfile and forwardfile.

57. Changed "*" to "D" in -bp output; may be less confusing.

58. Added return_fail_output, log_output, log_fail_output to the pipe
transport.

59. The variable message_size contained only the count of bytes in the message
body; the header lengths are now included.

60. Added the quota option to appendfile.

61. Added defensive code to exigrep to avoid Perl warning if a log line should
be less than 20 characters.

62. Makefile-Linux updated to point to X11R6, since I'm told that is now
generally in use in various variants.

63. Exinext: was not searching the output from exim_dumpdb in a
case-independent way.

64. Multi-line SMTP error responses were causing unexpected newlines in the
log. Now shown with \n for the newlines, but sent as newlines in error
messages.

65. Replace occurrences of '&' in the gecos field with the login name; the
first characters is uppercased. This is a fudge that seems to be found in many
Unixes.

66. For historical reasons, the script exim_install allowed overriding of the
"cp" command by a user-set variable called "cp". Turns out that some versions
of AIX have such a thing set. All the relevant variables are now preceded by
"inst_".

67. It seems there are sites that send only LF instead of CRLF in their SMTP
transactions, and that smail and sendmail can handle them. Relax Exim's
constraints so as to run with the herd.

68. Added the "substr" operator and "match" condition to expansions.

69. Added message_precedence expansion variable.

70. Added the "w" flag to rewriting rules.

71. The message id was appearing twice in log messages for manual status
changes (e.g. adding recipients).

72. There were originally so few options I just implemented a sequential
search. There are now so many more that I have (with luck) speeded things up a
bit by putting in a switch on the first character after the '-'.

73. Addition of -qf, -qfl, and -ql options.

74. Separation of home directory and current directory for local deliveries,
and addition of new options to various directors and transports.

75. The handling of select() and accept() failures in the daemon was copied
from smail: a 5 second pause after each one, and crash the daemon after more
than 10 in succession. The comment about the latter is that accept() fails
continuously on some OS. However, it seems that genuine errors can occur here,
and maybe the looping thing is now a dead duck. Changed Exim to carry on
regardless, but to batch up successive error messages into a single message
with a count. Messages are now written to the main log rather than the panic
log, but if a batch gets up to 50, there is output to both logs.

76. Added dns_retrans and dns_retry.

77. Give the sender and the list of as-yet-undelivered addresses in the
freeze_tell_mailmaster message.

78. Made DB utilities more robust against corrupt files.

79. Re-organized delivery recording to use a journal while delivering, and a
single spool file update at the end. More robust against sub-process crashes
after completing a delivery, and possibly even cheaper when many addresses
involved.

80. Exim crashed after successful SMTP delivery to a host whose identity was
obtained from an expanded string set as the "hosts" parameter of the transport.
Even without a successful delivery, it could crash if fallback hosts were
involved and there was more than one SMTP connection made via the same
transport in the same process.

81. Eximon was crashing if "edit sender" or "mark delivered" was selected from
the menu.

82. Addition of simple macros to configuration file.

83. Don't explicitly unlock DBM file before closing.

84. Fixed obscure store-overwriting bug provoked by address-rewriting. Showed
up when more than one message was received by SMTP in the same connection, and
verify_recipients was turned on. Very dependent on precise store usage;
changing a single line of the DATA changed things.

85. If a process opens a Berkeley DB file and thereby causes it to be created,
it doesn't actually write anything to the file immediately. Another process
that opens the same file then gets an EINVAL error, since the data in the file
is invalid. As the second process can't open the file, it can't try to lock it
and wait for it to become available. Exim now tries several times, with pauses,
if it gets EINVAL when trying to open a database file.

86. Argument combinations "-bp -q" and "-bd -q" diagnosed as nonsensical.

87. If the Exim is called as "rmail" treat it as equivalent to "exim -i";
thus allowing UUCP messages to be input using non-SMTP mode ie preventing a
single dot on a line from terminating the message.

88. Bug in parsing lists of addresses in .forward and alias files; commas
inside comments (brackets) were not being correctly skipped.

98. Ignore empty addresses in alias and forward files (e.g. a line containing
just a comment in brackets).

100. Added skip_syntax_errors option to aliasfile & forwardfile.

101. Added retry_use_local_part option to appendfile and pipe transports.
Forced it "off" for deliveries by smtp batching local transports

102. Filter processing. Expansion of conditions was happening while parsing the
file, which meant that numerical variable insertions were not happening. Now
the expansions happen when the conditions are tested, and the numerical
variables remain in existence for ever after a regular expression test.

103. Added recipients_max.

104. Eximon: added the test links=0 for detecting log file rolling over, for
Digital systems.

105. Eximon: added BODY_MAX parameter to limit the amount of body shown.

106: Eximon and -bp options: display message sizes.

107. Added local_interfaces: specifies those interfaces to be considered as
local for outgoing SMTP, and those on which to listen in the daemon.

108. Added serialize_{hosts,nets} to smtp transport.

109. Domainlist: added ability to specify transport on each item.

110. Added ability to queryprogram router to return a string that is passed as
a parameter to the transport. A general facility is now available, but
currently only queryprogram makes use of it.

111. Added some configuration structure for IPV6 so people can develop.

112. Added log_ip_options and kill_ip_options.

113. Added "batch" option to appendfile and pipe, and expansion variable
$transport_recipients. In conjunction with "batch" this makes a more flexible
interface to, e.g. UUCP.

114. Added "expand" option to aliasfile.

115. Re-jigged the -R code to stop it forking a subprocess for every message on
the queue. It now does the testing first, and forks only when it hits a message
it wants to deliver.

116. Added sender_accept and sender_accept_recipients, cf the corresponding
reject options.

117. Added ETRN command (RFC 1985) and smtp_etrn{hosts,nets}.

118. Added receiver_verify_except_{hosts,nets}.

119. Permitting unqualified senders/recipients failed for all but the first
message in an SMTP connection if the firsts message's sender/recipients *were*
qualified.

120. Changed appendfile so that it creates a lock file before opening the
mailbox. This should reduce the window of risk when two exims are both
delivering over NFS to the same mailbox.

121. Ancient and obscure bug in reading in the spool header file fixed. The
effect was to set incorrect balancing values in the tree of non-recipients.
This in turn could lead to crashes when updating the tree. Also made the tree
functions more proof against this happening again.

122. Made -ov synonymous with -v. Sendmail distinguishes them, but does things
that don't apply to Exim.

123. Calling Exim as "runq" is equivalent to "exim -q".

124. Renamed all structure fields called "errno" as "basic_errno" as errno is
permitted to be a macro in ANSI C, and in some implementations it is.

125. Did some code tidies to get rid of warnings from -Wall in gcc.

126. Made scripts/os-type recognize "freebsd*" as FreeBSD.

[Entries for earlier versions of Exim have been archived]

****
