A Challenge to Rick: a really weird .forward file.

Ted Potter tpotter at techmarin.com
Tue Mar 8 05:04:58 UTC 2005


On Mon, 2005-03-07 at 18:41, Rick Stevens wrote:
> Waldher, Travis R wrote:
> > Here's the deal... I have a .forward file as follows:
> > 
> > "|IFS=' '&&p=/usr/bin/procmail&&test -f $p&&exec $p -Yf-||exit 75
> > #username"
> > 
> > The catch is, this causes sendmail 8.12 to not work (bounces email back
> > as undeliverable), but is required by postfix on other systems to let
> > procmail do it's job.
> > 
> > Meaning, I have to have that line (or some form of it) but on the other
> > hand, I can't either.  Bad catch 22.
> > 
> > My biggest problem, I have NO idea what that line is doing and neither
> > does anyone I work with.
> > 
> > Also, can I add an algorithm so that when it's called, can it do nothing
> > if it's a sendmail based system, and execute that line if it's postfix?
> > 
> > Thanks in advance
> 
> What do I get if I figure it out?  Do I get a pony? Do I?  Do I? :-)
> 
> Just break it down, Travis.  The "&&" is a standard shell convention for
> "if this is true, do A, AND if A is true, do B, AND if B is true...".
> In other words, the next part of the pipe (reading left to right) is
> executed ONLY if the previous part returned a "true" (return value of
> 0).  Conversely, "||" means "OR": "if A fails, do B"
> 
> So, the first bit sets the input field separator (IFS) to a space (see
> "Shell Variables" in "man bash").
> 
> If that was successful (and it will be), it sets "p" to the value
> "/usr/bin/procmail".  This is simply so the script doesn't have 
> "/usr/bin/procmail" all over the place.
> 
> If that was successful (again, it should be), then it checks to see if
> "/usr/bin/procmail" is a regular file.  I think that's bad.  It should
> be "test -x $p", or "if /usr/bin/procmail is executable".
> 
> If it is a regular file (or executable with my change), then execute it
> and pass it the arguments "-Yf-" (methinks that should be "-Yf -").
> "-Y" to procmail says "assume traditional mailbox format", the "-f -"
> (note the space between "f" and the second dash) means "update the
> timestamp of the "From " line, if any.
> 
> The || means "if any of the preceeding stuff fails, exit with a value of
> 75" (which is "EX_TEMPFAIL" from /usr/include/sysexits.h).  Sendmail 
> expects any delivery agent (e.g. procmail) to return a value from
> /usr/include/sysexits.h.
> 
> The "#username" bit I'm a bit confused on, but I think it's supposed to
> be "$username" (the username the message is meant for).
> 
> In pseudo-code:
> 
>      If setting the input field separator to a space is OK, AND
> 	If setting "p" to /usr/bin/procmail is OK, AND
> 	    If "/usr/bin/procmail" is a file (executable), THEN
> 		execute "/usr/bin/procmail -Yf - $username"
> 		return whatever procmail generates for a result code
> 	    Else
> 		exit with EX_TEMPFAIL (75)
> 	    Fi
> 	Else
> 	    exit with EX_TEMPFAIL (75)
> 	Fi
>      Else
> 	exit with EX_TEMPFAIL (75)
>      Fi
> 
> Does that make sense to you?  Do I get the pony?
> ----------------------------------------------------------------------
> - Rick Stevens, Senior Systems Engineer     rstevens at vitalstream.com -
> - VitalStream, Inc.                       http://www.vitalstream.com -
> -                                                                    -
> -  The problem with being poor is that it takes up all of your time  -
> ----------------------------------------------------------------------

for that one you should get the whole ranch!!  :-)






-- 
Ted Potter
tpotter at techmarin.com
www.techmarin.com




More information about the Redhat-install-list mailing list