only to Postfix daemons configured in master.cf; hyperlink
the parameter name in documentation. Files: proto/postconf.proto,
mantools/postlink, daemon manpages.
+
+ Cleanup: allow whitespace between $[{(], parameter name,
+ and [:?)}]. This allows making complex expressions more
+ readable with line breaks. File: util/mac_expand.c.
+
+ Cleanup: don't initialize the service_name parameter with
+ the process_name value. Files: postconf/postconf.[hc],
+ postconf/postconf_builtin.c.
+
+20180121
+
+ Bugfix (introduced: 20180106): too many arguments for format
+ string. File: local/mailbox.c.
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
+ -o syslog_name=postfix/$service_name
# -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq unix n - n - - showq
error unix - - n - - error
<DT><b><a name="service_name">service_name</a>
(read-only)</b></DT><DD>
-<p>
-The <a href="master.5.html">master.cf</a> service name of a Postfix daemon process.
-</p>
+<p> The <a href="master.5.html">master.cf</a> service name of a Postfix daemon process. This
+can be used to distinguish the logging from different services that
+use the same program name. </p>
+
+<p> Example <a href="master.5.html">master.cf</a> entries: </p>
+
+<pre>
+# Distinguish inbound MTA logging from submission and smtps logging.
+smtp inet n - n - - smtpd
+submission inet n - n - - smtpd
+ -o <a href="postconf.5.html#syslog_name">syslog_name</a>=postfix/$<a href="postconf.5.html#service_name">service_name</a>
+smtps inet n - n - - smtpd
+ -o <a href="postconf.5.html#syslog_name">syslog_name</a>=postfix/$<a href="postconf.5.html#service_name">service_name</a>
+</pre>
+
+<pre>
+# Distinguish outbound MTA logging from inbound relay logging.
+smtp unix - - n - - smtp
+relay unix - - n - - smtp
+ -o <a href="postconf.5.html#syslog_name">syslog_name</a>=postfix/$<a href="postconf.5.html#service_name">service_name</a>
+</pre>
</DD>
the Postfix \fBsendmail\fR(1) command. This command can be used to
submit mail into the Postfix queue.
.SH service_name (read\-only)
-The master.cf service name of a Postfix daemon process.
+The master.cf service name of a Postfix daemon process. This
+can be used to distinguish the logging from different services that
+use the same program name.
+.PP
+Example master.cf entries:
+.PP
+.nf
+.na
+.ft C
+# Distinguish inbound MTA logging from submission and smtps logging.
+smtp inet n \- n \- \- smtpd
+submission inet n \- n \- \- smtpd
+ \-o syslog_name=postfix/$service_name
+smtps inet n \- n \- \- smtpd
+ \-o syslog_name=postfix/$service_name
+.fi
+.ad
+.ft R
+.PP
+.nf
+.na
+.ft C
+# Distinguish outbound MTA logging from inbound relay logging.
+smtp unix \- \- n \- \- smtp
+relay unix \- \- n \- \- smtp
+ \-o syslog_name=postfix/$service_name
+.fi
+.ad
+.ft R
.SH service_throttle_time (default: 60s)
How long the Postfix \fBmaster\fR(8) waits before forking a server that
appears to be malfunctioning.
%PARAM service_name read-only
-<p>
-The master.cf service name of a Postfix daemon process.
-</p>
+<p> The master.cf service name of a Postfix daemon process. This
+can be used to distinguish the logging from different services that
+use the same program name. </p>
+
+<p> Example master.cf entries: </p>
+
+<pre>
+# Distinguish inbound MTA logging from submission and smtps logging.
+smtp inet n - n - - smtpd
+submission inet n - n - - smtpd
+ -o syslog_name=postfix/$service_name
+smtps inet n - n - - smtpd
+ -o syslog_name=postfix/$service_name
+</pre>
+
+<pre>
+# Distinguish outbound MTA logging from inbound relay logging.
+smtp unix - - n - - smtp
+relay unix - - n - - smtp
+ -o syslog_name=postfix/$service_name
+</pre>
%PARAM process_id read-only
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20180114"
+#define MAIL_RELEASE_DATE "20180121"
#define MAIL_VERSION_NUMBER "3.3"
#ifdef SNAPSHOT
int deliver_status;
int copy_flags;
VSTRING *biff;
- off_t end;
+ off_t end;
struct stat st;
uid_t spool_uid;
gid_t spool_gid;
msg_warn("specify \"%s = no\" to ignore mailbox ownership mismatch",
VAR_STRICT_MBOX_OWNER);
} else {
- if ((end = vstream_fseek(mp->fp, (off_t) 0, SEEK_END)) < 0)
- msg_fatal("seek mailbox file %s: %m", myname, mailbox);
+ if ((end = vstream_fseek(mp->fp, (off_t) 0, SEEK_END)) < 0)
+ msg_fatal("seek mailbox file %s: %m", mailbox);
mail_copy_status = mail_copy(COPY_ATTR(state.msg_attr), mp->fp,
copy_flags, "\n", why);
}
pcf_read_parameters();
if (override_params)
pcf_set_parameters(override_params->argv);
- pcf_register_builtin_parameters(basename(argv[0]), basename(argv[0]),
- getpid());
+ pcf_register_builtin_parameters(basename(argv[0]), getpid());
pcf_register_service_parameters();
pcf_register_user_parameters();
if (pcf_cmd_mode & PCF_MASTER_FLD)
if (override_params)
pcf_set_parameters(override_params->argv);
}
- pcf_register_builtin_parameters(basename(argv[0]), basename(argv[0]),
- getpid());
+ pcf_register_builtin_parameters(basename(argv[0]), getpid());
/*
* Add service-dependent parameters (service names from master.cf)
/*
* postconf_builtin.c.
*/
-extern void pcf_register_builtin_parameters(const char *, const char *, pid_t);
+extern void pcf_register_builtin_parameters(const char *, pid_t);
/*
* postconf_service.c.
/* SYNOPSIS
/* #include <postconf.h>
/*
-/* void pcf_register_builtin_parameters(procname, servname, pid)
+/* void pcf_register_builtin_parameters(procname, pid)
/* const char *procname;
-/* const char *servname;
/* pid_t pid;
/* DESCRIPTION
/* pcf_register_builtin_parameters() initializes the global
/* Arguments:
/*.IP procname
/* Provides the default value for the "process_name" parameter.
-/*.IP servname
-/* Provides the default value for the "service_name" parameter.
/*.IP pid
/* Provides the default value for the "process_id" parameter.
/* DIAGNOSTICS
/* pcf_register_builtin_parameters - add built-ins to the global name space */
-void pcf_register_builtin_parameters(const char *procname,
- const char *servname, pid_t pid)
+void pcf_register_builtin_parameters(const char *procname, pid_t pid)
{
const char *myname = "pcf_register_builtin_parameters";
const CONFIG_TIME_TABLE *ctt;
PCF_PARAM_TABLE_ENTER(pcf_param_table, pcf_adhoc_procname.name,
PCF_PARAM_FLAG_BUILTIN | PCF_PARAM_FLAG_READONLY,
(void *) &pcf_adhoc_procname, pcf_conv_str_parameter);
- pcf_adhoc_servname.defval = mystrdup(servname);
+ pcf_adhoc_servname.defval = mystrdup("");
PCF_PARAM_TABLE_ENTER(pcf_param_table, pcf_adhoc_servname.name,
PCF_PARAM_FLAG_BUILTIN | PCF_PARAM_FLAG_READONLY,
(void *) &pcf_adhoc_servname, pcf_conv_str_parameter);
* Named parameter.
*/
else {
+ char *start;
/*
* Look for the ? or : operator. In case of a syntax error,
* return without doing damage, and issue a warning instead.
*/
+ start = (cp += strspn(cp, MAC_EXP_WHITESPACE));
for ( /* void */ ; /* void */ ; cp++) {
- if ((ch = *cp) == 0) {
+ if ((ch = cp[tmp_len = strspn(cp, MAC_EXP_WHITESPACE)]) == 0) {
+ *cp = 0;
lookup_mode = MAC_EXP_MODE_USE;
break;
}
if (ch == '?' || ch == ':') {
*cp++ = 0;
+ cp += tmp_len;
lookup_mode = MAC_EXP_MODE_TEST;
break;
}
+ ch = *cp;
if (!ISALNUM(ch) && ch != '_') {
MAC_EXP_ERR_RETURN(mc, "attribute name syntax error at: "
"\"...%.*s>>>%.20s\"",
* Look up the named parameter. Todo: allow the lookup function
* to specify if the result is safe for $name expanson.
*/
- lookup = mc->lookup(vstring_str(buf), lookup_mode, mc->context);
+ lookup = mc->lookup(start, lookup_mode, mc->context);
}
/*
name1 = name1-value
+$name1
$(name1
-$(name )
+$(name1)
+$( name1)
+$(name1 )
+$(na me1)
+${na me1}
${${name1} != {}?name 1 defined, |$name1|$name2|}
${ ${name1} != {}?name 1 defined, |$name1|$name2|}
${ ${name1} ?name 1 defined, |$name1|$name2|}
<< name1 = name1-value
<<
+<< $name1
+stat=0 result=name1-value
<< $(name1
unknown: warning: truncated macro reference: "$(name1"
stat=1 result=
-<< $(name )
-unknown: warning: attribute name syntax error at: "...name>>> "
+<< $(name1)
+stat=0 result=name1-value
+<< $( name1)
+stat=0 result=name1-value
+<< $(name1 )
+stat=0 result=name1-value
+<< $(na me1)
+unknown: warning: attribute name syntax error at: "...na>>> me1"
+stat=1 result=
+<< ${na me1}
+unknown: warning: attribute name syntax error at: "...na>>> me1"
stat=1 result=
<< ${${name1} != {}?name 1 defined, |$name1|$name2|}
unknown: warning: attribute name syntax error at: "...>>>${name1} != {}?name "
stat=1 result=
<< ${ ${name1} != {}?name 1 defined, |$name1|$name2|}
-unknown: warning: attribute name syntax error at: "...>>> ${name1} != {}?name"
+unknown: warning: attribute name syntax error at: "... >>>${name1} != {}?name "
stat=1 result=
<< ${ ${name1} ?name 1 defined, |$name1|$name2|}
-unknown: warning: attribute name syntax error at: "...>>> ${name1} ?name 1 de"
+unknown: warning: attribute name syntax error at: "... >>>${name1} ?name 1 def"
stat=1 result=
<< ${{$name1} ? {name 1 defined, |$name1|$name2|} : {name 1 undefined, |$name1|$name2|} }
unknown: warning: "==" or "!="" or "<"" or "<="" or ">="" or ">" expected at: "...$name1}>>>? {name 1 defined, |"
unknown: warning: "==" or "!="" or "<"" or "<="" or ">="" or ">" expected at: "...text}>>>= {}"
stat=1 result=
<< ${{${ name1}} == {}}
-unknown: warning: attribute name syntax error at: "...>>> name1"
-stat=1 result=
+stat=0 result=
<< ${name1?{${ name1}}:{${name2}}}
-unknown: warning: attribute name syntax error at: "...>>> name1"
-stat=1 result=
+stat=0 result=name1-value
<< ${name2?{${ name1}}:{${name2}}}
stat=2 result=
<< ${name2?{${name1}}:{${ name2}}}
-unknown: warning: attribute name syntax error at: "...>>> name2"
-stat=1 result=
+stat=2 result=
<< ${name2:{${name1}}:{${name2}}}
unknown: warning: unexpected input at: "...${name1}}>>>:{${name2}}"
stat=1 result=name1-value