This file contains all changes to patch and documentation since first version 
was posted via google groups to comp.mail.sendmail on oct 14, 2004

That was internally revision 5

Changelog follows below:
==============================================================
V11 -- February 28, 2005 Ninth documented revision. Released

* Fix an issue where senmail could segfault if writing macros
  to a milter caused a sigpipe before the EOB milter command.

* _FFR_MILTER_RCPT_DEL changes the way recipient rejected by
  milters are removed from the delivery list. This causes 
  sendmail to free the address entry and remove it from the 
  chain of recipients, instead of marking it removed.

* Work on milter_rcpt_error portion of patch, which is still a
  mess of gotos.

* New milter ruleset flag O which means cOntinue to next 
  ruleset. Use this to set flag S but continue to proccess 
  the next ruleset.
  
  If there are no more rulesets, the ruleset proccessing 
  terminates as if successfull and milter handling continues 
  as normal.

  Usefull if you want to prevent rejections but still handle 
  the recipient, so for example you would flag the ruleset as
  'SNO'. This presumes the milter will do something usefull
  in addition to attempting to reject the email.

  Also conceivably usefull if you want the ruleset to do
  something and want to ensure that it has no other effect
  on milter proccessing. You would flag it as 'O' and the next
  ruleset as 'C'.

* Mailers selected by rulesets are now case insesitive.

* Fixes to rcpt handling include changing the order of 
  setting/unsetting macros and proper counting of badrcpts.

* Fixed issue where milter responses were not listened for again
  after a rewrite request during milter EOB callback stage

* Milters may no longer need to receive an End Of Body command if
  they do not register a callback for it. This is selected by
  compiling sendmail with _FFR_MILTER_NOEOB

* Milters may be send an abort message early on during the data
  phase of the message if they have no callbacks registered for
  the message body. Turn this on by compiling sendmail with
  _FFR_MILTER_NOEOB and _FFR_MILTER_NOBODY_EARLY

* Some small code flow and comment changes. Added some gotos.
  
==============================================================
V10a -- December 16, 2004 Eighth documented revision. Released

* Recreate patch against 8.13.2

==============================================================
V10 -- December 14, 2004 Seventh documented revision. Released

* As a suggestion, one sure way of leaving the workspace as is
  from a ruleset is to use the macro map usualy named storage
  and store the ruleset's input there. Pop it out before returning.

  Something like this:

  R$*		$: $(storage {ruleset_X_args} $@ $1 $) $1
  R$*		$: $>Canonify $1
  ......
  R$*		$: $&{ruleset_X_args}
  R$*		$: $(storage {ruleset_X_args} $@ $) $1
  R$*		$@ $1

* New milter ruleset flag C. This flag ensures that the ruleset
  gets a "clean slate" workspace. This is only needed following
  rulesets which use either R or W ruleset flags.

* New milter ruleset flag W. This flag uses the workspace output
  of one ruleset as the input to the next ruleset for the milter
  cmd state. The workspace is NOT sent to the milter (unless 
  followed by a ruleset with R flagged).

* New and updated debug output statements.

* Properly intialize ruleset flags, fixing several problems.

============================================================
V9 -- December 09, 2004 Sixth documented revision. Released

