variable expansion not working in $myauthservid definition?

Mark Martinec Mark.Martinec+amavis at ijs.si
Mon Apr 25 15:38:35 CEST 2016


On 2016-04-07 20:37, jasonsu at mail-central.com wrote:

> On Thu, Apr 7, 2016, at 11:10 AM, A. Schulze wrote:
>> use double quotes to allow variable expansion.
>> single quotes force use as literal string as you see...
>> 
>> -> $myauthservid = "amavisd.${$mydomain}";
> 
> If I switch
> 			my $mydomain = 'mail01.example.com';
> 			$myhostname = 'mail01.example.com';
> 	75	-	$myauthservid = 'amavisd.${$mydomain}';
> 		+	my $myauthservid = "amavisd.${$mydomain}";
> 
> I get an error on launch
> 
> 	Error in config file "/etc/amavisd/amavisd.conf": Can't use string
> ("mail01.example.com") as a SCALAR ref while "strict refs" in use at
> /etc/amavisd/amavisd.conf line 75.

In the "amavisd.${$mydomain}" you are trying to dereference $mydomain 
twice,
that is wrong.

This is probably what was intended:

   $myauthservid = "amavisd.$mydomain";

or (same thing, perl syntax alternative):

   $myauthservid = "amavisd.${mydomain}";




> At the top of the config file I see
> 	use strict;
> Do I get rid of the 'use strict', or change something in the config 
> variable ?

Don't remove the 'use strict'.


> And as for single- vs double- quote, what should these be then
> 
> $smtpd_greeting_banner = '${$myhostname} ${protocol} ${product} service 
> ready';
> $smtpd_quit_banner = '${$myhostname} ${product} closing transmission 
> channel';
> 
> ?

This is not a default setting for these two variables and is incorrect.
There is an extra $ at the beginning, it should not be there.

Here is a default setting:

   $smtpd_greeting_banner = '${helo-name} ${protocol} ${product} service 
ready';
   $smtpd_quit_banner = '${helo-name} ${product} closing transmission 
channel';

Note that this is a plain string where perl does not do any expansion.
Actually these two settings (and only these two) are special in that 
they
specify a template, and amavisd later manually replaces the placeholders
with actual values. This is not an example of a perl 'interpolation' 
i.e.
variable expansion within a double-quoted string.

The $smtpd_greeting_banner and $smtpd_quit_banner recognize the 
following
placeholders / replacements of a form ${name} :

   'helo-name'    => $myheloname,
   'myhostname'   => idn_to_ascii(c('myhostname')),
   'version'      => $myversion,
   'version-id'   => $myversion_id,
   'version-date' => $myversion_date,
   'product'      => $myproduct_name,
   'protocol'     => $lmtp?'LMTP':'ESMTP' }->{lc($1.$2)}

This complication is there to allow for lazy evaluation, as some of
these values are not yet available at the configuration time, but only
when a mail arrives.

The $myauthservid on the other hand does not have such special 
semantics,
it is a plain string. The usual perl syntax rules apply when assigning
to it (double quotes interpolate variables, single quotes do not).

   Mark


More information about the amavis-users mailing list