19960328 qmail 0.74, beta.
19960326 change: changed subdirectory split from 32 to 23.
19960326 portability problem: some versions of make don't understand
         that a line with just a tab is blank. impact: couldn't compile
	 under those systems. fix: eliminated extra tab from Makefile.
	 tnx TG.
19960325 change: added qmail-mailq.
19960325 change: introduced readsubdir.
19960325 change: qmail-setup makes split; qmail-check checks split.
19960325 change: used split in qmail-send, qmail-clean, qmail-queue
         for mess, info, local, remote.
19960325 change: fmtqfn now supports split queue subdirectories.
19960325 cleanup: eliminated cat2s().
19960325 cleanup: introduced fmtqfn.c. used it in qmail-queue.c,
         qmail-send.c, qmail-clean.c.
19960325 change: in protocol between qmail-clean and qmail-send, now
         using intd/ instead of mess/.
19960325 change: qmail-queue.c and triggerpull.c now work inside queue
         subdirectory.
19960325 change: spawn.c now checks whether message is a regular file.
19960325 change: spawn.c now allows slashes in messid except at
         beginning.
19960325 cleanup: introduced fnmake_split in qmail-send.c.
19960325 cleanup: eliminated strnum in qmail-send.c in favor of
         fnmake_{info,todo,mess,chanaddr} and fnmake2_bounce.
19960325 cleanup: introduced strnum3 in qmail-send.c for the logging
         uses of strnum.
19960325 cleanup: in qmail-send.c, getinfo() now takes id argument.
19960325 cleanup: qmail-send.c now preallocates space for fn, fn2.
19960325 change: time zone is now -0000 instead of +0000. encouraging
         DRUMS to use this as an i-don't-know-the-local-time indicator.
19960324 change: qmail-rspawn.c now calls tcpto_clean().
19960324 cleanup: spawn.c now calls initialize().
19960324 change: qmail-setup makes lock/tcpto; qmail-check checks it.
19960324 change: qmail-remote now quickly skips connect() to a host that
         seems to be down. tnx BP for pressuring me to get this done.
19960323 change: in qmail-alias.8, renamed mboxg as mboxrd. tnx RD.
         idea was popularized by RD in June 1995.
19960322 cleanup: eliminated subfd_init().
19960322 change: qbiff now removes the word Subject.
19960322 change: now /bin/true instead of /dev/null in the generic
         INSTALL.ids instructions. tnx JPR.
19960322 change: added hfield_skipname(). tnx RN.
19960322 bug: qmail-inject did not check whether USER needed quoting.
         impact: if USER had weird characters, the From address would
	 generally be wrong, unless the user manually set up MAILUSER
	 with proper quoting. fix: qmail-inject sets up a quoted-string
	 if necessary.
19960322 cleanup: separated out quote_need() in quote.c.
19960322 cleanup: added stralloc_catb.c. used it in qmail-alias.c,
         qmail-send.c.
19960322 change: qmail-send now uses a quadratic retry schedule from
         birth of each message. this also eliminates clustering.
19960322 cleanup: separated out nextretry() in qmail-send.c.
19960322 change: qmail-remote now passes all non-@ addresses through
         without comment, not just <> and <#>.
19960322 change: replaced # test with anything@[] test in qmail-inject.
19960322 change: replaced # with #@[] in qlist.c, qmail-alias.c,
         qmail-send.c, qreceipt.c.
19960322 change: qmail-lspawn no longer discards messages to <#>.
19960322 cleanup: in qlist, used str_diff for <> and <#> tests.
19960322 change: qmail-alias is now back to testing envelope sender for
         <> and <#>, rather than things without an @.
