diff options
| -rw-r--r-- | maildir/maildircreate.c | 23 | ||||
| -rw-r--r-- | maildir/maildircreate.h | 1 | ||||
| -rw-r--r-- | maildrop/maildir.C | 36 | ||||
| -rw-r--r-- | maildrop/maildropfilter.sgml | 2200 | ||||
| -rw-r--r-- | maildrop/testsuite.in | 20 | ||||
| -rw-r--r-- | maildrop/testsuite2 | 1 | 
6 files changed, 1190 insertions, 1091 deletions
| diff --git a/maildir/maildircreate.c b/maildir/maildircreate.c index 5efc0af..b0c8e01 100644 --- a/maildir/maildircreate.c +++ b/maildir/maildircreate.c @@ -178,10 +178,26 @@ static int maildir_tmpcreate_fd_do(struct maildir_tmpcreate_info *info)  	if (info->newname)  		free(info->newname); +	info->newname=NULL; + +	if (info->curname) +		free(info->curname); +	info->curname=NULL;  	info->newname=malloc(strlen(info->tmpname)+strlen(ino_buf)+  			     strlen(dev_buf)+3); +	if (info->newname) +	{ +		info->curname=malloc(strlen(info->tmpname)+strlen(ino_buf)+ +				     strlen(dev_buf)+3); +		if (!info->curname) +		{ +			free(info->newname); +			info->newname=NULL; +		} +	} +  	if (!info->newname)  	{  		maildir_tmpcreate_free(info); @@ -209,6 +225,9 @@ static int maildir_tmpcreate_fd_do(struct maildir_tmpcreate_info *info)  	strcat(info->newname, hostname);  	strcat(info->newname, len_buf); +	strcpy(info->curname, info->newname); +	memcpy(info->curname + strlen(maildir)+1, "cur", 3); +  	return fd;  } @@ -221,6 +240,10 @@ void maildir_tmpcreate_free(struct maildir_tmpcreate_info *info)  	if (info->newname)  		free(info->newname);  	info->newname=NULL; + +	if (info->curname) +		free(info->curname); +	info->curname=NULL;  }  int maildir_movetmpnew(const char *tmpname, const char *newname) diff --git a/maildir/maildircreate.h b/maildir/maildircreate.h index 8539145..3881e77 100644 --- a/maildir/maildircreate.h +++ b/maildir/maildircreate.h @@ -28,6 +28,7 @@ struct maildir_tmpcreate_info {  	int doordie;		/* Loop until we get it right. */  	char *tmpname;	/* On exit, filename in tmp */  	char *newname; /* On exit, filename in new */ +	char *curname; /* On exit, filename in cur */  };  #define maildir_tmpcreate_init(i) \ diff --git a/maildrop/maildir.C b/maildrop/maildir.C index a1d88ed..926b9d6 100644 --- a/maildrop/maildir.C +++ b/maildrop/maildir.C @@ -130,9 +130,43 @@ static long	counter=0;  		if (f >= 0)  		{ +			Buffer b; + +			b="FLAGS"; + +			const char *flags=GetVarStr(b); +  			tmpname=createInfo.tmpname; -			newname=createInfo.newname;  			tmpname += '\0'; + +			if (flags) +			{ +				const char *p=flags; + +				while (*p) +				{ +					if (strchr("DRSF", *p) == NULL) +					{ +						f=0; +						break; +					} +					++p; +				} +			} + +			if (flags && *flags) +			{ +				newname=createInfo.curname; +				newname += ':'; +				newname += '2'; +				newname += ','; +				newname += flags; +			} +			else +			{ +				newname=createInfo.newname; +			} +  			newname += '\0';  			maildir_tmpcreate_free(&createInfo); diff --git a/maildrop/maildropfilter.sgml b/maildrop/maildropfilter.sgml index 9464cc7..4d91abc 100644 --- a/maildrop/maildropfilter.sgml +++ b/maildrop/maildropfilter.sgml @@ -18,10 +18,10 @@    <refsynopsisdiv>      <informalexample>        <simpara> -<filename>@withetcdir@/maildroprc</filename>, -<filename>$HOME/.mailfilter</filename>, -<filename>$HOME/.mailfilters/*</filename>, and friends... -</simpara> +	<filename>@withetcdir@/maildroprc</filename>, +	<filename>$HOME/.mailfilter</filename>, +	<filename>$HOME/.mailfilters/*</filename>, and friends... +      </simpara>      </informalexample>    </refsynopsisdiv> @@ -29,196 +29,196 @@      <title>DESCRIPTION</title>      <para> -This manual page describes the language used by <command>maildrop</command> -to filter E-mail messages. -The mail filtering instructions are read from a file. +      This manual page describes the language used by <command>maildrop</command> +      to filter E-mail messages. +      The mail filtering instructions are read from a file. -The language is loosely structured, it is based on pattern -matching. The language has a distinct lexical and syntactical structure, -very similar to Perl's, but it is important to note that it is not Perl, -and is very different from Perl, in certain cases.</para> +      The language is loosely structured, it is based on pattern +      matching. The language has a distinct lexical and syntactical structure, +      very similar to Perl's, but it is important to note that it is not Perl, +      and is very different from Perl, in certain cases.</para>      <para> -If the filtering instructions do not exist, -<command>maildrop</command> delivers the -message to the default mailbox without doing any additional processing, -making it indistinguishable from the usual mail delivery agent.</para> +      If the filtering instructions do not exist, +      <command>maildrop</command> delivers the +      message to the default mailbox without doing any additional processing, +      making it indistinguishable from the usual mail delivery agent.</para>      <para> -It is important to note that <command>maildrop</command> reads and parses the -<systemitem class="resource">filter file</systemitem> before doing anything. If there are any errors -<command>maildrop</command> prints an error message, and terminates with the exit code -set to <errorcode>EX_TEMPFAIL</errorcode>. A compliant mail transport agent -should -re-queue the message for a later delivery attempt. Hopefully, most simple -syntax errors will not cause mail to be bounced back if the error is caught -and fixed quickly.</para> +      It is important to note that <command>maildrop</command> reads and parses the +      <systemitem class="resource">filter file</systemitem> before doing anything. If there are any errors +      <command>maildrop</command> prints an error message, and terminates with the exit code +      set to <errorcode>EX_TEMPFAIL</errorcode>. A compliant mail transport agent +      should +      re-queue the message for a later delivery attempt. Hopefully, most simple +      syntax errors will not cause mail to be bounced back if the error is caught +      and fixed quickly.</para>      <refsect2>        <title>Environment</title>        <para> -<anchor id="environment"/> - -<command>maildrop</command> uses variables to access and manipulate messages. -Variables -are arbitrary text accessed by referring to the name of the variable, such as -<varname>HOME</varname>, or <varname>DEFAULT</varname>. -Text is placed into a variable by -using an assignment statement, such as: -</para> +	<anchor id="environment"/> + +	<command>maildrop</command> uses variables to access and manipulate messages. +	Variables +	are arbitrary text accessed by referring to the name of the variable, such as +	<varname>HOME</varname>, or <varname>DEFAULT</varname>. +	Text is placed into a variable by +	using an assignment statement, such as: +      </para>        <blockquote>  	<informalexample> -	  <programlisting format="linespecific"> +	  <programlisting>  FILE="IN.junk" -</programlisting> +	  </programlisting>  	</informalexample>        </blockquote>        <para> -This statement puts the text "IN.junk" (without the quotes) into a variable -whose name is <varname>FILE</varname>. -Later, the contents of a variable are accessed by using -the $ symbol and the name for the variable. For example:</para> +	This statement puts the text "IN.junk" (without the quotes) into a variable +	whose name is <varname>FILE</varname>. +	Later, the contents of a variable are accessed by using +	the $ symbol and the name for the variable. For example:</para> -<blockquote> -	  <informalexample> -	    <programlisting format="linespecific"> +      <blockquote> +	<informalexample> +	  <programlisting>  to $FILE -</programlisting> -	  </informalexample> -	</blockquote> +	  </programlisting> +	</informalexample> +      </blockquote>        <para> -This will deliver the current message to the mailbox file (or a maildir -directory) named "IN.junk".</para> +	This will deliver the current message to the mailbox file (or a maildir +	directory) named "IN.junk".</para>        <para> -<command>maildrop</command> initially creates variables from the environment -variables -of the operating system, UNLESS <command>maildrop</command> runs in delivery mode. -Each -operating system environment variable becomes a <command>maildrop</command> -variable. -When running in delivery mode, <command>maildrop</command> does not import the -environment for security reasons, -except for the environment variables that define the process locale -(<varname>LANG</varname>, -<varname>LANGUAGE</varname>, and -<varname>LC_<replaceable>*</replaceable></varname>), which are still imported. +	<command>maildrop</command> initially creates variables from the environment +	variables +	of the operating system, UNLESS <command>maildrop</command> runs in delivery mode. +	Each +	operating system environment variable becomes a <command>maildrop</command> +	variable. +	When running in delivery mode, <command>maildrop</command> does not import the +	environment for security reasons, +	except for the environment variables that define the process locale +	(<varname>LANG</varname>, +	<varname>LANGUAGE</varname>, and +	<varname>LC_<replaceable>*</replaceable></varname>), which are still imported.        </para>        <para> -In all cases <command>maildrop</command> resets the -following variables to their default values: <varname>HOME</varname>, -<varname>DEFAULT</varname>, <varname>SHELL</varname>, -<varname>PATH</varname>, <varname>LOCKEXT</varname>, -<varname>LOCKREFRESH</varname>, <varname>LOCKSLEEP</varname>, -<varname>LOCKTIMEOUT</varname>, <varname>MAILDIRQUOTA</varname>, -<varname>SENDMAIL</varname> and <varname>LOGNAME</varname>.</para> +	In all cases <command>maildrop</command> resets the +	following variables to their default values: <varname>HOME</varname>, +	<varname>DEFAULT</varname>, <varname>SHELL</varname>, +	<varname>PATH</varname>, <varname>LOCKEXT</varname>, +	<varname>LOCKREFRESH</varname>, <varname>LOCKSLEEP</varname>, +	<varname>LOCKTIMEOUT</varname>, <varname>MAILDIRQUOTA</varname>, +	<varname>SENDMAIL</varname> and <varname>LOGNAME</varname>.</para>        <para> -There's one exception to this rule which applies to the version of -<command>maildrop</command> that comes with the -<ulink url="http://www.courier-mta.org/"><application>Courier</application> mail server</ulink>.  The following -does not apply to the standalone version of <command>maildrop</command>: -when running in -delivery mode, if the <option>-d</option> flag was not used, or if it specifies -the same userid as the one that's running <command>maildrop</command>: -the following -variables are automatically imported from the environment: <varname>HOME</varname>, <varname>SHELL</varname>, -<varname>LOGNAME</varname> and <varname>MAILDIRQUOTA</varname>. -These environment variables are -initialized by the <application>Courier</application> -mail server prior to running <command>maildrop</command>. -Additionally, the -initial value for the <varname>DEFAULT</varname> maildrop variable is imported from -the <varname>MAILDROPDEFAULT</varname> environment variable. This is because -the <application>Courier</application> mail server overloads the -DEFAULT environment variable to store the defaulted -portion of the local mailbox address. See the <ulink url="dot-courier.html"><citerefentry><refentrytitle>dot-courier</refentrytitle><manvolnum>5</manvolnum></citerefentry></ulink> man page in the -<application>Courier</application> mail server -distribution. You can get the <application>Courier</application> -mail server's <varname>DEFAULT</varname> value by -using the -<command>import</command> command. -Note, however, that this will clobber the old -contents of <varname>DEFAULT</varname>, which is probably not what you want. -The right way to do this would be something like this:</para> +	There's one exception to this rule which applies to the version of +	<command>maildrop</command> that comes with the +	<ulink url="http://www.courier-mta.org/"><application>Courier</application> mail server</ulink>.  The following +	does not apply to the standalone version of <command>maildrop</command>: +	when running in +	delivery mode, if the <option>-d</option> flag was not used, or if it specifies +	the same userid as the one that's running <command>maildrop</command>: +	the following +	variables are automatically imported from the environment: <varname>HOME</varname>, <varname>SHELL</varname>, +	<varname>LOGNAME</varname> and <varname>MAILDIRQUOTA</varname>. +	These environment variables are +	initialized by the <application>Courier</application> +	mail server prior to running <command>maildrop</command>. +	Additionally, the +	initial value for the <varname>DEFAULT</varname> maildrop variable is imported from +	the <varname>MAILDROPDEFAULT</varname> environment variable. This is because +	the <application>Courier</application> mail server overloads the +	DEFAULT environment variable to store the defaulted +	portion of the local mailbox address. See the <ulink url="dot-courier.html"><citerefentry><refentrytitle>dot-courier</refentrytitle><manvolnum>5</manvolnum></citerefentry></ulink> man page in the +	<application>Courier</application> mail server +	distribution. You can get the <application>Courier</application> +	mail server's <varname>DEFAULT</varname> value by +	using the +	<command>import</command> command. +	Note, however, that this will clobber the old +	contents of <varname>DEFAULT</varname>, which is probably not what you want. +	The right way to do this would be something like this:</para>        <blockquote>  	<informalexample> -	  <programlisting format="linespecific"> +	  <programlisting>  SAVEDEFAULT=$DEFAULT  import DEFAULT  LOCALDEFAULT=$DEFAULT  DEFAULT=$SAVEDEFAULT -</programlisting> +	  </programlisting>  	</informalexample>        </blockquote>        <para>All internal variables are exported back as environment variables when -<command>maildrop</command> runs an external command. Changes to internal variables, made -by the <systemitem class="resource">filter file</systemitem>, are reflected in the exported environment.</para> +	<command>maildrop</command> runs an external command. Changes to internal variables, made +	by the <systemitem class="resource">filter file</systemitem>, are reflected in the exported environment.</para>      </refsect2>      <refsect2>        <title>Lexical structure</title>        <para> -Most whitespace is generally ignored. The <token>#</token> -character introduces a comment -running to the end of the line, which is also ignored. Unlike other mail -filters, <command>maildrop</command> parses the -<systemitem class="resource">filter file</systemitem> before taking any action -with the message. -If there are syntax errors in the file, <command>maildrop</command> displays -an error message, and returns <errorcode>EX_TEMPFAIL</errorcode>. That should -cause the -mail message to remain in the queue, and, hopefully allow the problem to be -corrected, without bouncing any mail.</para> +	Most whitespace is generally ignored. The <token>#</token> +	character introduces a comment +	running to the end of the line, which is also ignored. Unlike other mail +	filters, <command>maildrop</command> parses the +	<systemitem class="resource">filter file</systemitem> before taking any action +	with the message. +	If there are syntax errors in the file, <command>maildrop</command> displays +	an error message, and returns <errorcode>EX_TEMPFAIL</errorcode>. That should +	cause the +	mail message to remain in the queue, and, hopefully allow the problem to be +	corrected, without bouncing any mail.</para>        <note>  	<para> -In <command>maildrop</command>, the end of line is a lexical token. In order to -continue a long statement on the next line, terminate the line with a -backslash character.</para></note> +	  In <command>maildrop</command>, the end of line is a lexical token. In order to +	  continue a long statement on the next line, terminate the line with a +	  backslash character.</para></note>      </refsect2>      <refsect2>        <title>Literal text</title>        <para> -Literal text in the <command>maildrop</command> filtering language is -surrounded by -either single or double quotes. In order to enter a single quote into a text -literal surrounded by single quotes, or a double quote into a literal -surrounded by double quotes, prefix it with a backslash character. Use two -backslash characters characters to enter one backslash character in the text -literal.</para> +	Literal text in the <command>maildrop</command> filtering language is +	surrounded by +	either single or double quotes. In order to enter a single quote into a text +	literal surrounded by single quotes, or a double quote into a literal +	surrounded by double quotes, prefix it with a backslash character. Use two +	backslash characters characters to enter one backslash character in the text +	literal.</para>        <note>  	<para>A backslash followed by either a backslash, or a matching quote, is -the only situation where the backslash character is actually removed, leaving -only the following character in the actual text literal. If a backslash -character is followed by any other character, the backslash is NOT -removed.</para> +	  the only situation where the backslash character is actually removed, leaving +	  only the following character in the actual text literal. If a backslash +	  character is followed by any other character, the backslash is NOT +	  removed.</para>        </note>        <para>Multiple text literals in a row are automatically concatenated, even if -they use different quotes. For example:</para> +	they use different quotes. For example:</para>        <blockquote>  	<informalexample> -	  <programlisting format="linespecific"> +	  <programlisting>  FOOBAR="Foo"'bar'  SAVEDEFAULT=$DEFAULT  import DEFAULT  LOCALDEFAULT=$DEFAULT  DEFAULT=$SAVEDEFAULT -</programlisting> +	  </programlisting>  	</informalexample>        </blockquote>        <para> -This sets the variable <varname>FOOBAR</varname> to the text "Foobar". -</para> +	This sets the variable <varname>FOOBAR</varname> to the text "Foobar". +      </para>      </refsect2> @@ -227,57 +227,57 @@ This sets the variable <varname>FOOBAR</varname> to the text "Foobar".        <title>Variable substitution</title>        <para> -<anchor id="varsubst"/> +	<anchor id="varsubst"/> -Variable substitution is performed on text literals that's surrounded by -double quotation marks. The "<token>$</token>" character, followed by a variable name, -is replaced by that variable's contents. -</para> +	Variable substitution is performed on text literals that's surrounded by +	double quotation marks. The "<token>$</token>" character, followed by a variable name, +	is replaced by that variable's contents. +      </para>        <blockquote>  	<informalexample> -	  <programlisting format="linespecific"> +	  <programlisting>  MAILBOX="$HOME/Mailbox" -</programlisting> +	  </programlisting>  	</informalexample>        </blockquote>        <para> -This sets the variable <varname>MAILBOX</varname> to the contents of the -variable -<varname>HOME</varname> followed by <literal>"/Mailbox"</literal>. -Variable names must begin with an -uppercase letter, a lowercase letter, or an underscore. -Following that, all -letters, digits, and underscores are taken as a variable name, and its -contents replace the <token>$</token> sign, and the variable name. It is possible to access -variables whose name includes other characters, by using braces as -follows:</para> +	This sets the variable <varname>MAILBOX</varname> to the contents of the +	variable +	<varname>HOME</varname> followed by <literal>"/Mailbox"</literal>. +	Variable names must begin with an +	uppercase letter, a lowercase letter, or an underscore. +	Following that, all +	letters, digits, and underscores are taken as a variable name, and its +	contents replace the <token>$</token> sign, and the variable name. It is possible to access +	variables whose name includes other characters, by using braces as +	follows:</para>        <blockquote>  	<informalexample> -	  <programlisting format="linespecific"> +	  <programlisting>  MAILBOX="${HOME-WORD}/Mailbox" -</programlisting> +	  </programlisting>  	</informalexample>        </blockquote>        <para> -Inserts the contents of the <varname>HOME-WORD</varname> variable. If the -variable -does not exist, the empty text literal is used to replace the variable name. -It is not possible to access variables whose names include the <token>}</token> -character.</para> +	Inserts the contents of the <varname>HOME-WORD</varname> variable. If the +	variable +	does not exist, the empty text literal is used to replace the variable name. +	It is not possible to access variables whose names include the <token>}</token> +	character.</para>        <para>If the <token>$</token> character is not followed by a left brace, letter, or an -underscore, the <token>$</token> character remains unmolested in the text literal. A -backslash followed by the <token>$</token> character results in a <token>$</token> character in the text -literal, without doing any variable substitution.</para> +	underscore, the <token>$</token> character remains unmolested in the text literal. A +	backslash followed by the <token>$</token> character results in a <token>$</token> character in the text +	literal, without doing any variable substitution.</para>        <para> -Variable substitution is not done in text literals which are surrounded by -single quotes (apostrophes).</para> +	Variable substitution is not done in text literals which are surrounded by +	single quotes (apostrophes).</para>      </refsect2> @@ -285,151 +285,151 @@ single quotes (apostrophes).</para>        <title>Command line arguments</title>        <para> -<command>maildrop</command> initializes special variables: -<varname>$1</varname>, <varname>$2</varname>, and so on, with -additional parameters specified on the <command>maildrop</command> -command line. A <systemitem class="resource">filter file</systemitem> -may use those variables just like any other variables.</para> +	<command>maildrop</command> initializes special variables: +	<varname>$1</varname>, <varname>$2</varname>, and so on, with +	additional parameters specified on the <command>maildrop</command> +	command line. A <systemitem class="resource">filter file</systemitem> +	may use those variables just like any other variables.</para>      </refsect2>      <refsect2>        <title>Predefined variables</title>        <anchor id="predefined"/>        <para> -The following variables are automatically defined by -<command>maildrop</command>. The -default values for the following variables may be changed by the system -administrator. For security reasons, the values of the following variables -are always reset to their default values, and are never imported from the -environment:</para> +	The following variables are automatically defined by +	<command>maildrop</command>. The +	default values for the following variables may be changed by the system +	administrator. For security reasons, the values of the following variables +	are always reset to their default values, and are never imported from the +	environment:</para>        <variablelist>  	<varlistentry><term><varname>DEFAULT</varname></term><listitem><para>The default mailbox to deliver the message to. -    If the <systemitem class="resource">filter file</systemitem> does not indicate a mailbox to deliver this message -    to, the message is delivered to this mailbox. The default mailbox is -    defined by the system administrator. -     -  </para></listitem></varlistentry> +	      If the <systemitem class="resource">filter file</systemitem> does not indicate a mailbox to deliver this message +	      to, the message is delivered to this mailbox. The default mailbox is +	      defined by the system administrator. + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>FROM</varname></term><listitem><para>Message envelope sender. This is usually the same -    address as what appears in the <literal>From:</literal> header, but may -not be. -    This information may or may not be available to <command>maildrop</command> on your -    system. The message envelope sender is usually specified with the <option>-f</option> -    option to <command>maildrop</command>. If the <option>-f</option> option is not given, <command>maildrop</command> -    looks for the <literal>Return-Path:</literal> header in the message. As the last resort, -    <literal>FROM</literal> defaults to <quote>MAILER-DAEMON</quote>. -    Note that <varname>FROM</varname> may be empty - the message envelope sender is -    empty for bounce messages. -  </para></listitem></varlistentry> +	      address as what appears in the <literal>From:</literal> header, but may +	      not be. +	      This information may or may not be available to <command>maildrop</command> on your +	      system. The message envelope sender is usually specified with the <option>-f</option> +	      option to <command>maildrop</command>. If the <option>-f</option> option is not given, <command>maildrop</command> +	      looks for the <literal>Return-Path:</literal> header in the message. As the last resort, +	      <literal>FROM</literal> defaults to <quote>MAILER-DAEMON</quote>. +	      Note that <varname>FROM</varname> may be empty - the message envelope sender is +	      empty for bounce messages. +	</para></listitem></varlistentry>  	<varlistentry><term><varname>HOME</varname></term><listitem><para>Home directory of the user running -    <command>maildrop</command>. -     -  </para></listitem></varlistentry> +	      <command>maildrop</command>. + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>HOSTNAME</varname></term><listitem><para>Network name of the machine running maildrop. -    Obtained from <citerefentry><refentrytitle>gethostname</refentrytitle><manvolnum>3</manvolnum></citerefentry>. +	      Obtained from <citerefentry><refentrytitle>gethostname</refentrytitle><manvolnum>3</manvolnum></citerefentry>. -  </para></listitem></varlistentry> +	</para></listitem></varlistentry>  	<varlistentry><term><varname>LOCKEXT</varname></term><listitem><para>Extension for dot-lock files (default: <literal>.lock</literal>). -     -  </para></listitem></varlistentry> + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>LOCKREFRESH</varname></term><listitem><para>Refresh interval, in seconds, for dot-locks -    (default: <literal>15</literal>). When <command>maildrop</command> dot-locks a mailbox, <command>maildrop</command> -    tries to refresh the lock periodically in order to keep other programs -    from removing a stale dot-lock. This is only required if a dot-lock -    exists for a prolonged period of time, which should be discouraged -    anyway. -     -  </para></listitem></varlistentry> +	      (default: <literal>15</literal>). When <command>maildrop</command> dot-locks a mailbox, <command>maildrop</command> +	      tries to refresh the lock periodically in order to keep other programs +	      from removing a stale dot-lock. This is only required if a dot-lock +	      exists for a prolonged period of time, which should be discouraged +	      anyway. + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>LOCKSLEEP</varname></term><listitem><para>Number of seconds to wait to try again to -    create a dot-lock file, if one already exists (default: 5). -     -  </para></listitem></varlistentry> +	      create a dot-lock file, if one already exists (default: 5). + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>LOCKTIMEOUT</varname></term><listitem><para>Number of seconds to wait before removing a -    stale dot-lock file (default: <literal>60</literal>). If a dot-lock file still exists after -    <varname>LOCKTIMEOUT</varname> seconds, <command>maildrop</command> assumes that the -    process holding the lock no longer exists, and the dot-lock file can be -    safely removed. After removing the dot-lock file, <command>maildrop</command> waits -    <varname>LOCKSLEEP</varname> seconds before trying to create its own dot-lock -    file, in order to avoid a race condition with another process which is -    also trying to remove the same stale dot-lock, at the same time. -     -  </para></listitem></varlistentry> +	      stale dot-lock file (default: <literal>60</literal>). If a dot-lock file still exists after +	      <varname>LOCKTIMEOUT</varname> seconds, <command>maildrop</command> assumes that the +	      process holding the lock no longer exists, and the dot-lock file can be +	      safely removed. After removing the dot-lock file, <command>maildrop</command> waits +	      <varname>LOCKSLEEP</varname> seconds before trying to create its own dot-lock +	      file, in order to avoid a race condition with another process which is +	      also trying to remove the same stale dot-lock, at the same time. + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>LOGNAME</varname></term><listitem><para>Name of the user to who the message is being -    delivered. -     -  </para></listitem></varlistentry> +	      delivered. + +	</para></listitem></varlistentry>  	<varlistentry>  	  <term><varname>MAILDROP_OLD_REGEXP</varname></term>  	  <listitem>  	    <para> -Revert to using the old legacy pattern matching engine. -Versions of <command>maildrop</command> prior to version 2.0 -(included in the <application>Courier</application> mail server 0.51, -and earlier), used a built-in pattern matching engine, instead of using the -<acronym>PCRE</acronym> -library (see the -<quote><link linkend="patterns">Patterns</link></quote> -section). -<command>maildrop</command> 1.x used a different syntax for patterns, which -is no longer described in this manual page. -The old pattern matching engine is still available, by -setting <varname>MAILDROP_OLD_REGEXP</varname> to <quote>1</quote>. -Setting this variable will use the legacy pattern matching engine for the -rest of the <command>maildrop</command> recipe file.</para> +	      Revert to using the old legacy pattern matching engine. +	      Versions of <command>maildrop</command> prior to version 2.0 +	      (included in the <application>Courier</application> mail server 0.51, +	      and earlier), used a built-in pattern matching engine, instead of using the +	      <acronym>PCRE</acronym> +	      library (see the +	      <quote><link linkend="patterns">Patterns</link></quote> +	      section). +	      <command>maildrop</command> 1.x used a different syntax for patterns, which +	      is no longer described in this manual page. +	      The old pattern matching engine is still available, by +	      setting <varname>MAILDROP_OLD_REGEXP</varname> to <quote>1</quote>. +	      Setting this variable will use the legacy pattern matching engine for the +	      rest of the <command>maildrop</command> recipe file.</para>  	    <para> -The pattern matching engine will be removed completely in a future version -of maildrop. -This setting provides for a transitional period of converting old recipes. -<varname>MAILDROP_OLD_REGEXP</varname> can be set to <quote>1</quote> in -the global <filename>maildroprc</filename> file, then reset to <quote>0</quote> -in each individual <command>maildrop</command> recipe file, after it gets -converted to the new syntax.</para> +	      The pattern matching engine will be removed completely in a future version +	      of maildrop. +	      This setting provides for a transitional period of converting old recipes. +	      <varname>MAILDROP_OLD_REGEXP</varname> can be set to <quote>1</quote> in +	      the global <filename>maildroprc</filename> file, then reset to <quote>0</quote> +	      in each individual <command>maildrop</command> recipe file, after it gets +	      converted to the new syntax.</para>  	  </listitem>  	</varlistentry>  	<varlistentry><term><varname>MAILFILTER</varname></term><listitem><para>This is the name of the original <systemitem class="resource">filter file</systemitem> -    that was given to <command>maildrop</command> on the command line. This is mostly -    useful to <literal>-default</literal> <systemitem class="resource">filter file</systemitem>s, it allows them to -    obtain the <ulink url="maildrop.html#moption">value of the -M option</ulink> -    specified on the command line. -  </para></listitem></varlistentry> +	      that was given to <command>maildrop</command> on the command line. This is mostly +	      useful to <literal>-default</literal> <systemitem class="resource">filter file</systemitem>s, it allows them to +	      obtain the <ulink url="maildrop.html#moption">value of the -M option</ulink> +	      specified on the command line. +	</para></listitem></varlistentry>  	<varlistentry><term><varname>PATH</varname></term><listitem><para>Command execution path. <command>maildrop</command> resets PATH -    to the system default (usually -    <literal>/bin:/usr/bin:/usr/local/bin</literal>). -     -  </para></listitem></varlistentry> +	      to the system default (usually +	      <literal>/bin:/usr/bin:/usr/local/bin</literal>). + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>SENDMAIL</varname></term><listitem><para>The mail delivery agent. -When <command>maildrop</command> is -    instructed to deliver the message to a mailbox whose name begins with the -    ! character, this is interpreted as a request to forward the message. The -    <varname>SENDMAIL</varname> command is executed to forward the message. -     -  </para></listitem></varlistentry> +	      When <command>maildrop</command> is +	      instructed to deliver the message to a mailbox whose name begins with the +	      ! character, this is interpreted as a request to forward the message. The +	      <varname>SENDMAIL</varname> command is executed to forward the message. + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>SHELL</varname></term><listitem><para>The login shell. The shell is used to execute all -    commands invoked by <command>maildrop</command>. -     -  </para></listitem></varlistentry> +	      commands invoked by <command>maildrop</command>. + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>VERBOSE</varname></term><listitem><para>Current Debug level (default: <literal>0</literal>). Setting <varname>VERBOSE</varname> to -    progressive higher values, between 1 and 9, produces debugging output on -    standard error. <command>maildrop</command> ignores -the <varname>VERBOSE</varname> variable in delivery -    mode (in order not to confuse the mail transport agent). -     -  </para></listitem></varlistentry> +	      progressive higher values, between 1 and 9, produces debugging output on +	      standard error. <command>maildrop</command> ignores +	      the <varname>VERBOSE</varname> variable in delivery +	      mode (in order not to confuse the mail transport agent). + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>UMASK</varname></term><listitem><para>The file creation mode mask, in octal.  The -    default setting of <literal>077</literal> creates mailboxes that are readable and writable -    by the owner only.  Use <literal>007</literal> to create mailboxes that are -    readable/writable by both owner and the group.  Use <literal>037</literal> -    to create -    mailboxes that are readable by both owner and group, but writable by -    owner only.  Permissions on existing mailboxes are not changed, this -    setting affects only new mailboxes.  When delivering to maildirs this -    setting sets the permissions on new messages only.  Access permissions on -    messages in maildirs are also affected by the permissions on the maildir -    directories. -</para></listitem></varlistentry> +	      default setting of <literal>077</literal> creates mailboxes that are readable and writable +	      by the owner only.  Use <literal>007</literal> to create mailboxes that are +	      readable/writable by both owner and the group.  Use <literal>037</literal> +	      to create +	      mailboxes that are readable by both owner and group, but writable by +	      owner only.  Permissions on existing mailboxes are not changed, this +	      setting affects only new mailboxes.  When delivering to maildirs this +	      setting sets the permissions on new messages only.  Access permissions on +	      messages in maildirs are also affected by the permissions on the maildir +	      directories. +	</para></listitem></varlistentry>        </variablelist>      </refsect2> @@ -437,69 +437,89 @@ the <varname>VERBOSE</varname> variable in delivery        <title>Other special variables</title>        <para> -The following variables are automatically used by <command>maildrop</command> when the -<systemitem class="resource">filter file</systemitem> is being processed: -</para> +	The following variables are automatically used by <command>maildrop</command> when the +	<systemitem class="resource">filter file</systemitem> is being processed: +      </para>        <variablelist>  	<varlistentry><term><varname>EXITCODE</varname></term>  	  <listitem><para>Return code for <command>maildrop</command>. When -<command>maildrop</command> successfully delivers a message, it terminates with this -exit code, which defaults to 0. When the <command>to</command> or the -    <command>cc</command> command is used to deliver the message to an external -    process, via a pipe, <command>maildrop</command> will set this variable to the exit -    code of the external process. Since <command>maildrop</command> immediately -    terminates after completing the <command>to</command> command this means that -    <command>maildrop</command>'s exit code will be the exit code of the external -    process. If the <command>to</command> command does not deliver the message to a -    process you must set <varname>EXITCODE</varname> before the <command>to</command> -    command, since <command>maildrop</command> terminates immediately after finishing the -    delivery. -     -  </para></listitem></varlistentry> +	      <command>maildrop</command> successfully delivers a message, it terminates with this +	      exit code, which defaults to 0. When the <command>to</command> or the +	      <command>cc</command> command is used to deliver the message to an external +	      process, via a pipe, <command>maildrop</command> will set this variable to the exit +	      code of the external process. Since <command>maildrop</command> immediately +	      terminates after completing the <command>to</command> command this means that +	      <command>maildrop</command>'s exit code will be the exit code of the external +	      process. If the <command>to</command> command does not deliver the message to a +	      process you must set <varname>EXITCODE</varname> before the <command>to</command> +	      command, since <command>maildrop</command> terminates immediately after finishing the +	      delivery. + +	</para></listitem></varlistentry> +	<varlistentry><term><varname>FLAGS</varname></term> +	  <listitem> +	    <para> +	      The <varname>FLAGS</varname> variable is used only when delivering +	      a message to a maildir, and may contain only the following +	      letters: <quote>D</quote>, <quote>F</quote>, +	      <quote>R</quote>, and <quote>S</quote>. They may appear in +	      any order. When the message gets delivered to the maildir, +	      the message will be marked with a draft, flag, replied, or seen, +	      attribute, correspondingly. +	    </para> +	    <para> +	      <varname>FLAGS</varname> must be set before the message is +	      delivered to a maildir. +	      The contents of <varname>FLAGS</varname> are ignored, when +	      delivering on +	      an mbox folder. +	    </para> +	  </listitem> +	</varlistentry>  	<varlistentry><term><varname>KEYWORDS</varname></term>  	  <listitem>  	    <para> -The <varname>KEYWORDS</varname> variable is used only when delivering a -message to a maildir, and implements the optional IMAP keyword extension -as implemented in the -<ulink url="http://www.courier-mta.org/"><application>Courier</application> IMAP server</ulink>. -It may be optionally initialized to contain a comma-separate list of keywords. -The <link linkend="to"><command>to</command></link>, or the -<link linkend="cc"><command>cc</command></link> command, delivers the message -to the maildir normally, but also associated the list of keywords in -<varname>KEYWORDS</varname> with the newly delivered message.</para> +	      The <varname>KEYWORDS</varname> variable is used only when delivering a +	      message to a maildir, and implements the optional IMAP keyword extension +	      as implemented in the +	      <ulink url="http://www.courier-mta.org/"><application>Courier</application> IMAP server</ulink>. +	      It may be optionally initialized to contain a comma-separate list of keywords. +	      The <link linkend="to"><command>to</command></link>, or the +	      <link linkend="cc"><command>cc</command></link> command, delivers the message +	      to the maildir normally, but also associated the list of keywords in +	      <varname>KEYWORDS</varname> with the newly delivered message.</para>  	    <para> -<varname>KEYWORDS</varname> must be set before the message is delivered to -a maildir. -The contents of <varname>KEYWORDS</varname> are ignored, when delivering on -an mbox folder. -  </para></listitem></varlistentry> +	      <varname>KEYWORDS</varname> must be set before the message is delivered to +	      a maildir. +	      The contents of <varname>KEYWORDS</varname> are ignored, when delivering on +	      an mbox folder. +	</para></listitem></varlistentry>  	<varlistentry><term><varname>LINES</varname></term><listitem><para>Number of lines in the current message. Note that -    this may be an approximation. It may or may not take into account the -A -    option. Use this as criteria for filtering, -    nothing more. -     -  </para></listitem></varlistentry> +	      this may be an approximation. It may or may not take into account the -A +	      option. Use this as criteria for filtering, +	      nothing more. + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>MAILDIRQUOTA</varname></term><listitem><para>Set this variable in order to manually -    enforce a maximum size on ANY maildir where the message is delivered. -    This is an optional feature that must be enabled by the system -    administrator, see <ulink url="maildirquota.html"><citerefentry><refentrytitle>maildirquota</refentrytitle><manvolnum>8</manvolnum></citerefentry></ulink> for -    more information. -     -  </para></listitem></varlistentry> +	      enforce a maximum size on ANY maildir where the message is delivered. +	      This is an optional feature that must be enabled by the system +	      administrator, see <ulink url="maildirquota.html"><citerefentry><refentrytitle>maildirquota</refentrytitle><manvolnum>8</manvolnum></citerefentry></ulink> for +	      more information. + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>RETURNCODE</varname></term><listitem><para>This variable is set when <command>maildrop</command> -    runs the <ulink url="#xfilter">xfilter</ulink> command, or a command that's -    specified within a pair of backtick characters ( command substitution ). -    The <varname>RETURNCODE</varname> variable will be set to the exit code of the -    command, after it completes. -     -  </para></listitem></varlistentry> +	      runs the <ulink url="#xfilter">xfilter</ulink> command, or a command that's +	      specified within a pair of backtick characters ( command substitution ). +	      The <varname>RETURNCODE</varname> variable will be set to the exit code of the +	      command, after it completes. + +	</para></listitem></varlistentry>  	<varlistentry><term><varname>SIZE</varname></term><listitem><para>Number of bytes in the message. This may or may not -    include the -A option. Use this as a criteria -    for filtering, nothing more.</para></listitem></varlistentry> +	      include the -A option. Use this as a criteria +	      for filtering, nothing more.</para></listitem></varlistentry>        </variablelist>      </refsect2> @@ -508,50 +528,50 @@ an mbox folder.        <title>Unquoted text</title>        <para> -All text strings in <systemitem class="resource">filter file</systemitem>s should be in single, or double quotes. -However, for convenience sake, quotes can be omitted under certain -circumstances.</para> +	All text strings in <systemitem class="resource">filter file</systemitem>s should be in single, or double quotes. +	However, for convenience sake, quotes can be omitted under certain +	circumstances.</para>        <para> -Text that includes ONLY letters, digits, and the following characters: -<literal>_-.:/${}@</literal> may appear without quotes. Note that this does not -allow spaces, or backslashes to be entered, however the text is still -variable-substituted, and the substituted text may contain other -characters.</para> +	Text that includes ONLY letters, digits, and the following characters: +	<literal>_-.:/${}@</literal> may appear without quotes. Note that this does not +	allow spaces, or backslashes to be entered, however the text is still +	variable-substituted, and the substituted text may contain other +	characters.</para>        <para> -Also, note that patterns (see below) begin with the slash character. -Normally, anything that begins with the slash is interpreted as a pattern. -However, text immediately after <quote>VARIABLE=</quote> is interpreted as a -string even if it begins with a slash. This is why something like:</para> +	Also, note that patterns (see below) begin with the slash character. +	Normally, anything that begins with the slash is interpreted as a pattern. +	However, text immediately after <quote>VARIABLE=</quote> is interpreted as a +	string even if it begins with a slash. This is why something like:</para> -<blockquote> -	  <informalexample> -	    <programlisting format="linespecific"> +      <blockquote> +	<informalexample> +	  <programlisting>  MAILDIR=/var/mail -</programlisting> -	  </informalexample> -	</blockquote> -<para> -works as expected. Using quotes, though, is highly recommended. You must use -quotes to set a variable to a lone slash, because an unquoted slash is -interpreted as a division sign.</para> +	  </programlisting> +	</informalexample> +      </blockquote> +      <para> +	works as expected. Using quotes, though, is highly recommended. You must use +	quotes to set a variable to a lone slash, because an unquoted slash is +	interpreted as a division sign.</para>        <para> -Long double or singly-quoted text can be broken across multiple lines by -ending the line with a lone backslash character, like this:</para> +	Long double or singly-quoted text can be broken across multiple lines by +	ending the line with a lone backslash character, like this:</para> -<blockquote> -	  <informalexample> -	    <programlisting format="linespecific"> +      <blockquote> +	<informalexample> +	  <programlisting>  TEXT="This is a long \ - text string" -</programlisting> -	  </informalexample> -	</blockquote> -<para> -The backslash, the newline, and all leading whitespace on the next line is -removed, resulting in "This is a long text string".</para> +   text string" +	  </programlisting> +	</informalexample> +      </blockquote> +      <para> +	The backslash, the newline, and all leading whitespace on the next line is +	removed, resulting in "This is a long text string".</para>      </refsect2>      <refsect2> @@ -559,26 +579,26 @@ removed, resulting in "This is a long text string".</para>        <title>Command substitution</title>        <para> -Text enclosed in back-tick characters is interpreted as a shell command. The -shell command is executed as a child process by <command>maildrop</command>. -Its output is used in place of the command. For example:</para> +	Text enclosed in back-tick characters is interpreted as a shell command. The +	shell command is executed as a child process by <command>maildrop</command>. +	Its output is used in place of the command. For example:</para> -<blockquote> -	  <informalexample> -	    <programlisting format="linespecific"> +      <blockquote> +	<informalexample> +	  <programlisting>  DIR=`ls` -</programlisting> -	  </informalexample> -	</blockquote> -<para> -places the names of the files in the current directory into the DIR -variable.</para> +	  </programlisting> +	</informalexample> +      </blockquote> +      <para> +	places the names of the files in the current directory into the DIR +	variable.</para>        <para> -The output of the command will have all newline characters replaced by -spaces, and leading and trailing spaces will be stripped (multiple spaces are -not removed, though). Also, the contents of the message being delivered is -made available to the command on standard input.</para> +	The output of the command will have all newline characters replaced by +	spaces, and leading and trailing spaces will be stripped (multiple spaces are +	not removed, though). Also, the contents of the message being delivered is +	made available to the command on standard input.</para>      </refsect2>      <refsect2> @@ -587,18 +607,18 @@ made available to the command on standard input.</para>        <anchor id="patterns"/>        <para> -The pattern syntax in <command>maildrop</command> is similar to the -<command>grep</command> command's syntax, with some minor differences. -A pattern takes the following -form in the <systemitem class="resource">filter file</systemitem>:</para> +	The pattern syntax in <command>maildrop</command> is similar to the +	<command>grep</command> command's syntax, with some minor differences. +	A pattern takes the following +	form in the <systemitem class="resource">filter file</systemitem>:</para> -<blockquote> -	  <informalexample> -	    <programlisting format="linespecific"> +      <blockquote> +	<informalexample> +	  <programlisting>  /<replaceable>pattern</replaceable>/:<replaceable>options</replaceable> -</programlisting> -	  </informalexample> -	</blockquote> +	  </programlisting> +	</informalexample> +      </blockquote>        <para>  	<replaceable>pattern</replaceable> specifies the text to look for in the @@ -684,40 +704,40 @@ form in the <systemitem class="resource">filter file</systemitem>:</para>        <anchor id="options"/>        <para> -Following <literal>/<replaceable>pattern</replaceable>/,</literal> -there may be an optional colon, followed by one. or -more options. The following options may be specified in any order:</para> +	Following <literal>/<replaceable>pattern</replaceable>/,</literal> +	there may be an optional colon, followed by one. or +	more options. The following options may be specified in any order:</para>        <variablelist>  	<varlistentry><term><literal>h</literal></term>  	  <listitem>  	    <para>Match this pattern against the message header.</para> -	  </listitem></varlistentry> +	</listitem></varlistentry>  	<varlistentry><term><literal>b</literal></term>  	  <listitem>  	    <para>Match this pattern against the message body.</para> -	  </listitem></varlistentry> +	</listitem></varlistentry>  	<varlistentry><term><literal>D</literal></term>  	  <listitem>  	    <para>This is a case sensitive match. Normally the patterns match either -uppercase or lowercase text. <literal>/john/</literal> will match "John", -"john", or "JOHN". Specify the D option for a case-sensitive search: -lowercase letters in the pattern must match lowercase letters in the -message; ditto for uppercase.</para> -	  </listitem></varlistentry> +	      uppercase or lowercase text. <literal>/john/</literal> will match "John", +	      "john", or "JOHN". Specify the D option for a case-sensitive search: +	      lowercase letters in the pattern must match lowercase letters in the +	      message; ditto for uppercase.</para> +	</listitem></varlistentry>        </variablelist>        <para> -If neither 'h' or 'b' is specified, the pattern is matched against the -header only. Specifying the 'b' option causes the pattern to be matched -against the message body. Specifying both causes the pattern to be matched -against the entire message.</para> +	If neither 'h' or 'b' is specified, the pattern is matched against the +	header only. Specifying the 'b' option causes the pattern to be matched +	against the message body. Specifying both causes the pattern to be matched +	against the entire message.</para>        <para> -Normally, each line in the message gets matched against the pattern -individually. When applying patterns to a header, multi-line headers (headers -split on several lines by beginning each continuation line with whitespace) -are silently combined into a single line, before the pattern is applied.</para> +	Normally, each line in the message gets matched against the pattern +	individually. When applying patterns to a header, multi-line headers (headers +	split on several lines by beginning each continuation line with whitespace) +	are silently combined into a single line, before the pattern is applied.</para>      </refsect2>      <refsect2> @@ -744,45 +764,45 @@ are silently combined into a single line, before the pattern is applied.</para>        <title>Weighted scoring</title>        <para> -Patterns are evaluated by <command>maildrop</command> as any other numerical -expression. If a pattern is found, <command>maildrop</command>'s filter -interprets the -results of the pattern match as number 1, or true, for filtering purposes. If -a pattern is not found the results of the pattern search is zero. Once a -pattern is found, the search stops. Second, and subsequent occurrences of the -same pattern are NOT searched for.</para> +	Patterns are evaluated by <command>maildrop</command> as any other numerical +	expression. If a pattern is found, <command>maildrop</command>'s filter +	interprets the +	results of the pattern match as number 1, or true, for filtering purposes. If +	a pattern is not found the results of the pattern search is zero. Once a +	pattern is found, the search stops. Second, and subsequent occurrences of the +	same pattern are NOT searched for.</para>        <para> -<command>maildrop</command> can also do weighted scoring. In weighted scoring, -multiple occurrences of the same pattern are used to calculate a numerical -score.</para> +	<command>maildrop</command> can also do weighted scoring. In weighted scoring, +	multiple occurrences of the same pattern are used to calculate a numerical +	score.</para>        <para> -To use a weighted search, specify the pattern as follows:</para> +	To use a weighted search, specify the pattern as follows:</para> -<blockquote> -	  <informalexample> -	    <programlisting format="linespecific"> +      <blockquote> +	<informalexample> +	  <programlisting>  /<replaceable>pattern</replaceable>/:<replaceable>options</replaceable>,<replaceable>xxx</replaceable>,<replaceable>yyy</replaceable> -</programlisting> -	  </informalexample> -	</blockquote> -<para> -where <replaceable>xxx</replaceable> and <replaceable>yyy</replaceable> are -two numbers. <replaceable>yyy</replaceable> is optional -- it will -default to 1, if missing.</para> +	  </programlisting> +	</informalexample> +      </blockquote> +      <para> +	where <replaceable>xxx</replaceable> and <replaceable>yyy</replaceable> are +	two numbers. <replaceable>yyy</replaceable> is optional -- it will +	default to 1, if missing.</para>        <para>The first occurrence of the pattern is evaluated as xxx. The second -occurrence of the pattern is evaluated as xxx*yyy, the third as xxx*yyy*yyy, -etc... All occurrences of the pattern are added up to calculate the final -score.</para> +	occurrence of the pattern is evaluated as xxx*yyy, the third as xxx*yyy*yyy, +	etc... All occurrences of the pattern are added up to calculate the final +	score.</para>        <note>  	<para> -<command>maildrop</command> does not -recognize multiple occurrences of the same pattern in the same line. -Multiple occurences of the same pattern in one line count as one -occurence.</para> +	  <command>maildrop</command> does not +	  recognize multiple occurrences of the same pattern in the same line. +	  Multiple occurences of the same pattern in one line count as one +	  occurence.</para>        </note>      </refsect2> @@ -793,86 +813,89 @@ occurence.</para>        <anchor id="patmatch"/>        <para> -After a pattern is successfully matched, the actual text that is matched -is placed in the <varname>MATCH</varname> variable. For example:</para> +	After a pattern is successfully matched, the actual text that is matched +	is placed in the <varname>MATCH</varname> variable. For example:</para> -<blockquote> -	  <informalexample> -	    <programlisting format="linespecific"> +      <blockquote> +	<informalexample> +	  <programlisting>  /^From:.*/ -</programlisting> -	  </informalexample> -	</blockquote> -<para> -matches a line of the form:</para> +	  </programlisting> +	</informalexample> +      </blockquote> +      <para> +	matches a line of the form: +      </para> -<blockquote> -	  <informalexample> +      <blockquote> +	<informalexample> +	  <programlisting>  From: postmaster@localhost -	  </informalexample> -	</blockquote> +	  </programlisting> +	</informalexample> +      </blockquote>        <para> -Here the variable <varname>MATCH</varname> will be set to "From: -postmaster@localhost", which can be used in subsequent statements.</para> +	Here the variable <varname>MATCH</varname> will be set to "From: +	postmaster@localhost", which can be used in subsequent statements.</para>        <para> -If the pattern contains subpatterns, the portions of the text that match -the first subpattern is placed in the <varname>MATCH1</varname> variable. -The second subpattern, if any, is placed in <varname>MATCH2</varname>, and -so on:</para> +	If the pattern contains subpatterns, the portions of the text that match +	the first subpattern is placed in the <varname>MATCH1</varname> variable. +	The second subpattern, if any, is placed in <varname>MATCH2</varname>, and +	so on:</para>        <blockquote>  	<informalexample> -	  <programlisting format="linespecific"> +	  <programlisting>  /^From:\s+(.*)@(.*)/ -</programlisting> +	  </programlisting>  	</informalexample>        </blockquote>        <para> -matched against the same line will set <varname>MATCH</varname> to -<quote>From: postmaster@localhost</quote>, -<varname>MATCH1</varname> to <quote>postmaster</quote>, and -<varname>MATCH2</varname> to <quote>localhost</quote>. -Of course, in real world the <quote>From:</quote> header is usually much -more complicated, and can't be handled that easily. -This is just an illustrative example.</para> +	matched against the same line will set <varname>MATCH</varname> to +	<quote>From: postmaster@localhost</quote>, +	<varname>MATCH1</varname> to <quote>postmaster</quote>, and +	<varname>MATCH2</varname> to <quote>localhost</quote>. +	Of course, in real world the <quote>From:</quote> header is usually much +	more complicated, and can't be handled that easily. +	This is just an illustrative example.</para>        <note>  	<para> -Subpatterns are not processed in the <literal>foreach</literal> -statement.</para> -</note> +	  Subpatterns are not processed in the <literal>foreach</literal> +	  statement.</para> +      </note>      </refsect2>      <refsect2 id="conversion">        <title>Conversion of <command>maildrop</command> 1.x patterns to 2.0</title>        <para> -Although the new <acronym>PCRE</acronym>-based pattern matching code in -<command>maildrop</command> is completely different from the built-in -pattern matching code in <command>maildrop</command> 1.x, very few changes -will be required to convert recipes to the new syntax. -The only major differences are:</para> +	Although the new <acronym>PCRE</acronym>-based pattern matching code in +	<command>maildrop</command> is completely different from the built-in +	pattern matching code in <command>maildrop</command> 1.x, very few changes +	will be required to convert recipes to the new syntax. +	The only major differences are:</para>        <itemizedlist>  	<listitem>  	  <para> -The subexpression format has changed. -Any pattern that uses subexpression needs to be converted. -Additionally, references to <varname>MATCH2</varname> must be replaced -with <varname>MATCH1</varname>, <varname>MATCH3</varname> to -<varname>MATCH2</varname>, and so on. -References to plain old <varname>MATCH</varname> will remain the -same.</para> +	    The subexpression format has changed. +	    Any pattern that uses subexpression needs to be converted. +	    Additionally, references to <varname>MATCH2</varname> must be replaced +	    with <varname>MATCH1</varname>, <varname>MATCH3</varname> to +	    <varname>MATCH2</varname>, and so on. +	    References to plain old <varname>MATCH</varname> will remain the +	    same.</para>  	</listitem>  	<listitem>  	  <para> -The <quote>w</quote> pattern option is no longer possible, with -<acronym>PCRE</acronym>. -The very few recipes that use this option, if any actually exist, -will have to be rewritten in some other fashion.</para> +	    The <quote>w</quote> pattern option is no longer possible, with +	    <acronym>PCRE</acronym>. +	    The very few recipes that use this option, if any actually exist, +	    will have to be rewritten in some other fashion.</para>  	</listitem>        </itemizedlist>      </refsect2> @@ -882,22 +905,22 @@ will have to be rewritten in some other fashion.</para>        <title>Expressions</title>        <para> -Although <command>maildrop</command> evaluates expressions numerically, -results of -expressions are stored as text literals. When necessary, text literals are -converted to numbers, then the results of a mathematical operation is -converted back into a text literal.</para> +	Although <command>maildrop</command> evaluates expressions numerically, +	results of +	expressions are stored as text literals. When necessary, text literals are +	converted to numbers, then the results of a mathematical operation is +	converted back into a text literal.</para>        <refsect3>  	<title>Operators</title>  	<para> -The following operators carry their usual meaning, and are listed in order -from lowest precedence, to the highest:</para> +	  The following operators carry their usual meaning, and are listed in order +	  from lowest precedence, to the highest:</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  ||  && @@ -908,8 +931,7 @@ from lowest precedence, to the highest:</para>  *  /  =~ /<replaceable>pattern</replaceable>/  /<replaceable>pattern</replaceable>/  !  ~  <replaceable>function()</replaceable> - -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>        </refsect3> @@ -921,24 +943,24 @@ from lowest precedence, to the highest:</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  VARIABLE=<replaceable>expression</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -Assigns the result of the expression to <replaceable>VARIABLE</replaceable> -(note no leading $ in front of variable). -</para> +	  Assigns the result of the expression to <replaceable>VARIABLE</replaceable> +	  (note no leading $ in front of variable). +	</para>  	<note>  	  <para> -If <replaceable>VARIABLE</replaceable> is NOT surrounded by quotes, then it -may contain only letters, numbers, underscores, dashes, and a selected few -other characters. In order to initialize a variable whose name contains -non-standard punctuation marks, surround the name of the variable with -quotes.</para> +	    If <replaceable>VARIABLE</replaceable> is NOT surrounded by quotes, then it +	    may contain only letters, numbers, underscores, dashes, and a selected few +	    other characters. In order to initialize a variable whose name contains +	    non-standard punctuation marks, surround the name of the variable with +	    quotes.</para>  	</note>        </refsect3> @@ -950,33 +972,33 @@ quotes.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  cc <replaceable>expression</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The <command>cc</command> statement is very similar to the -<command>to</command> statement, except -that after delivering the message <command>maildrop</command> continues -to process the -<systemitem class="resource">filter file</systemitem>, -unlike the <command>to</command> statement which immediately -terminates <command>maildrop</command> after the delivery is complete. -Essentially, the -message is carbon copied to the given mailbox, and may be delivered again to -another mailbox by another <command>cc</command> or -<command>to</command> statement.</para> - -	<para> -<ulink url="#to">See the <command>to</command> statement</ulink> for more -details. -When -<command>cc</command> is used to deliver a message to a process -<command>maildrop</command> -will set the <varname>EXITCODE</varname> variable to the process's exit -code.</para> +	  The <command>cc</command> statement is very similar to the +	  <command>to</command> statement, except +	  that after delivering the message <command>maildrop</command> continues +	  to process the +	  <systemitem class="resource">filter file</systemitem>, +	  unlike the <command>to</command> statement which immediately +	  terminates <command>maildrop</command> after the delivery is complete. +	  Essentially, the +	  message is carbon copied to the given mailbox, and may be delivered again to +	  another mailbox by another <command>cc</command> or +	  <command>to</command> statement.</para> + +	<para> +	  <ulink url="#to">See the <command>to</command> statement</ulink> for more +	  details. +	  When +	  <command>cc</command> is used to deliver a message to a process +	  <command>maildrop</command> +	  will set the <varname>EXITCODE</varname> variable to the process's exit +	  code.</para>        </refsect3>        <refsect3> @@ -986,50 +1008,50 @@ code.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  dotlock <replaceable>expression</replaceable> { -      ... +   ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -<command>maildrop</command> automatically creates a lock when a message is -delivered to a -mailbox. Depending upon your system configuration, -<command>maildrop</command> will use -either dot-locks, or the flock() system call.</para> +	  <command>maildrop</command> automatically creates a lock when a message is +	  delivered to a +	  mailbox. Depending upon your system configuration, +	  <command>maildrop</command> will use +	  either dot-locks, or the flock() system call.</para>  	<para>The <command>dotlock</command> statement creates an explicit dot-lock -file. Use the <ulink url="#flock"><command>flock</command> statement</ulink> to create an -explicit flock() -lock.</para> +	  file. Use the <ulink url="#flock"><command>flock</command> statement</ulink> to create an +	  explicit flock() +	  lock.</para>  	<para>The <replaceable>expression</replaceable> is a filename that should be -used as a lock file. -<command>maildrop</command> creates the indicated dot-lock, executes the -filtering -instructions contained within the { ... } block, and removes the lock. The -expression <emphasis>must</emphasis> be the name of the dot-lock file itself, -<emphasis>NOT</emphasis> -the name of the mailbox file you want to lock.</para> +	  used as a lock file. +	  <command>maildrop</command> creates the indicated dot-lock, executes the +	  filtering +	  instructions contained within the { ... } block, and removes the lock. The +	  expression <emphasis>must</emphasis> be the name of the dot-lock file itself, +	  <emphasis>NOT</emphasis> +	  the name of the mailbox file you want to lock.</para>  	<note>  	  <para> -With manual locking, it is possible to deadlock multiple -<command>maildrop</command> processes (or any other processes that try to -claim the same -locks).</para> +	    With manual locking, it is possible to deadlock multiple +	    <command>maildrop</command> processes (or any other processes that try to +	    claim the same +	    locks).</para>  	  <para>No deadlock detection is possible with dot-locks, and since -<command>maildrop</command> automatically refreshes all of its dot-locks -regularly, they -will never go stale. You'll have <command>maildrop</command> processes -hanging in limbo, -until their watchdog timers go off, aborting the mail delivery.</para> +	    <command>maildrop</command> automatically refreshes all of its dot-locks +	    regularly, they +	    will never go stale. You'll have <command>maildrop</command> processes +	    hanging in limbo, +	    until their watchdog timers go off, aborting the mail delivery.</para>  	</note>        </refsect3> @@ -1040,19 +1062,19 @@ until their watchdog timers go off, aborting the mail delivery.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  echo <replaceable>expression</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -<command>maildrop</command> will print the given text. This is usually used -when -<command>maildrop</command> runs in embedded mode, but can be used for -debugging -purposes. Normally, a newline is printed after the text. If text is -terminated with a \c, no newline will be printed.</para> +	  <command>maildrop</command> will print the given text. This is usually used +	  when +	  <command>maildrop</command> runs in embedded mode, but can be used for +	  debugging +	  purposes. Normally, a newline is printed after the text. If text is +	  terminated with a \c, no newline will be printed.</para>        </refsect3>        <refsect3> @@ -1062,24 +1084,24 @@ terminated with a \c, no newline will be printed.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  exception {     ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The <command>exception</command> statement traps errors that would normally -cause -<command>maildrop</command> to terminate. If a fatal error is encountered -anywhere within the -block of statements enclosed by the <command>exception</command> clause, -execution will -resume immediately following the <command>exception</command> clause.</para> +	  The <command>exception</command> statement traps errors that would normally +	  cause +	  <command>maildrop</command> to terminate. If a fatal error is encountered +	  anywhere within the +	  block of statements enclosed by the <command>exception</command> clause, +	  execution will +	  resume immediately following the <command>exception</command> clause.</para>        </refsect3>        <refsect3> @@ -1090,23 +1112,23 @@ resume immediately following the <command>exception</command> clause.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  exit -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The <command>exit</command> statement immediately terminates filtering. -<command>maildrop</command>'s -return code is set to the value of the <varname>EXITCODE</varname> variable. -Normally, <command>maildrop</command> terminates immediately after <ulink url="#to">successfully delivering the message</ulink> to a mailbox. The -<command>exit</command> statement causes <command>maildrop</command> to -terminate without delivering the message anywhere.</para> +	  The <command>exit</command> statement immediately terminates filtering. +	  <command>maildrop</command>'s +	  return code is set to the value of the <varname>EXITCODE</varname> variable. +	  Normally, <command>maildrop</command> terminates immediately after <ulink url="#to">successfully delivering the message</ulink> to a mailbox. The +	  <command>exit</command> statement causes <command>maildrop</command> to +	  terminate without delivering the message anywhere.</para>  	<para>The <command>exit</command> statement is usually used when -<command>maildrop</command> runs in <ulink url="maildrop.html#embedded">embedded mode</ulink>, when message -delivery instructions are not allowed.</para> +	  <command>maildrop</command> runs in <ulink url="maildrop.html#embedded">embedded mode</ulink>, when message +	  delivery instructions are not allowed.</para>        </refsect3>        <refsect3> @@ -1116,44 +1138,44 @@ delivery instructions are not allowed.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  flock <replaceable>expression</replaceable> { -      ... +   ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -<command>maildrop</command> automatically creates a lock when a message is delivered to a -mailbox. Depending upon your system configuration, <command>maildrop</command> will use -either dot-locks, or the flock() system call.</para> +	  <command>maildrop</command> automatically creates a lock when a message is delivered to a +	  mailbox. Depending upon your system configuration, <command>maildrop</command> will use +	  either dot-locks, or the flock() system call.</para>  	<para>The <command>flock</command> statement creates a manual flock() lock. -Use the <ulink url="#dotlock"><command>dotlock</command> statement</ulink> -to create a manual dot-lock -file.</para> +	  Use the <ulink url="#dotlock"><command>dotlock</command> statement</ulink> +	  to create a manual dot-lock +	  file.</para>  	<para>The <replaceable>expression</replaceable> is the name of the -file that should be locked. -<command>maildrop</command> creates the lock on the indicated file, executes -the -filtering instructions contained within the { ... } block, and removes the -lock.</para> +	  file that should be locked. +	  <command>maildrop</command> creates the lock on the indicated file, executes +	  the +	  filtering instructions contained within the { ... } block, and removes the +	  lock.</para>  	<note>  	  <para> -With manual locking, it is possible to deadlock multiple -<command>maildrop</command> processes (or any other -processes that try to claim the same -locks). The operating system will automatically break flock() deadlocks. When -that happens, one of the <command>maildrop</command> processes will terminate -immediately. Use the <command>exception</command> statement in order to trap -this -exception condition, and execute an alternative set of filtering -instructions.</para> +	    With manual locking, it is possible to deadlock multiple +	    <command>maildrop</command> processes (or any other +	    processes that try to claim the same +	    locks). The operating system will automatically break flock() deadlocks. When +	    that happens, one of the <command>maildrop</command> processes will terminate +	    immediately. Use the <command>exception</command> statement in order to trap +	    this +	    exception condition, and execute an alternative set of filtering +	    instructions.</para>  	</note>        </refsect3> @@ -1161,46 +1183,46 @@ instructions.</para>  	<title>foreach - iterate over text sections matched by a pattern</title>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  foreach /pattern/:options  { -    ... +   ...  }  foreach (expression) =~ /pattern/:options  { -    ... +   ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The <command>foreach</command> statement executes a block of statements for -each -occurrence of the given pattern in the given message, or expression. On every -iteration <varname>MATCH</varname> variable will be set to the matched string. -All the usual options may be applied to the pattern match, -EXCEPT the following: -<variablelist> +	  The <command>foreach</command> statement executes a block of statements for +	  each +	  occurrence of the given pattern in the given message, or expression. On every +	  iteration <varname>MATCH</varname> variable will be set to the matched string. +	  All the usual options may be applied to the pattern match, +	  EXCEPT the following: +	  <variablelist>  	    <varlistentry>  	      <term>,xxx,yyy</term>  	      <listitem>  		<para> -Weighted scoring is meaningless, in this context.</para> +		  Weighted scoring is meaningless, in this context.</para>  	      </listitem>  	    </varlistentry>  	    <varlistentry>  	      <term>( ... )</term>  	      <listitem>  		<para> -Subpatterns are not processed. -Only the <varname>MATCH</varname> variable will be set for each found -pattern.</para> +		  Subpatterns are not processed. +		  Only the <varname>MATCH</varname> variable will be set for each found +		  pattern.</para>  	      </listitem>  	    </varlistentry>  	  </variablelist> -</para> +	</para>        </refsect3>        <refsect3> @@ -1208,116 +1230,116 @@ pattern.</para>  	<anchor id="if"/>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  if (<replaceable>expression</replaceable>)  { -    ... +   ...  }  else  { -    ... +   ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -Conditional execution. If <replaceable>expression</replaceable> -evaluates to a logical true (note - -parenthesis are required) then the first set of statements is executed. -The <command>else</command> keyword, and the subsequent statements, are -optional. If present, -and the expression evaluates to a logical false, the -<command>else</command> part is executed.</para> +	  Conditional execution. If <replaceable>expression</replaceable> +	  evaluates to a logical true (note - +	  parenthesis are required) then the first set of statements is executed. +	  The <command>else</command> keyword, and the subsequent statements, are +	  optional. If present, +	  and the expression evaluates to a logical false, the +	  <command>else</command> part is executed.</para>  	<para> -<command>maildrop</command> evaluates all expression as text strings. -In the context -of a logical expression, an empty string, or the number 0 constitutes a -logical false value, anything else is a logical true value.</para> +	  <command>maildrop</command> evaluates all expression as text strings. +	  In the context +	  of a logical expression, an empty string, or the number 0 constitutes a +	  logical false value, anything else is a logical true value.</para>  	<para>If the <command>if</command> part, or the -<command>else</command> -part consists of only one -statement, the braces may be omitted.</para> +	  <command>else</command> +	  part consists of only one +	  statement, the braces may be omitted.</para>  	<note>  	  <para> -The grammar of this <command>if</command> statement is stricter than -usual. -If -you get baffling syntax errors from <command>maildrop</command>, make sure that the -braces, and the if statement, appear on separate lines. Specifically: the -closing parenthesis, the closing braces, and the else statement, must be at -the end of the line (comments are allowed), and there may not be any blank -lines in between (not even ones containing comments only).</para> +	    The grammar of this <command>if</command> statement is stricter than +	    usual. +	    If +	    you get baffling syntax errors from <command>maildrop</command>, make sure that the +	    braces, and the if statement, appear on separate lines. Specifically: the +	    closing parenthesis, the closing braces, and the else statement, must be at +	    the end of the line (comments are allowed), and there may not be any blank +	    lines in between (not even ones containing comments only).</para>  	</note>  	<para> -If the <command>else</command> part contains a single <command>if</command>, -and nothing else, -this may be combined into an <command>elsif</command>: -</para> +	  If the <command>else</command> part contains a single <command>if</command>, +	  and nothing else, +	  this may be combined into an <command>elsif</command>: +	</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  if (<replaceable>expression</replaceable>)  { -    ... +   ...  }  elsif (<replaceable>expression</replaceable>)  { -    ... +   ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The above example is logically identical to:</para> +	  The above example is logically identical to:</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  if (<replaceable>expression</replaceable>)  { -    ... +   ...  }  else  { -    if (<replaceable>expression</replaceable>) -    { -        ... -    } +   if (<replaceable>expression</replaceable>) +   { +      ... +   }  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -Consecutive <command>elsif</command> sequences are allowed: -</para> +	  Consecutive <command>elsif</command> sequences are allowed: +	</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  if (<replaceable>expression</replaceable>)  { -    ... +   ...  }  elsif (<replaceable>expression</replaceable>)  { -    ... +   ...  }  elsif (<replaceable>expression</replaceable>)  { -    ... +   ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -Consecutive occurences of <command>elsif</command> commands eliminate a -significant amount of indentation, and the resulting code is more readable. -</para> +	  Consecutive occurences of <command>elsif</command> commands eliminate a +	  significant amount of indentation, and the resulting code is more readable. +	</para>        </refsect3>        <refsect3> @@ -1325,72 +1347,72 @@ significant amount of indentation, and the resulting code is more readable.  	<anchor id="import"/>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  import <replaceable>variable</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para>When <command>maildrop</command> starts, -it normally imports the contents of the -environment variables, and assigns them to internal <command>maildrop</command> -variables. For example, if there was an environment variable -<varname>FOO</varname>, the internal <command>maildrop</command> variable -<varname>FOO</varname> will -have the contents of the environment variable. -From then on, <varname>FOO</varname> -will be no different than any other variable, -and when <command>maildrop</command> runs -an external command, the contents of <command>maildrop</command>'s -variables will be -exported as the environment for the command.</para> +	  it normally imports the contents of the +	  environment variables, and assigns them to internal <command>maildrop</command> +	  variables. For example, if there was an environment variable +	  <varname>FOO</varname>, the internal <command>maildrop</command> variable +	  <varname>FOO</varname> will +	  have the contents of the environment variable. +	  From then on, <varname>FOO</varname> +	  will be no different than any other variable, +	  and when <command>maildrop</command> runs +	  an external command, the contents of <command>maildrop</command>'s +	  variables will be +	  exported as the environment for the command.</para>  	<para>Certain variables, like <varname>HOME</varname> and -<varname>PATH</varname>, are always reset to fixed defaults, -for security reasons. -Also, in delivery and embedded modes, the environment is not imported at all -(with the exception of system locale environment variables), -and <command>maildrop</command> starts with only the fixed default -variables.</para> +	  <varname>PATH</varname>, are always reset to fixed defaults, +	  for security reasons. +	  Also, in delivery and embedded modes, the environment is not imported at all +	  (with the exception of system locale environment variables), +	  and <command>maildrop</command> starts with only the fixed default +	  variables.</para>  	<para> -The <command>import</command> statement initializes the specified -variable with the contents of the original environment variable -when <command>maildrop</command> started.  For example:</para> +	  The <command>import</command> statement initializes the specified +	  variable with the contents of the original environment variable +	  when <command>maildrop</command> started.  For example:</para> -<blockquote> -	    <informalexample> -	      <programlisting format="linespecific"> +	<blockquote> +	  <informalexample> +	    <programlisting>  echo "PATH is $PATH"  PATH="/bin"  echo "PATH is $PATH"  import PATH  echo "PATH is $PATH"  exit -</programlisting> -	    </informalexample> -	  </blockquote> +	    </programlisting> +	  </informalexample> +	</blockquote>  	<para>This results in the following output:</para>  	<blockquote> -	    <informalexample> -	      <programlisting format="linespecific"> +	  <informalexample> +	    <programlisting>  PATH is /bin:/usr/bin:/usr/local/bin  PATH is /bin  PATH is /home/root/bin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin -</programlisting> -	    </informalexample> -	  </blockquote> +	    </programlisting> +	  </informalexample> +	</blockquote>  	<para> -This shows that when <command>maildrop</command> starts -<varname>PATH</varname> is set to the fixed default of -<literal>/bin:/usr/bin:/usr/local/bin</literal>. -However, the original contents of -the <varname>PATH</varname> environment variable we different, and the -<command>import</command> statement shows what it was.</para> +	  This shows that when <command>maildrop</command> starts +	  <varname>PATH</varname> is set to the fixed default of +	  <literal>/bin:/usr/bin:/usr/local/bin</literal>. +	  However, the original contents of +	  the <varname>PATH</varname> environment variable we different, and the +	  <command>import</command> statement shows what it was.</para>        </refsect3>        <refsect3> @@ -1400,28 +1422,28 @@ the <varname>PATH</varname> environment variable we different, and the  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  include <replaceable>expression</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The include statement reads a file, and executes filtering instructions -contained in that file. Note that the include statement is processed when the -current <systemitem class="resource">filter file</systemitem> is being executed. When <command>maildrop</command> reads the initial -<systemitem class="resource">filter file</systemitem>, any syntax errors in the filtering instructions are immediately -reported, and <command>maildrop</command> will terminate with a return code of -<errorcode>EX_TEMPFAIL</errorcode>. Any errors in files specified by -<command>include</command> -statements are NOT reported, because those files will not be read until the -<command>include</command> statement is itself executed.</para> +	  The include statement reads a file, and executes filtering instructions +	  contained in that file. Note that the include statement is processed when the +	  current <systemitem class="resource">filter file</systemitem> is being executed. When <command>maildrop</command> reads the initial +	  <systemitem class="resource">filter file</systemitem>, any syntax errors in the filtering instructions are immediately +	  reported, and <command>maildrop</command> will terminate with a return code of +	  <errorcode>EX_TEMPFAIL</errorcode>. Any errors in files specified by +	  <command>include</command> +	  statements are NOT reported, because those files will not be read until the +	  <command>include</command> statement is itself executed.</para>  	<para> -If the specified file does not exist, or if there are any syntax errors in -the file, <command>maildrop</command> reports the error, and terminates with -a return -code of <errorcode>EX_TEMPFAIL</errorcode>.</para> +	  If the specified file does not exist, or if there are any syntax errors in +	  the file, <command>maildrop</command> reports the error, and terminates with +	  a return +	  code of <errorcode>EX_TEMPFAIL</errorcode>.</para>        </refsect3>        <refsect3> @@ -1429,37 +1451,37 @@ code of <errorcode>EX_TEMPFAIL</errorcode>.</para>  	<anchor id="log"/>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  logfile <replaceable>expression</replaceable>  log <replaceable>expression</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -Logging in <command>maildrop</command> is normally turned off. -The <command>logfile</command> -statement specifies the file where -<command>maildrop</command> will log how the message has been -disposed of. The parameter is then name of the file. If the -file exists <command>maildrop</command> appends to the file.</para> +	  Logging in <command>maildrop</command> is normally turned off. +	  The <command>logfile</command> +	  statement specifies the file where +	  <command>maildrop</command> will log how the message has been +	  disposed of. The parameter is then name of the file. If the +	  file exists <command>maildrop</command> appends to the file.</para>  	<para> -For each delivery (the <ulink url="#to"><command>to</command></ulink> -and <ulink url="#cc"><command>cc</command></ulink> -statements, and default deliveries) -<command>maildrop</command> records the -<literal>From:</literal> and the -<literal>Subject:</literal> fields, together with -the current time, in the log file.</para> +	  For each delivery (the <ulink url="#to"><command>to</command></ulink> +	  and <ulink url="#cc"><command>cc</command></ulink> +	  statements, and default deliveries) +	  <command>maildrop</command> records the +	  <literal>From:</literal> and the +	  <literal>Subject:</literal> fields, together with +	  the current time, in the log file.</para>  	<para> -The <command>log</command> statement adds additional logging text to the -log file. The <command>log</command> statement works exactly like -the <command>echo</command> -statement, except that the text is written to the logfile, instead of -standard output.</para> +	  The <command>log</command> statement adds additional logging text to the +	  log file. The <command>log</command> statement works exactly like +	  the <command>echo</command> +	  statement, except that the text is written to the logfile, instead of +	  standard output.</para>        </refsect3>        <refsect3> @@ -1467,63 +1489,63 @@ standard output.</para>  	<anchor id="to"/>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  to <replaceable>expression</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The <command>to</command> statement delivers the message to a mailbox. -<replaceable>expression</replaceable> -must evaluate to a valid mailbox. A valid mailbox is either a mailbox file, a -maildir, or an external program (which includes forwarding to another -address).</para> - -	<para> -The <command>to</command> statement is the final delivery statement. -<command>maildrop</command> -delivers message, then immediately terminates, -with its return code set to -the <varname>EXITCODE</varname> variable. -If there was an error while -delivering the message, <command>maildrop</command> terminates with the -<errorcode>EX_TEMPFAIL</errorcode> exit code. A properly-written mail -transport agent -should re-queue the message, and re-attempt delivery at some later time.</para> - -	<para> -An <replaceable>expression</replaceable> that begins with the -"<token>|</token>" character -specifies an external program to run to handle the actual -delivery. The <varname>SHELL</varname> variable specifies the shell to -execute the -given command. The message is provided to the command on standard input. -<command>maildrop</command>'s exit code will be the process's exit -code.</para> - -	<para> -An <replaceable>expression</replaceable> that begins -with an exclamation mark, "<token>!</token>" -specifies a whitespace-delimited -list of E-mail addresses to forward the message -to. -The program -specified by the <varname>SENDMAIL</varname> variable is run as an -external program, with the list of E-mail addresses provided as parameters to -the program.</para> - -	<para> -Otherwise, <replaceable>expression</replaceable> names the mailbox -where <command>maildrop</command> delivers the message. -If <replaceable>expression</replaceable> is a directory, -<command>maildrop</command> assumes -that the directory is a maildir directory. -Otherwise, <command>maildrop</command> will deliver -the message to a file, formatted in traditional mailbox format. -<command>maildrop</command> will use either dot-locking, or flock()-locking -when -delivering the message to the file.</para> +	  The <command>to</command> statement delivers the message to a mailbox. +	  <replaceable>expression</replaceable> +	  must evaluate to a valid mailbox. A valid mailbox is either a mailbox file, a +	  maildir, or an external program (which includes forwarding to another +	  address).</para> + +	<para> +	  The <command>to</command> statement is the final delivery statement. +	  <command>maildrop</command> +	  delivers message, then immediately terminates, +	  with its return code set to +	  the <varname>EXITCODE</varname> variable. +	  If there was an error while +	  delivering the message, <command>maildrop</command> terminates with the +	  <errorcode>EX_TEMPFAIL</errorcode> exit code. A properly-written mail +	  transport agent +	  should re-queue the message, and re-attempt delivery at some later time.</para> + +	<para> +	  An <replaceable>expression</replaceable> that begins with the +	  "<token>|</token>" character +	  specifies an external program to run to handle the actual +	  delivery. The <varname>SHELL</varname> variable specifies the shell to +	  execute the +	  given command. The message is provided to the command on standard input. +	  <command>maildrop</command>'s exit code will be the process's exit +	  code.</para> + +	<para> +	  An <replaceable>expression</replaceable> that begins +	  with an exclamation mark, "<token>!</token>" +	  specifies a whitespace-delimited +	  list of E-mail addresses to forward the message +	  to. +	  The program +	  specified by the <varname>SENDMAIL</varname> variable is run as an +	  external program, with the list of E-mail addresses provided as parameters to +	  the program.</para> + +	<para> +	  Otherwise, <replaceable>expression</replaceable> names the mailbox +	  where <command>maildrop</command> delivers the message. +	  If <replaceable>expression</replaceable> is a directory, +	  <command>maildrop</command> assumes +	  that the directory is a maildir directory. +	  Otherwise, <command>maildrop</command> will deliver +	  the message to a file, formatted in traditional mailbox format. +	  <command>maildrop</command> will use either dot-locking, or flock()-locking +	  when +	  delivering the message to the file.</para>        </refsect3>        <refsect3> @@ -1531,22 +1553,22 @@ delivering the message to the file.</para>  	<anchor id="while"/>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  while (<replaceable>expression</replaceable>)  { -    ... +   ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The <replaceable>expression</replaceable> is repeatedly evaluated. -Each time it <ulink url="#if">evaluates to a logical true</ulink>, -the statements inside the braces -are executed. -When <replaceable>expression</replaceable> evaluates to a logical false, -the while loop is over. Take care to avoid infinite loops.</para> +	  The <replaceable>expression</replaceable> is repeatedly evaluated. +	  Each time it <ulink url="#if">evaluates to a logical true</ulink>, +	  the statements inside the braces +	  are executed. +	  When <replaceable>expression</replaceable> evaluates to a logical false, +	  the while loop is over. Take care to avoid infinite loops.</para>        </refsect3>        <refsect3> @@ -1555,22 +1577,22 @@ the while loop is over. Take care to avoid infinite loops.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  xfilter <replaceable>expression</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -<replaceable>expression</replaceable> specifies an external program that -<command>maildrop</command> runs to filter the current message. -The current -message will be piped to the filter program as standard input. The output of -the filter program replaces the current message being delivered. The external -program must terminate with an exit code of 0. If the external program does -not terminate with an exit code of 0, or if it does not read the message from -the standard input, <command>maildrop</command> terminates with an exit code of -<errorcode>EX_TEMPFAIL</errorcode>.</para> +	  <replaceable>expression</replaceable> specifies an external program that +	  <command>maildrop</command> runs to filter the current message. +	  The current +	  message will be piped to the filter program as standard input. The output of +	  the filter program replaces the current message being delivered. The external +	  program must terminate with an exit code of 0. If the external program does +	  not terminate with an exit code of 0, or if it does not read the message from +	  the standard input, <command>maildrop</command> terminates with an exit code of +	  <errorcode>EX_TEMPFAIL</errorcode>.</para>        </refsect3>        <refsect3> @@ -1578,24 +1600,24 @@ the standard input, <command>maildrop</command> terminates with an exit code of  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  <replaceable>expression1</replaceable> <token>||</token> <replaceable>expression2</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -If <replaceable>expression1</replaceable> evaluates to a logical true, -the result of the <token>||</token> is -<replaceable>expression1</replaceable>, otherwise it's  -<replaceable>expression2</replaceable>, which is evaluated.</para> +	  If <replaceable>expression1</replaceable> evaluates to a logical true, +	  the result of the <token>||</token> is +	  <replaceable>expression1</replaceable>, otherwise it's +	  <replaceable>expression2</replaceable>, which is evaluated.</para>  	<para> -<command>maildrop</command> uses the following concept of true/false: -an empty text -literal, or a text literal that consists of the single character "0" is a -logical false value. Anything else is a logical true value.</para> +	  <command>maildrop</command> uses the following concept of true/false: +	  an empty text +	  literal, or a text literal that consists of the single character "0" is a +	  logical false value. Anything else is a logical true value.</para>        </refsect3>        <refsect3> @@ -1603,24 +1625,24 @@ logical false value. Anything else is a logical true value.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  <replaceable>expression1</replaceable> <token>&&</token> <replaceable>expression2</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -If <replaceable>expression1</replaceable> evaluates to a logical false, -the result of the <token>&&</token> is -<replaceable>expression1</replaceable>, otherwise it's  -<replaceable>expression2</replaceable>, which is evaluated.</para> +	  If <replaceable>expression1</replaceable> evaluates to a logical false, +	  the result of the <token>&&</token> is +	  <replaceable>expression1</replaceable>, otherwise it's +	  <replaceable>expression2</replaceable>, which is evaluated.</para>  	<para> -<command>maildrop</command> uses the following concept of true/false: -an empty text -literal, or a text literal that consists of the single character "0" is a -logical false value. Anything else is a logical true value.</para> +	  <command>maildrop</command> uses the following concept of true/false: +	  an empty text +	  literal, or a text literal that consists of the single character "0" is a +	  logical false value. Anything else is a logical true value.</para>        </refsect3> @@ -1629,7 +1651,7 @@ logical false value. Anything else is a logical true value.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  <replaceable>expression1</replaceable> <token><</token> <replaceable>expression2</replaceable>  <replaceable>expression1</replaceable> <token><=</token> <replaceable>expression2</replaceable> @@ -1642,22 +1664,22 @@ logical false value. Anything else is a logical true value.</para>  <replaceable>expression1</replaceable> <token>!=</token> <replaceable>expression2</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -These operators compare their left hand side expression against their right -hand side. These operators compare the numerical values of each side, as -floating point numbers. If the numbers compare as indicated, the result of -the comparison is the text string "1", otherwise it is the text -string 0.</para> +	  These operators compare their left hand side expression against their right +	  hand side. These operators compare the numerical values of each side, as +	  floating point numbers. If the numbers compare as indicated, the result of +	  the comparison is the text string "1", otherwise it is the text +	  string 0.</para>  	<note>  	  <para>Ccomparisons are not associative: -"<literal>a < b < c</literal>" is an error. -If it is absolutely necessary, use -"<literal>(a < b) < c</literal>".</para> +	    "<literal>a < b < c</literal>" is an error. +	    If it is absolutely necessary, use +	    "<literal>(a < b) < c</literal>".</para>  	</note>        </refsect3> @@ -1666,7 +1688,7 @@ If it is absolutely necessary, use  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  <replaceable>expression1</replaceable> <token>lt</token> <replaceable>expression2</replaceable>  <replaceable>expression1</replaceable> <token>le</token> <replaceable>expression2</replaceable> @@ -1679,23 +1701,23 @@ If it is absolutely necessary, use  <replaceable>expression1</replaceable> <token>ne</token> <replaceable>expression2</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -These operators compare their left hand side expression against their right -hand side. These operators compare each side as text strings (alphabetically, -although the text may include anything). If the text strings compare as -indicated, the result of the comparison is the text string "1", otherwise it -is the text string 0.</para> +	  These operators compare their left hand side expression against their right +	  hand side. These operators compare each side as text strings (alphabetically, +	  although the text may include anything). If the text strings compare as +	  indicated, the result of the comparison is the text string "1", otherwise it +	  is the text string 0.</para>  	<note>  	  <para> -Comparisons are not associative: "<literal>a lt b lt c</literal>" -is an error. If it is -absolutely necessary, use "<literal>(a lt b) lt c</literal>". -(But why would you?).</para> +	    Comparisons are not associative: "<literal>a lt b lt c</literal>" +	    is an error. If it is +	    absolutely necessary, use "<literal>(a lt b) lt c</literal>". +	    (But why would you?).</para>  	</note>        </refsect3> @@ -1704,16 +1726,16 @@ absolutely necessary, use "<literal>(a lt b) lt c</literal>".  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  <replaceable>expression1</replaceable> <token>|</token> <replaceable>expression2</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -This is the bitwise or operator. Its result is a 32 bit -integer, which is a bitwise-or combination of the left hand side and the -right hand side.</para> +	  This is the bitwise or operator. Its result is a 32 bit +	  integer, which is a bitwise-or combination of the left hand side and the +	  right hand side.</para>        </refsect3>        <refsect3> @@ -1721,16 +1743,16 @@ right hand side.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  <replaceable>expression1</replaceable> <token>&</token> <replaceable>expression2</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -This is the bitwise and operator. Its result is a 32 bit -integer, which is a bitwise-and combination of the left hand side and the -right hand side.</para> +	  This is the bitwise and operator. Its result is a 32 bit +	  integer, which is a bitwise-and combination of the left hand side and the +	  right hand side.</para>        </refsect3>        <refsect3> @@ -1738,7 +1760,7 @@ right hand side.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  <replaceable>expression1</replaceable> <token>+</token> <replaceable>expression2</replaceable>  <replaceable>expression1</replaceable> <token>-</token> <replaceable>expression2</replaceable> @@ -1747,12 +1769,12 @@ right hand side.</para>  <replaceable>expression1</replaceable> <token>/</token> <replaceable>expression2</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -These are numerical, floating point, operators.</para> +	  These are numerical, floating point, operators.</para>        </refsect3> @@ -1762,42 +1784,42 @@ These are numerical, floating point, operators.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  <replaceable>expression</replaceable> <token>=~</token> /<replaceable>pattern</replaceable>/:<replaceable>option</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The left hand side of the <token>=~</token> operator can be any expression. -The right hand -side is always a pattern specification. The result of the operator is the -weighted match of the pattern against -<replaceable>expression</replaceable> (if the options do not -specify weighted scoring, the result is simply 1 if the pattern was found, -0 if not).</para> +	  The left hand side of the <token>=~</token> operator can be any expression. +	  The right hand +	  side is always a pattern specification. The result of the operator is the +	  weighted match of the pattern against +	  <replaceable>expression</replaceable> (if the options do not +	  specify weighted scoring, the result is simply 1 if the pattern was found, +	  0 if not).</para>  	<para> -See "<ulink url="#patterns">Patterns</ulink>" for more information.</para> +	  See "<ulink url="#patterns">Patterns</ulink>" for more information.</para>        </refsect3>        <refsect3>  	<title>/pattern/:options - pattern match against message</title>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  /<replaceable>pattern</replaceable>/:<replaceable>option</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The result of this operator is the weighted match of the pattern against the -current message (if the options do not specify weighted scoring, the result -is simply 1 if the pattern was found, 0 if not).</para> +	  The result of this operator is the weighted match of the pattern against the +	  current message (if the options do not specify weighted scoring, the result +	  is simply 1 if the pattern was found, 0 if not).</para>  	<para> -See "<ulink url="#patterns">Patterns</ulink>" for more information.</para> +	  See "<ulink url="#patterns">Patterns</ulink>" for more information.</para>        </refsect3>        <refsect3> @@ -1805,114 +1827,114 @@ See "<ulink url="#patterns">Patterns</ulink>" for more information.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  <token>!</token> <replaceable>expression</replaceable>  <token>~</token> <replaceable>expression</replaceable> -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The result of the <token>!</token> -operator is a logical opposite of its right hand side -expression. If the right hand side expression evaluated to a logical true, -the result is a logical false. If it evaluated to a logical false, the result -is a logical true.</para> +	  The result of the <token>!</token> +	  operator is a logical opposite of its right hand side +	  expression. If the right hand side expression evaluated to a logical true, +	  the result is a logical false. If it evaluated to a logical false, the result +	  is a logical true.</para>  	<para> -<command>maildrop</command> uses the following concept of true/false: -an empty text -literal, or a text literal that consists of the single character "0" is a -logical false value. Anything else is a logical true value.</para> +	  <command>maildrop</command> uses the following concept of true/false: +	  an empty text +	  literal, or a text literal that consists of the single character "0" is a +	  logical false value. Anything else is a logical true value.</para>  	<para> -The result of the <token>~</token> -operator is a bitwise complement of its right hand -side expression. The right hand side expression is evaluated as a 32 bit -integer, and the result of this operator is a bitwise complement of the -result.</para> +	  The result of the <token>~</token> +	  operator is a bitwise complement of its right hand +	  side expression. The right hand side expression is evaluated as a 32 bit +	  integer, and the result of this operator is a bitwise complement of the +	  result.</para>        </refsect3>        <refsect3>  	<title>escape(string) - escape special characters in a string.</title>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  <function>escape</function>(<replaceable>expression</replaceable>) -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The <function>escape</function> function returns -its sole argument with every occurrence of a -special character prefixed by a backslash. A special character is any of the -following characters:</para> +	  The <function>escape</function> function returns +	  its sole argument with every occurrence of a +	  special character prefixed by a backslash. A special character is any of the +	  following characters:</para>  	<blockquote> -	    <informalexample> -	      <programlisting format="linespecific"> +	  <informalexample> +	    <programlisting>  |!$()[]\+*?.&;`'-~<>^{}" -</programlisting> -	    </informalexample> -	  </blockquote> +	    </programlisting> +	  </informalexample> +	</blockquote>  	<para> -This can used when <ulink url="#patmatch">matching pattern sections</ulink>, -and then taking one section and matching it again. For example:</para> +	  This can used when <ulink url="#patmatch">matching pattern sections</ulink>, +	  and then taking one section and matching it again. For example:</para>  	<blockquote> -	    <informalexample> -	      <programlisting format="linespecific"> +	  <informalexample> +	    <programlisting>  if ( /^From:\s*(.*)/ )  { -     MATCH1=escape($MATCH1) -     if ( /^Subject:.*$MATCH1/ ) -     { -        ... -     } +   MATCH1=escape($MATCH1) +   if ( /^Subject:.*$MATCH1/ ) +   { +      ... +   }  } -</programlisting> -	    </informalexample> -	  </blockquote> +	    </programlisting> +	  </informalexample> +	</blockquote>  	<para> -This example checks if the contents of the <literal>From:</literal> -header can also be found in the <literal>Subject:</literal> header. -If the <function>escape</function> function were not used, then any -special characters in the <literal>From:</literal> header that are also used -in regular -expressions, such as <token>*</token> -or <token>+</token>, would introduce unpredictable behavior, most -likely a syntax error.</para> +	  This example checks if the contents of the <literal>From:</literal> +	  header can also be found in the <literal>Subject:</literal> header. +	  If the <function>escape</function> function were not used, then any +	  special characters in the <literal>From:</literal> header that are also used +	  in regular +	  expressions, such as <token>*</token> +	  or <token>+</token>, would introduce unpredictable behavior, most +	  likely a syntax error.</para>  	<para> -The reason why this list of special characters also includes characters -not used in <command>maildrop</command>'s regular expressions is to allow -<command>maildrop</command>'s variables to be used on the command line of a -shell command -executed by the <command>xfilter</command> command, backtick characters, or -<command>to</command> or <command>cc</command> commands.</para> +	  The reason why this list of special characters also includes characters +	  not used in <command>maildrop</command>'s regular expressions is to allow +	  <command>maildrop</command>'s variables to be used on the command line of a +	  shell command +	  executed by the <command>xfilter</command> command, backtick characters, or +	  <command>to</command> or <command>cc</command> commands.</para>  	<para> -Although using data from an external data source is dangerous, and it may -result in inadvertent exploits, using the escape function should hopefully -result in fewer surprises.</para> +	  Although using data from an external data source is dangerous, and it may +	  result in inadvertent exploits, using the escape function should hopefully +	  result in fewer surprises.</para>        </refsect3>        <refsect3>  	<title>gdbmopen, gdbmclose, gdbmfetch, gdbmstore - GDBM support in -<command>maildrop</command></title> +	  <command>maildrop</command></title>  	<para> -These functions provide support for GDBM database files. See <ulink url="maildropgdbm.html"><citerefentry><refentrytitle>maildropgdbm</refentrytitle><manvolnum>5</manvolnum></citerefentry></ulink> -for more information.</para> +	  These functions provide support for GDBM database files. See <ulink url="maildropgdbm.html"><citerefentry><refentrytitle>maildropgdbm</refentrytitle><manvolnum>5</manvolnum></citerefentry></ulink> +	  for more information.</para>  	<note>  	  <para> -The system administrator can disable GDBM support in -<command>maildrop</command>, so these commands may not be available to -you.</para> +	    The system administrator can disable GDBM support in +	    <command>maildrop</command>, so these commands may not be available to +	    you.</para>  	</note>        </refsect3> @@ -1923,74 +1945,74 @@ you.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  if ( /^From:\s*(.*)/ )  { -     ADDR=getaddr($MATCH1) +   ADDR=getaddr($MATCH1)  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -This function is usually applied to a header that contains -<ulink url="http://www.rfc-editor.org/rfc/rfc2822.txt">RFC 2822</ulink> -addresses. It extracts the actual addresses from the -header, without any comments or extraneous punctuation. Each address is -followed by a newline character. For example, -if <replaceable>string</replaceable> contains:</para> -<blockquote> -	    <informalexample> -	      <programlisting format="linespecific"> +	  This function is usually applied to a header that contains +	  <ulink url="http://www.rfc-editor.org/rfc/rfc2822.txt">RFC 2822</ulink> +	  addresses. It extracts the actual addresses from the +	  header, without any comments or extraneous punctuation. Each address is +	  followed by a newline character. For example, +	  if <replaceable>string</replaceable> contains:</para> +	<blockquote> +	  <informalexample> +	    <programlisting>  joe@domain.com (Joe Brown), "Alex Smith" <alex@domain.com>, tom@domain.com -</programlisting> -	    </informalexample> -	  </blockquote> -<para> -The result of the <function>getaddr</function> function is the -following string:</para> -<blockquote> -	    <informalexample> -	      <programlisting format="linespecific"> +	    </programlisting> +	  </informalexample> +	</blockquote> +	<para> +	  The result of the <function>getaddr</function> function is the +	  following string:</para> +	<blockquote> +	  <informalexample> +	    <programlisting>  joe@domain.com<token><NL></token>alex@domain.com<token><NL></token>tom@domain.com<token><NL></token> -</programlisting> -	    </informalexample> -	  </blockquote> +	    </programlisting> +	  </informalexample> +	</blockquote>  	<note>  	  <para> -Because <function>getaddr</function>() interprets -<ulink url="http://www.rfc-editor.org/rfc/rfc822.txt">RFC 2822</ulink> -loosely, it is not -necessary to -strip off the "<literal>To:</literal>" or the "<literal>Cc:</literal>" -header from the string, before feeding it to -<function>getaddr()</function>. For example, the following snippet of code -takes all -addresses in the message, and concatenates them into a single string, -separated by spaces:</para> +	    Because <function>getaddr</function>() interprets +	    <ulink url="http://www.rfc-editor.org/rfc/rfc822.txt">RFC 2822</ulink> +	    loosely, it is not +	    necessary to +	    strip off the "<literal>To:</literal>" or the "<literal>Cc:</literal>" +	    header from the string, before feeding it to +	    <function>getaddr()</function>. For example, the following snippet of code +	    takes all +	    addresses in the message, and concatenates them into a single string, +	    separated by spaces:</para>  	  <blockquote> -	      <informalexample> -		<programlisting format="linespecific"> +	    <informalexample> +	      <programlisting>  ADDRLIST=""  foreach /^(To|Cc): .*/  {      foreach (getaddr $MATCH) =~ /.+/      { -       ADDRLIST="$ADDRLIST $MATCH" +        ADDRLIST="$ADDRLIST $MATCH"      }  } -</programlisting> -	      </informalexample> -	    </blockquote> +	      </programlisting> +	    </informalexample> +	  </blockquote>  	</note>  	<note>  	  <para> -In certain rare situations, -<ulink url="http://www.rfc-editor.org/rfc/rfc822.txt">RFC 2822</ulink> allows -spaces to be included in E-mail addresses, so this example is just -educational.</para> +	    In certain rare situations, +	    <ulink url="http://www.rfc-editor.org/rfc/rfc822.txt">RFC 2822</ulink> allows +	    spaces to be included in E-mail addresses, so this example is just +	    educational.</para>  	</note>        </refsect3> @@ -1998,51 +2020,51 @@ educational.</para>  	<title>hasaddr(string) - Search for an address.</title>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  if ( hasaddr(<replaceable>string</replaceable>) )  {     ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -"<replaceable>string</replaceable>" is of the form -<literal>user@domain</literal>. The hasaddr -function returns 1 if this address is included in any <literal>To:</literal>, -<literal>Cc:</literal>,<literal> Resent-To:</literal>, or <literal>Resent-Cc:</literal>, header -in the message, otherwise this function returns 0.</para> +	  "<replaceable>string</replaceable>" is of the form +	  <literal>user@domain</literal>. The hasaddr +	  function returns 1 if this address is included in any <literal>To:</literal>, +	  <literal>Cc:</literal>,<literal> Resent-To:</literal>, or <literal>Resent-Cc:</literal>, header +	  in the message, otherwise this function returns 0.</para>  	<para> -This is more than just a simple text search. Each header is parsed -according to <literal>RFC822</literal>. Addresses found in the header are -extracted, ignoring all comments and names. The remaining addresses are -checked, and if "<replaceable>string</replaceable>" is one of them, -<function>hasaddr</function> returns 1, -otherwise it returns 0.</para> +	  This is more than just a simple text search. Each header is parsed +	  according to <literal>RFC822</literal>. Addresses found in the header are +	  extracted, ignoring all comments and names. The remaining addresses are +	  checked, and if "<replaceable>string</replaceable>" is one of them, +	  <function>hasaddr</function> returns 1, +	  otherwise it returns 0.</para>  	<para>The comparison is case-insensitive. This actually violates -<literal>RFC822</literal> (and several others) a little bit, because the user part -of the address may be (but is not required to be) case sensitive.</para> +	  <literal>RFC822</literal> (and several others) a little bit, because the user part +	  of the address may be (but is not required to be) case sensitive.</para>        </refsect3>        <refsect3>  	<title>length (string) - length of a string</title>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  if (length(<replaceable>string</replaceable>) > 80)  {     ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The <function>length</function> function returns the number of characters in -<replaceable>string</replaceable>.</para> +	  The <function>length</function> function returns the number of characters in +	  <replaceable>string</replaceable>.</para>        </refsect3>        <refsect3> @@ -2050,76 +2072,76 @@ The <function>length</function> function returns the number of characters in  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  if (lookup(<replaceable>expr</replaceable>, <filename>file</filename>, "<replaceable>option</replaceable>"))  {     ...  } -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -<replaceable>expr</replaceable> is any expression. -<filename>filename</filename> is a name of a file containing -a list of patterns. Note that <filename>filename</filename> is relative to the -current directory, which is the home directory of the user when -<command>maildrop</command> runs in delivery mode, or embedded mode. <command>maildrop</command> then -reads the file. -Blank lines will be ignored, as well as any lines that begin -with the # character (comments).</para> +	  <replaceable>expr</replaceable> is any expression. +	  <filename>filename</filename> is a name of a file containing +	  a list of patterns. Note that <filename>filename</filename> is relative to the +	  current directory, which is the home directory of the user when +	  <command>maildrop</command> runs in delivery mode, or embedded mode. <command>maildrop</command> then +	  reads the file. +	  Blank lines will be ignored, as well as any lines that begin +	  with the # character (comments).</para>  	<para>Leading whitespace (but not trailing whitespace, take care) is removed, -and the remaining contents of each line are interpreted as a pattern which is -matched against <replaceable>expr</replaceable>. -As soon as the match is found, <function>lookup</function> -returns "1". If no match is found after reading the entire file, -<function>lookup</function> returns "0". For example:</para> +	  and the remaining contents of each line are interpreted as a pattern which is +	  matched against <replaceable>expr</replaceable>. +	  As soon as the match is found, <function>lookup</function> +	  returns "1". If no match is found after reading the entire file, +	  <function>lookup</function> returns "0". For example:</para>  	<blockquote> -	    <informalexample> -	      <programlisting format="linespecific"> +	  <informalexample> +	    <programlisting>  if ( /^To:\s*(.*)/ && lookup( $MATCH1, "badto.dat" ))  { -   exit +    exit  } -</programlisting> -	    </informalexample> -	  </blockquote> +	    </programlisting> +	  </informalexample> +	</blockquote>  	<para> -The file badto.dat contains the following two lines:</para> +	  The file badto.dat contains the following two lines:</para>  	<blockquote> -	    <informalexample> -	      <programlisting format="linespecific"> +	  <informalexample> +	    <programlisting>  friend@public  ^[^@]*$ -</programlisting> -	    </informalexample> -	  </blockquote> +	    </programlisting> +	  </informalexample> +	</blockquote>  	<para> -If a message has a <literal>To:</literal> -header that contains the text "<literal>friend@public</literal>", or does -not contain at least one <token>@</token> character, then the message will -be silently -dropped on the floor ( <command>maildrop</command> will terminate without -delivering the -message anywhere).</para> +	  If a message has a <literal>To:</literal> +	  header that contains the text "<literal>friend@public</literal>", or does +	  not contain at least one <token>@</token> character, then the message will +	  be silently +	  dropped on the floor ( <command>maildrop</command> will terminate without +	  delivering the +	  message anywhere).</para>  	<para> -<replaceable>options</replaceable> are the pattern matching options -to use. The only supported -option is "D" (the rest are meaningless, in this case).</para> +	  <replaceable>options</replaceable> are the pattern matching options +	  to use. The only supported +	  option is "D" (the rest are meaningless, in this case).</para>  	<note>  	  <para> -Be careful with discarding messages like that. Pattern matching can -be tricky, and a slight miscalculation can cause mail to be unintentionally -discarded. It is much desirable to first deliver message to a separate folder -or mailbox, and once the filter is verified to work correctly, change it so -the messages are discarded completely.</para> +	    Be careful with discarding messages like that. Pattern matching can +	    be tricky, and a slight miscalculation can cause mail to be unintentionally +	    discarded. It is much desirable to first deliver message to a separate folder +	    or mailbox, and once the filter is verified to work correctly, change it so +	    the messages are discarded completely.</para>  	</note>        </refsect3> @@ -2128,20 +2150,20 @@ the messages are discarded completely.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  foo=substr($foo, 1, 10) -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The <function>substr</function> function -extracts characters from <replaceable>string</replaceable> -beginning with character #<replaceable>start</replaceable>. -If <replaceable>count</replaceable> is -specified, at most <replaceable>count</replaceable> characters -starting at position <replaceable>start</replaceable> are kept, any excess is -trimmed.</para> +	  The <function>substr</function> function +	  extracts characters from <replaceable>string</replaceable> +	  beginning with character #<replaceable>start</replaceable>. +	  If <replaceable>count</replaceable> is +	  specified, at most <replaceable>count</replaceable> characters +	  starting at position <replaceable>start</replaceable> are kept, any excess is +	  trimmed.</para>        </refsect3>        <refsect3> @@ -2149,17 +2171,17 @@ trimmed.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  foo=time -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -The <function>time</function> function returns the current time, in -seconds, since -January 1, 1970. This function is useful when using GDBM files. See <ulink url="maildropex.html"><citerefentry><refentrytitle>maildropex</refentrytitle><manvolnum>7</manvolnum></citerefentry></ulink> -for an example of using the <function>time</function> function.</para> +	  The <function>time</function> function returns the current time, in +	  seconds, since +	  January 1, 1970. This function is useful when using GDBM files. See <ulink url="maildropex.html"><citerefentry><refentrytitle>maildropex</refentrytitle><manvolnum>7</manvolnum></citerefentry></ulink> +	  for an example of using the <function>time</function> function.</para>        </refsect3>        <refsect3> @@ -2167,16 +2189,16 @@ for an example of using the <function>time</function> function.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  foo=tolower(<replaceable>string</replaceable>) -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -This function returns the <replaceable>string</replaceable> -with all uppercase characters -replaced by lowercase characters.</para> +	  This function returns the <replaceable>string</replaceable> +	  with all uppercase characters +	  replaced by lowercase characters.</para>        </refsect3>        <refsect3> @@ -2184,16 +2206,16 @@ replaced by lowercase characters.</para>  	<blockquote>  	  <informalexample> -	    <programlisting format="linespecific"> +	    <programlisting>  foo=toupper(<replaceable>string</replaceable>) -</programlisting> +	    </programlisting>  	  </informalexample>  	</blockquote>  	<para> -This function returns the <replaceable>string</replaceable> -with all lowercase characters -replaced by uppercase characters.</para> +	  This function returns the <replaceable>string</replaceable> +	  with all lowercase characters +	  replaced by uppercase characters.</para>        </refsect3>      </refsect2> @@ -2201,18 +2223,18 @@ replaced by uppercase characters.</para>        <title>Statements</title>        <para> -The <systemitem class="resource">filter file</systemitem> is read by -<command>maildrop</command> -(<filename>$HOME/.mailfilter</filename> or another file), and it -contains filtering -statements, one per line. The filtering language used by -<command>maildrop</command> has -a loosely - defined grammatical structure.</para> +	The <systemitem class="resource">filter file</systemitem> is read by +	<command>maildrop</command> +	(<filename>$HOME/.mailfilter</filename> or another file), and it +	contains filtering +	statements, one per line. The filtering language used by +	<command>maildrop</command> has +	a loosely - defined grammatical structure.</para>        <para>Statements are listed one per line. Multiple statements may be listed on -the same line by separating them with semicolons. To continue a long -statement on the next line, terminate the line with a backslash -character.</para> +	the same line by separating them with semicolons. To continue a long +	statement on the next line, terminate the line with a backslash +	character.</para>      </refsect2>    </refsect1> @@ -2220,27 +2242,27 @@ character.</para>      <title>BUGS</title>      <para> -If <function>getaddr</function>() or <function>hasaddr</function>() -functions are used on broken headers, the results -are unpredictable.</para> +      If <function>getaddr</function>() or <function>hasaddr</function>() +      functions are used on broken headers, the results +      are unpredictable.</para>      <para><function>hasaddr</function>() is completely case insensitive. This -actually violates a few -RFCs, because the userid portion of the address could be case-sensitive, but -it's not in too many cases, so there.</para> +      actually violates a few +      RFCs, because the userid portion of the address could be case-sensitive, but +      it's not in too many cases, so there.</para>    </refsect1>    <refsect1>      <title>SEE ALSO</title>      <para> -<ulink url="lockmail.html"><citerefentry><refentrytitle>lockmail</refentrytitle><manvolnum>1</manvolnum></citerefentry></ulink>, -<ulink url="maildrop.html"><citerefentry><refentrytitle>maildrop</refentrytitle><manvolnum>1</manvolnum></citerefentry></ulink>, -<ulink url="maildropgdbm.html"><citerefentry><refentrytitle>maildropgdbm</refentrytitle><manvolnum>5</manvolnum></citerefentry></ulink>, -<ulink url="maildirquota.html"><citerefentry><refentrytitle>maildirquota</refentrytitle><manvolnum>8</manvolnum></citerefentry></ulink>, -<ulink url="reformail.html"><citerefentry><refentrytitle>reformail</refentrytitle><manvolnum>1</manvolnum></citerefentry></ulink>, -<citerefentry><refentrytitle>egrep</refentrytitle><manvolnum>1</manvolnum></citerefentry>, -<citerefentry><refentrytitle>sendmail</refentrytitle><manvolnum>8</manvolnum></citerefentry>. -</para> +      <ulink url="lockmail.html"><citerefentry><refentrytitle>lockmail</refentrytitle><manvolnum>1</manvolnum></citerefentry></ulink>, +      <ulink url="maildrop.html"><citerefentry><refentrytitle>maildrop</refentrytitle><manvolnum>1</manvolnum></citerefentry></ulink>, +      <ulink url="maildropgdbm.html"><citerefentry><refentrytitle>maildropgdbm</refentrytitle><manvolnum>5</manvolnum></citerefentry></ulink>, +      <ulink url="maildirquota.html"><citerefentry><refentrytitle>maildirquota</refentrytitle><manvolnum>8</manvolnum></citerefentry></ulink>, +      <ulink url="reformail.html"><citerefentry><refentrytitle>reformail</refentrytitle><manvolnum>1</manvolnum></citerefentry></ulink>, +      <citerefentry><refentrytitle>egrep</refentrytitle><manvolnum>1</manvolnum></citerefentry>, +      <citerefentry><refentrytitle>sendmail</refentrytitle><manvolnum>8</manvolnum></citerefentry>. +    </para>    </refsect1>  </refentry> diff --git a/maildrop/testsuite.in b/maildrop/testsuite.in index 967cd8f..81b80a7 100644 --- a/maildrop/testsuite.in +++ b/maildrop/testsuite.in @@ -56,11 +56,28 @@ EOF  fi +rm -rf testsuite.maildir +../maildir/maildirmake ./testsuite.maildir + +cat <<EOF >testsuite.recipe + +FLAGS="S" +to "$PWD/testsuite.maildir" +EOF + +chmod go-rw testsuite.recipe + +echo "To: testsuite" | ./maildrop ./testsuite.recipe + +echo "2,S" >testsuite.chk + +ls testsuite.maildir/cur | sed 's/.*://' | diff -U 3 - testsuite.chk +  if test "@maildirquota@" = 1  then  	rm -rf testsuite.maildir  	../maildir/maildirmake ./testsuite.maildir -	 +  	cat <<EOF >testsuite.recipe  	MAILDIRQUOTA="1C" @@ -530,3 +547,4 @@ rm -f testsuite.chk  rm -f testmailbot.msg  rm -f testmailbot.1  rm -f testsuite.dat +rm -rf testsuite.maildir diff --git a/maildrop/testsuite2 b/maildrop/testsuite2 index 8d08e1b..1a87854 100644 --- a/maildrop/testsuite2 +++ b/maildrop/testsuite2 @@ -250,6 +250,7 @@ if (/^X-Spam-Flag/)  {      EXITCODE=1  } +exit  EOF  chmod 600 testsuite1.filter | 