* Big bug fix! Handling of milter rcpt errors was flawed in that
  rcpts that a milter rejected were delivered to anyway if the
  smtp session continued successfully (there was a valid rcpt).

  Compiling with -D_FFR_MILTER_RCPT_ERROR undefined in all previous
  versions would likely still exhibit the same bug.

  This version contains a tag and sweep so that rcpts the milter
  rejects are treated as if the milter called smfi_delrcpt().

  (This bug is here because the milter call is placed after
  sendmail does nearly everything else on the recipient, including
  saving it in the list of recipients. There is no other way to 
  either avoid sending error'd recipients to milter or to mark
  error'd recipients as such when sending them to the milter.)

  Included in the patch tarball is the diff between v8-v9 which
  contains this fix only. It should apply clean to previous versions.
  

============================================================
V8 -- December 07, 2004 Fifth documented revision. Released

* Tracelevel 72-75 categories and debugging statements added.
  (more probably needed)

* Beware! Rulesets for Milter Connect should not touch any input past
  the first $| because that includes binary data. Passing it into the RHS 
  is asking for SYSERR messages.
 
* The macro milter_name is now defined to the configured name of the 
  milter during calls to rulesets for both the rwsets and rewrite features.

* Milter ruleset flag N has been added. This effectively negates the 
  result of the ruleset on the milter action. So if the milter ruleset
  does not resolve to one of the mailers then it is as if it resolved 
  to $#discard. If the milter ruleset resolved to one of the mailers, 
  its as if it did not.

  As a special case, if the milter ruleset resolves to $#relay 
  its as if it resolved to $#abort

* Changes in V7.a have been abandoned. Currently access to maps and classes
  should be provided to milters by way of ruleset rewrite calls.

============================================================
V7.a -- October 2?, 2004 Fourth documented revision. Unreleased -- Abandoned

* -D_FFR_MILTER_SM_MAP enables compiling into sendmail/libmilter
 and milters support for milters to lookup values in sendmail maps.

 smfi_getmapvals() and smfi_vgetmapvals() are introduced by this.

 Milters must have the M flag and sendmail.mc needs this line
 define(`confMILTER_SM_MAP')dnl 
 in order to allow a milter to use this functionality.

 A ruleset to reject/rewrite/permit map access may be defined by this
 line in semdail.mc
 define(`confMILTER_SM_MAP_RULESET', `rulesetname')dnl
 The named ruleset will be passed
 mapname $| miltername

 The behavior of the ruleset is as documented for the smfi_rewrite()
 feature. If it does not exist all map accesses are allowed.
=========================================================
V7 -- November 15, 2004 Third documented version. Released.
==========================================================
V7 -- October 20, 2004 Third documented version. Unreleased.

* Updated _FFR_ definitions for printing on -d1

* _FFR_MILTER_MACROS_NOEMPTY no longer pre-set
  When compiling sendmail with -D_FFR_MILTER_MACROS_NOEMPTY sendmail
  will not send the macros command to the milter if there are no macros
  to send.

* _FFR_MILTER_RCPT_ERROR not defined by default. 
  This means that after patching and recompiling sendmail 
  WITHOUT -D_FFR_MILTER_RCPT_ERROR sendmail's behavior will be 
  different and will no longer send to Milters recipients who 
  are undeliverable.

  I suspect most people would consider this a more reasonable
  approach.

* Previous documentation did not make clear that SMFIF_TRYREJECTS 
  will still not receive a ABORT command once in eom() stage.

  So data can be freed by first reject or by abort or by eom or by close.

  If the milter wants the data back again after unsuccessfull reject a workable
  solution may be to store or mark the data in such a way as it can be detected 
  and free upon a new message start or abort command or by connection close.

* Previous EAGAIN documentation left out that the EAGAIN feature includes 
  a new timeout 'G'.

===============================================
V6 -- October 19, 2004 Second documented version. Released.

* Milter ruleset configuration now takes optional flags between like this:
	R=R:FRS:RcptRuleset
  This form is optional. R=R:RcptRuleSet will be parsed as no flags.

  These are the supported flags for milter rulesets:
	U -- When processing rulesets do not strip ($#<mailer>,$@<host>,$:) from ruleset 
	     workspace results.
	     This only applies when any rewriting/replacing of workspace is done.
	F -- Opposite of above. Current default.
	R -- Replace workspace with rewrite results. Processes resulting workspace in accordance
	     with the U or F flags. In all cases, if this flag is specified, this will be the 
	     workspace handed to any rulesets later defined for this milter cmd stage. 

	     When an (internally) marked safe ruleset definition is encountered, the data passed
	     to the milter will be replaced by this rulesets workspace. 

	S -- Spike rejections. If this ruleset results in filtering this command from the milter,
	     the milter will be prevented from causing a rejection or discard of the email. 
	     
	     This needs to be turned on by compiling sendmail with -D_FFR_MILTER_RWSETS_SPIKE
	     Without this, the flag will be accepted and be a noop.

* smfi_rewrite() has been modified to take an additional argument for options.

  Options are OR'd together and include:
  	SMFRS_UNFILTER -- produces the same behavior as 
	                  milter ruleset flag 'U'.
	SMFRS_CONDELSE -- MTA should not process $| as a string seperator in the
	                  results it sends back to the milter.

* smfi_vrewrite() has been added.

  This function takes a variable number of not NULL arguments of pointer to char(strings).
  It then calls smfi_rewrite after processing them. For all other purposes, this is identical to
  smfi_rewrite()

  The first not NULL argument will terminate proccessing of the list of arguments.
  So dont do that.

* SMFIF_TRYREJECT has been added. 

  This is an additional milter flag to be OR'd into smfi.xxxFlags.
  This will cause the milter to negotiate the following behavior from sendmail.
  
  Normally a milter that tells the MTA to reject or tempfail a message does not expect 
  any additional processing for that message, except for the xxxrcpt.

  With this flag set, should the MTA refuse to process the rejection/tempfail, the milter 
  has indicated that it still wishes to continue proccessing the message. This is designed 
  to work with behavior caused by the milter ruleset flag 'S'. This is a departure from 
  current milter protocol.

  A milter that sets this flag must be prepared to continue processing a message that it has
  already rejected. It should not expect to continue processing the message. All message resources
  should be set to secondary pending reject status at the point of sending a rejection. 
  
  The MTA should send an abort (or close) if the rejection was successfull. This is a departure 
  from previous protocol behavior. At this point the rejected resources should be free'd 
  and marked NULL.

  If the MTA continues with current message, the milter may choose to reinstate the rejected data.

  To enable this, libmilter and the milter must be recompiled with -D_FFR_MILTER_RWSETS_SPIKE

* Fixed typo in smfi_getmaxdatasize()
  Interaction still untested.

* Paranoia checks (somewhat messy) that should keep milter_envrcpt well fed in the event of
  error rcpts being sent to it courtesy of _FFR_MILTER_RCPT_ERROR and _FFR_MILTER_RCPT_ERROR_ALL
 
* Interaction with -D_FFR_MILTER_NOHDR_RESP is not well tested.

================================================
V5 -- October 13, 2004 First documented version. Released.

* macro command is not sent to the milter if there are no macros to send.