19960321 change: added 8BITMIME support to qmail-smtpd.
19960321 change: added ESMTP support to qmail-smtpd.
19960318 change: used NEWSENDER in place of SENDER for |forward.
19960318 change: added NEWSENDER.
19960318 change: added HCMSSC support to qmail-alias.c.
19960318 change: added HCMSSC support to spawn.c.
19960318 change: added HCMSSC support to qmail-remote.c.
19960318 change: added HCMSSC support to qmail-smtpd.c.
19960317 portability problem: SCO requires -lsocket -lnsl. impact:
         couldn't compile under SCO. fix: added SCO section in
	 make-cmds.sh. tnx JPR. note that this is for OSR 5; 3.2v4.2
	 will need more fixes, and old 3.2 is basically hopeless.
19960317 bug: newfield_datemake would leave newfield_date alone if it
         was already initialized, even though qmail-send calls
	 newfield_datemake anew for each bounce. impact: bounce messages
	 would usually have an incorrect Date field. fix: redid
	 newfield_datemake to update newfield_date each time.
19960317 change: allowed . and @ in 822 phrases; 822 doesn't allow them,
         but they do show up. tnx to the DRUMS group.
19960317 change: replaced GMT with +0000 in date822fmt.c. this confuses
         a few versions of getdate(), but the DRUMS group is going to
	 outlaw GMT, not just recommend against it as in 1123.
19960317 change: redefined ALIAS_EMPTY to take advantage of . for file
         deliveries. tnx RN.
19960317 change: qmail-alias now allows . as well as / to start file
         deliveries. tnx RN.
19960317 change: qmail-alias now dies (soft) if .qmail is writable to
         others, rather than silently ignoring it.
19960317 change: qmail-alias now dies (soft) if flagforwardonly is
         violated, rather than silently ignoring the bad instructions.
19960317 change: qmail-alias now ignores x bit on empty .qmail files.
19960317 bug: if RCPT gave 4xx and DATA gave 5xx, qmail-rspawn would
         incorrectly assign a permanent failure to that recipient.
	 impact: in that case, mail would be incorrectly bounced. fix:
	 remove orr > 0 test from qmail-rspawn.c.
19960310 change: tcp-env now uses signal_uninit(). [sigh]
19960310 change: tcp-env now specifically unsets HOST and INFO if they
         are not applicable. just trying to make it more widely usable.
19960310 cleanup: used byte_* in remoteinfo.c, ipme.c, tcp-env.c.
19960310 cleanup: added readwrite.h, eliminated sys.h.
19960310 cleanup: included byte.h in qmail-send.c.
19960310 cleanup: eliminated i and j from forward.c's main().
19960310 cleanup: eliminated wstat from qlist.c.
19960310 cleanup: eliminated die_nomem() parameter in qmail-setup.c.
19960310 cleanup: eliminated i from qmail-remote's addrmangle().
19960310 cleanup: added exit.h.
19960310 cleanup: split ipalloc.c off of ip.c.
19960310 cleanup: added fmt_strn.c, eliminated fmt_strncpy.c.
19960310 change: reorganized INSTALL to do some pre-upgrade tests.
         tnx RN.
19960310 change: reordered steps in upgrade procedure in INSTALL.
19960308 change: eliminated ownership test in qmail-alias.c. tnx DS.
19960304 change: in SECURITY, ``six most recent sendmail security
         holes'' -> ``seven most recent sendmail security holes.''
19960303 qmail 0.73, beta.
19960303 change: added SYSDEPS.
19960303 cleanup: revamped select.h autoconfiguration.
19960303 cleanup: revamped fork.h autoconfiguration.
19960303 cleanup: revamped direntry.h autoconfiguration. target is now
         direntry.h; auto-hasdrent.h is gone.
19960303 change: tryflock.c now includes <sys/types.h>, for consistency
         with lock.c. may affect portability.
19960302 portability problem: under BSDI, can't set sticky on normal
         files. dorks. impact: the new qlist doesn't work under BSDI;
         be glad I test things before release. fix: qmail-alias and
         qlist now use executable instead of sticky.
19960302 change: gfrom now quotes >From and >>From etc. as well as From;
         in other words, I'm switching from mbox format to mboxg format.
19960302 cleanup: added gfrom.c. used it in qmail-alias.c, maildir2mbox.c.
19960302 change: addbounce() now substitutes \n\n -> \n/ in reports,
	 and \n -> _ in recips. thus bounces can now be reliably parsed.
19960302 change: if qmail-send had trouble reading the original message
	 or the list of addresses for a bounce, it used to give up and
	 send a bounce with "Oh no! I had trouble reading the rest of
	 your message" or some such. now it aborts the bounce attempt
	 and tries again later.
19960302 cleanup: added qqtalk_fail(). used it in qmail-alias.c,
         qmail-smtpd.c.
19960302 bug: if mailforward() had trouble reading message (e.g.,
         because of an I/O error), it marked an error but kept reading.
	 impact: could loop forever. fix: upon error, break.
19960302 change: maildir2mbox now scans (restrictively) for return-path.
19960302 change: qbiff now prints subject and body, up to 74 chars.
19960302 change: added H_SUBJECT to hfield.
19960302 change: qbiff now puts TO before FROM.
19960301 cleanup: added fmt_str.c. used it in many places.
19960301 change: qmail-send now says something if you've told it to exit
         but it's waiting for some deliveries. tnx RN.
19960301 change: qmail-alias -n now continues (with warning) if home
         directory is sticky. tnx RN.
19960301 change: improved usage messages in qmail-alias.c. tnx RN.
19960301 change: put limit on length of addresses in qlist.
19960301 change: added exit 99 support to qmail-alias. tnx RN.
19960301 change: qmail-alias now exits immediately on temporary or
         permanent error. rewrote section in qmail-alias.8 accordingly.
19960301 cleanup: eliminated flagsuccesses from qmail-alias.c.
19960301 change: added usermap.
19960301 bug: failure to append to mbox was a permanent error. impact:
	 if mbox was temporarily unopenable (e.g., because fds were
	 low), mail would be incorrectly bounced. fix: failure is now
	 temporary. tnx DS.
19960229 change: qmail-alias now preserves any envelope sender that
         doesn't contain an @, not just <> and <#>.
19960229 cleanup: revamped byte_* interface.
19960229 cleanup: renamed str_cpy as str_copy.
19960229 cleanup: added str_chr.c. used it in qbiff.c, qmail-smtpd.c.
19960229 cleanup: added str_rchr.c. used it in qmail-send.c, quote.c,
         qmail-remote.c.
19960229 cleanup: added byte_rchr.c. used it in qmail-smtpd.c, spawn.c.
19960229 cleanup: used USEREXT instead of RECIPIENT in qsmhook.c.
19960229 cleanup: used USEREXT instead of RECIPIENT in qbiff.c.
19960229 cleanup: removed j and k from rewrite() in qmail-send.c.
19960229 portability problem: under HP-UX 10 and Solaris 2.5, can't
         setgroups()/setgid() to the system's nogroup/nobody gid. dorks.
	 impact: inetd chokes, so all SMTP connections are rejected; and
	 ``alias'' mail, including postmaster, bounces. fix: in
	 INSTALL.ids, set up a separate powerless gid (tentatively
	 ``nofiles'') for qmaild and alias. tnx DS and PJG.
19960229 change: qreceipt now uses qqtalk rather than qmail-inject.
19960229 change: qlist now uses qqtalk rather than qmail-inject.
19960229 change: incorporated qmail-setup patch from RN for better
         error messages.
19960228 change: added LSPAWN_BREAK in conf-unusual.h; used it in
         lspawn.c. configurability requested by PJG.
19960228 portability problem: on several systems, including everything
         from DEC, select() on a pipe reader returns 1 if there aren't
	 any writers yet. pointed out by DS. impact: qmail-send chewed
	 up lots of CPU time. fix: trigger_set() now opens the pipe for
	 writing after opening it for reading. also added trynpbg1; on
	 working systems, no point in wasting the extra fd.
19960228 change: qmail-alias uses .qmail sticky bit for forwardonly.
19960228 change: qlist now sets sticky bit on .qmail file.
19960228 change: un-documented +list.
19960228 portability problem: on HP-UX and possibly other systems, the
         supplementary group list does not include the gid. pointed out
	 by DS. impact: on those systems, tryshsgr could incorrectly set
	 hasshsgr; this would prevent qmail-send from running. fix: if
	 tryshsgr sees that getgroups() returns 0, now it actively sets
	 up a supplementary group list. added chkshsgr to make sure the
	 setgroups() will work.
19960227 cleanup: eliminated GETSHORT in dns.c in favor of getshort().
19960227 cleanup: deleted h->len < 3 test from qlist.c:dobody. tnx RN.
19960227 change: replaced ~ with $HOME in INSTALL.mbox.
19960227 change: added note about setgid-mail bits to INSTALL.mbox.
19960227 change: added forward.1.
19960227 change: modified forward to allow multiple addresses.
19960227 change: modified forward to take an entire address, not just a
         hostname.
19960227 change: renamed qrelay as forward.
19960227 change: added USEREXT support to qmail-alias.
19960227 change: added -F to sendmail. the need for this was pointed
         out by RN.
19960227 change: added 2 bytes of slop in alloc().
19960227 bug: received_setup() was not allowing space for the final \0.
         impact: none; the line length is always between 65 and 75
	 characters, which gives at least 45 characters of slop with
	 existing malloc() implementations. fix: leave space. tnx NH.
	 note that the bug here is really in fmt_strncpy, which was
	 written before i was truly free of the curse of libc.a.
19960227 change: added ALIAS_EMPTY in conf-unusual.h; used it in
         qmail-alias.c. tnx PJG.
19960227 change: added SPAWN_NUMD in conf-unusual.h; used it in spawn.c.
19960227 change: added conf-unusual.h.
19960227 cleanup: replaced sizeof(short) with 2 in dns.c.
19960227 portability problem: on an Alpha, long is 64 bits. pointed out
         by DS. impact: address lookups produced incorrect results on an
	 Alpha; qmail-makectl and qmail-remote failed. fix: replaced
	 sizeof(long) with 4 in dns.c.
19960227 portability problem: on an Alpha, bzero() is declared properly
         via sys/time.h. impact: couldn't compile on an Alpha. fix:
	 removed bzero() declaration from select.h. tnx DS.
19960227 portability problem: under SCO, sys/file.h is not protected.
         impact: couldn't compile under SCO. fix: include sys/types.h in
	 lock.c. tnx RN.
19960219 change: added some .qmail-list hints to qlist.1.
19960219 change: added +list support to qmail-alias.
19960215 change: added THANKS.
19960212 bug: foo was not initialized in qrelay.c. impact: depends on
         the machine; on some machines, no effect; on other machines,
	 guaranteed core dump. fix: initialized foo. tnx DS.
19960209 qmail 0.72, beta.
19960209 change: qmail-alias now replaces dot, not slash, with colon.
	 also, qmeopen() makes sure that .qmail file is S_IFREG; I hope
	 this doesn't cause portability problems.
19960209 change: added success-reporting procedure to INSTALL.
19960208 change: added VERSION.
19960208 change: added qlist2.
19960208 change: revamped qlist interface. tnx RN.
19960208 change: improved an error message in qlist.c.
19960208 change: added qrelay. added relay section to HOWTO. tnx DS.
19960208 cleanup: included substdio.h in qqtalk.h.
19960207 bug: prioq_delmin() wasn't guaranteeing heap structure on the
         last element. impact: scheduled passes could have been delayed,
	 conceivably as long as half an hour. fix: prioq_delmin() now
	 checks when it can safely move the last element.
19960207 change: added maildirmake.1, maildir2mbox.1.
19960206 change: revised logo paragraph in THOUGHTS.
19960206 change: replaced nowhere.org with nowhere.mil in examples.
         nowhere.org is a real domain... [sigh]
19960206 change: added qreceipt.1.
19960206 portability problem: IRIX doesn't have vfork. pointed out by
         DS. impact: couldn't compile under IRIX. fix: added fork.h,
	 tryvfork.c.
19960206 portability problem: IRIX doesn't have ranlib. pointed out by
         DS. impact: couldn't compile under IRIX. fix: added IRIX
	 section in make-cmds.sh.
19960205 cleanup: removed warning from substdio_copy() documentation; in
         fact, substdio_copy() can be used safely on a fed substdio.
19960205 change: added qbiff.1.
19960204 change: implemented localnet. removed relevant paragraph from
         THOUGHTS. tnx IS.
19960204 change: in qmail-remote.8, explained the dangers of smarthost.
         tnx IS.
19960204 change: implemented virtualdomains wildcards. tnx JLH.
19960203 change: qmail-send now handles virtualdomains _after_ locals.
         updated INSTALL.qsmhook appropriately.
19960203 change: added note to INSTALL.alias about ~ftp, ~www, ~uucp
         being owned by root.
19960130 cleanup: in qlist.c, renamed flagremoved as flagwasthere.
19960130 bug: qmail-send did not pay attention to flagexitasap in
         pass_dochan(). impact: qmail-send would happily start new
	 deliveries even if it wanted to exit. fix: qmail-send now
	 returns immediately in pass_selprep() and pass_dochan() if
	 flagexitasap.
19960130 change: in qlist.c and qlist.1, renamed ext as list.
19960130 change: in qlist.c and qlist.1, renamed manager as owner.
19960129 qmail 0.71, beta.
19960129 change: mentioned djb-qmailbeta in README. tnx MWE.
19960129 change: added a note to INSTALL.mbox making clear that
         Mailbox is in mbox format. tnx MWE.
19960129 change: qlist now warns you if it didn't see any cmds. tnx RN.
19960129 change: incorporated qlist patch from RN to refuse double subs. 
19960129 change: added qlist.1, contributed by RN. mangled it a bit.
19960129 bug: comment was not allowed in ``phrase (comment) <route>'';
         pointed out by RN. impact: some correct address lists could be
	 mis-parsed by qmail-inject or qlist. fix: token.c now allows
	 TOKEN_COMMENT in the appropriate scan.
19960128 change: added a logo paragraph to THOUGHTS.
19960127 change: implemented rcpthosts.
19960127 change: split up some uses of putflush in qmail-remote,
	 qmail-smtpd, spawn.c. eliminated NODELAY and corresponding
	 paragraph in THOUGHTS.
19960127 change: added quote2(). used it in qmail-alias, qmail-send,
         qreceipt. now addresses are properly quoted in the From, To,
	 and internal Return-Path of bounces; the From and To of
	 receipts; and the Return-Path/RPLINE of delivered messages.
	 removed relevant paragraph from THOUGHTS.
19960127 change: in RFCLOOPS, documented fact that Delivered-To address
         is conventionally not quoted.
19960127 change: knocked default SMTP timeouts down to 20 minutes.
19960127 change: added INSTALL.ids. tnx RN.
19960127 change: in INSTALL, noted that nogroup should already exist.
19960127 bug: pass_selprep checked pqchan[c] even if pass[c].id. impact:
	 qmail-send wasted CPU time whenever more than one message was
	 waiting on a blocked channel. fix: pass_selprep now checks
	 !pass[c].id.
19960127 bug: programs invoked from qmail-alias were immune to SIGPIPE.
         impact: a delivery pipeline such as |yes|head -1000 would loop
	 forever, since yes does not check for write errors. fix: added
	 signal_uninit(). used it before execvp in qmail-alias. [sigh]
19960127 cleanup: added date822fmt.c. used it in newfield.c, qmail-queue.
19960127 cleanup: added fmt_uint0.c. used it in myctime.c, newfield.c,
         qmail-queue.
19960127 cleanup: added dnsdoe.c. used it in dnscname, dnsfq, dnsip,
         dnsmxip, dnsptr.
19960127 cleanup: eliminated temp from dnsfq.c.
19960127 bug: gen_allocdefs was making assumptions incompatible with the
         alloc_re interface. impact: qmail-send would dump core if you
	 ran out of memory. fix: changed alloc_re interface.
19960126 portability problem: some versions of Linux don't have
         net/route.h. pointed out by RN. impact: couldn't compile under
	 those versions. fix: ipme.c no longer includes net/route.h;
	 hopefully this won't cause new portability problems.
19960126 change: added chmod instructions to INSTALL and INSTALL.alias.
         tnx RN.
19960126 change: INSTALL now refers to the traditional sendmail spot
         (/usr/lib), not the BSD 4.4 spot (/usr/sbin). tnx RN.
19960126 change: make auto-uids.h now creates auto-uids.h.tmp first.
	 thus, if someone disobeys the installation instructions, and
	 his make fails to remove targets upon error, he'll still be
	 okay. tnx RN.
19960126 change: added forgeries.7.
19960125 cleanup: eliminated flagverbose, flagmetoo in sendmail.
19960125 cleanup: added substdio_copy.c. used it at several spots.
19960125 cleanup: added constmap.c. qmail-send now uses constmap for
         locals and virtualdomains. this will speed things up: no
	 problem now to have thousands of virtual domains. removed
	 relevant paragraph from THOUGHTS.
19960125 change: added linux section in find-systype. this will affect
         linux-* systypes. tnx RN for relevant info.
19960124 change: added -od, -oe, -p, -f to sendmail. the need for
         these was pointed out by TN.
19960124 bug: qmail-smtpd was reading from descriptor 1. impact: none;
         in normal use, both 0 and 1 point to the network. fix: changed
	 1 to 0.
19960124 bug: qmail-alias treated any .qmail open failure as permanent.
         impact: if a .qmail file was temporarily unopenable (e.g.,
	 because of NFS), it was incorrectly ignored. fix: qmail-alias
	 now dies QLX_SOFT on any open failure other than ENOENT.
19960124 change: added freebsd section in find-systype, same as bsd.os
         section. this will affect freebsd-* systypes.
19960124 cleanup: find-systype now immediately converts sys to lowercase.
19960124 change: qmail-setup now copies man pages into /var/qmail/man;
         qmail-check checks /var/qmail/man. using .0 style, which might
	 cause trouble on various machines, but better than not trying.
19960124 change: in qmail-remote.c, changed perm_control to temp_control
         (and D to Z, thanks); thus failure to read control files (e.g.,
	 because of permissions) is now a temporary error.
19960124 bug: in qmail-remote.c, temp_chdir() used D, not Z. impact: if
         chdir() to CONF_HOME failed (e.g., because of NFS), message
	 would be bounced. fix: changed D to Z.
19960124 change: reorganized README.
19960124 portability problem: Linux has the fifo kernel bug that I had
         hoped I'd never run into. impact: messages under Linux (and any
	 other systems with this bug) were picked up only in sweeps, not
	 instantly. fix: triggerpull.c now writes a byte (non-blocking)
	 to the fifo. updated INTERNALS accordingly.
19960124 bug: in qmail-remote.c, if quit() saw a remote write error, it
         would call writeerr() even though a message report had already
	 been produced. impact: the mess report would include an extra
	 ``ZConnected but communications failed,'' which was confusing
	 to humans. fix: quit() now simply skips the wait-for-QUIT
	 smtpcode() upon write error.
19960124 portability problem: Linux does not have SIGSYS or SIGEMT.
         impact: couldn't compile under Linux. fix: added appropriate
	 ifdefs in signal.c.
19960124 qmail 0.70, beta.
