master.cf options parser didn't support "clusters" of
command-line option letters. Files: postconf/postconf_master.c,
postconf/test40.ref.
+
+20130105
+
+ Undo a change made around 20121224, and always whitelist
+ configuration parameter names for legacy-style proxy:ldap:prefix
+ etc. lookup tables. Files: postconf/postconf_dbms.c,
+ postconf/test28.ref, postconf/test29.ref, postconf/Makefile.in.
+
+20130107
+
+ Factor out the master.cf line parser so that it can be
+ reused for "postconf -Me". File: postconf/postconf_master.c.
+
+20130113
+
+ Start of work on integrating a pile of new code.
set up your XAUTHORITY environment variable before starting Postfix.
</p>
+<p>
+Note: the command is subject to $name expansion, before it is
+passed to the default commmand interpreter. Specify "$$" to
+produce a single "$" character.
+</p>
+
<p>
Example:
</p>
the process marches on. If you use an X-based debugger, be sure to
set up your XAUTHORITY environment variable before starting Postfix.
.PP
+Note: the command is subject to $name expansion, before it is
+passed to the default commmand interpreter. Specify "$$" to
+produce a single "$" character.
+.PP
Example:
.PP
.nf
set up your XAUTHORITY environment variable before starting Postfix.
</p>
+<p>
+Note: the command is subject to $name expansion, before it is
+passed to the default commmand interpreter. Specify "$$" to
+produce a single "$" character.
+</p>
+
<p>
Example:
</p>
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20130101"
+#define MAIL_RELEASE_DATE "20130113"
#define MAIL_VERSION_NUMBER "2.10"
#ifdef SNAPSHOT
test28: $(PROG) test28.ref
rm -f main.cf master.cf
touch main.cf master.cf
- echo 'xx = ldap:foo' >> main.cf
+ echo 'xx = proxy:ldap:foo' >> main.cf
echo 'foo_domain = bar' >> main.cf
echo 'header_checks = ldap:hh' >> main.cf
echo 'hh_domain = whatever' >> main.cf
test29: $(PROG) test29.ref
rm -f main.cf master.cf
touch main.cf master.cf
- echo 'ldapxx = ldap:ldapfoo' >> main.cf
+ echo 'ldapxx = proxy:ldap:ldapfoo' >> main.cf
echo 'ldapfoo_domain = bar' >> main.cf
echo 'ldapfoo_domainx = bar' >> main.cf
- echo 'mysqlxx = mysql:mysqlfoo' >> main.cf
+ echo 'mysqlxx = proxy:mysql:mysqlfoo' >> main.cf
echo 'mysqlfoo_domain = bar' >> main.cf
echo 'mysqlfoo_domainx = bar' >> main.cf
- echo 'pgsqlxx = pgsql:pgsqlfoo' >> main.cf
+ echo 'pgsqlxx = proxy:pgsql:pgsqlfoo' >> main.cf
echo 'pgsqlfoo_domain = bar' >> main.cf
echo 'pgsqlfoo_domainx = bar' >> main.cf
- echo 'sqlitexx = sqlite:sqlitefoo' >> main.cf
+ echo 'sqlitexx = proxy:sqlite:sqlitefoo' >> main.cf
echo 'sqlitefoo_domain = bar' >> main.cf
echo 'sqlitefoo_domainx = bar' >> main.cf
- echo 'memcachexx = memcache:memcachefoo' >> main.cf
+ echo 'memcachexx = proxy:memcache:memcachefoo' >> main.cf
echo 'memcachefoo_domain = bar' >> main.cf
echo 'memcachefoo_domainx = bar' >> main.cf
./$(PROG) -nc . >test29.tmp 2>&1
while ((db_type = mystrtok(&bufp, " ,\t\r\n")) != 0) {
/*
- * Don't skip over "proxy:" indirections. They don't introduce
- * database-specific main.cf parameters on the proxy client side.
- *
- * Look for database:prefix where the prefix is not a pathname and the
- * database is a known type. Synthesize candidate parameter names
+ * Skip over "proxy:" maptypes, to emulate the proxymap(8) server's
+ * behavior when opening a local database configuration file.
+ */
+ while ((prefix = split_at(db_type, ':')) != 0
+ && strcmp(db_type, DICT_TYPE_PROXY) == 0)
+ db_type = prefix;
+
+ /*
+ * Look for database:prefix where the prefix is not a pathname and
+ * the database is a known type. Synthesize candidate parameter names
* from the user-defined prefix and from the database-defined suffix
* list, and see if those parameters have a "name=value" entry in the
* local or global namespace.
*/
- if ((prefix = split_at(db_type, ':')) != 0
- && *prefix != '/' && *prefix != '.') {
+ if (prefix != 0 && *prefix != '/' && *prefix != '.') {
for (dp = dbms_info; dp->db_type != 0; dp++) {
if (strcmp(db_type, dp->db_type) == 0) {
for (cpp = dp->db_suffixes; *cpp; cpp++) {
junk = concatenate("-", cp, (char *) 0);
argv_insert_one(argv, field + 1, junk);
myfree(junk);
- *cp = 0;
+ *cp = 0; /* XXX argv_replace_one() */
break;
}
}
if (arg[2] != 0) {
/* Split "-oname=value" into "-o" "name=value". */
argv_insert_one(argv, field + 1, arg + 2);
- arg[2] = 0;
+ arg[2] = 0; /* XXX argv_replace_one() */
field += 1;
} else if (argv->argv[field + 1] != 0) {
/* Already in "-o" "name=value" form. */
}
}
+/* parse_master_line - parse one master line */
+
+static void parse_master_line(PC_MASTER_ENT *masterp, const char *buf,
+ const char *path, int line_count)
+{
+ ARGV *argv;
+
+ /*
+ * We can't use the master daemon's master_ent routines in their current
+ * form. They convert everything to internal form, and they skip disabled
+ * services.
+ *
+ * The postconf command needs to show default fields as "-", and needs to
+ * know about all service names so that it can generate service-dependent
+ * parameter names (transport-dependent etc.).
+ */
+#define MASTER_BLANKS " \t\r\n" /* XXX */
+
+ argv = argv_split(buf, MASTER_BLANKS);
+ if (argv->argc < PC_MASTER_MIN_FIELDS)
+ msg_fatal("file %s: line %d: bad field count",
+ path, line_count);
+ normalize_options(argv);
+ masterp->name_space =
+ concatenate(argv->argv[0], ".", argv->argv[1], (char *) 0);
+ masterp->argv = argv;
+ masterp->valid_names = 0;
+ masterp->all_params = 0;
+}
+
/* read_master - read and digest the master.cf file */
void read_master(int fail_on_open_error)
const char *myname = "read_master";
char *path;
VSTRING *buf;
- ARGV *argv;
VSTREAM *fp;
int entry_count = 0;
int line_count = 0;
set_config_dir();
path = concatenate(var_config_dir, "/", MASTER_CONF_FILE, (char *) 0);
- /*
- * We can't use the master daemon's master_ent routines in their current
- * form. They convert everything to internal form, and they skip disabled
- * services.
- *
- * The postconf command needs to show default fields as "-", and needs to
- * know about all service names so that it can generate service-dependent
- * parameter names (transport-dependent etc.).
- */
-#define MASTER_BLANKS " \t\r\n" /* XXX */
-
/*
* Initialize the in-memory master table.
*/
while (readlline(buf, fp, &line_count) != 0) {
master_table = (PC_MASTER_ENT *) myrealloc((char *) master_table,
(entry_count + 2) * sizeof(*master_table));
- argv = argv_split(STR(buf), MASTER_BLANKS);
- if (argv->argc < PC_MASTER_MIN_FIELDS)
- msg_fatal("file %s: line %d: bad field count",
- path, line_count);
- normalize_options(argv);
- master_table[entry_count].name_space =
- concatenate(argv->argv[0], ".", argv->argv[1], (char *) 0);
- master_table[entry_count].argv = argv;
- master_table[entry_count].valid_names = 0;
- master_table[entry_count].all_params = 0;
+ parse_master_line(master_table + entry_count, STR(buf),
+ path, line_count);
entry_count += 1;
}
vstream_fclose(fp);
zz_domain = whatever
./postconf: warning: ./main.cf: unused parameter: zz=$yy
./postconf: warning: ./main.cf: unused parameter: aa_domain=whatever
-./postconf: warning: ./main.cf: unused parameter: xx=ldap:foo
+./postconf: warning: ./main.cf: unused parameter: xx=proxy:ldap:foo
mysqlfoo_domain = bar
pgsqlfoo_domain = bar
sqlitefoo_domain = bar
-./postconf: warning: ./main.cf: unused parameter: sqlitexx=sqlite:sqlitefoo
-./postconf: warning: ./main.cf: unused parameter: pgsqlxx=pgsql:pgsqlfoo
+./postconf: warning: ./main.cf: unused parameter: sqlitexx=proxy:sqlite:sqlitefoo
+./postconf: warning: ./main.cf: unused parameter: pgsqlxx=proxy:pgsql:pgsqlfoo
./postconf: warning: ./main.cf: unused parameter: memcachefoo_domainx=bar
./postconf: warning: ./main.cf: unused parameter: sqlitefoo_domainx=bar
-./postconf: warning: ./main.cf: unused parameter: memcachexx=memcache:memcachefoo
-./postconf: warning: ./main.cf: unused parameter: mysqlxx=mysql:mysqlfoo
-./postconf: warning: ./main.cf: unused parameter: ldapxx=ldap:ldapfoo
+./postconf: warning: ./main.cf: unused parameter: memcachexx=proxy:memcache:memcachefoo
+./postconf: warning: ./main.cf: unused parameter: mysqlxx=proxy:mysql:mysqlfoo
+./postconf: warning: ./main.cf: unused parameter: ldapxx=proxy:ldap:ldapfoo
./postconf: warning: ./main.cf: unused parameter: ldapfoo_domainx=bar
./postconf: warning: ./main.cf: unused parameter: pgsqlfoo_domainx=bar
./postconf: warning: ./main.cf: unused parameter: mysqlfoo_domainx=bar
argvp->argc += 1;
}
-/* argv_replace_one - insert one string into array */
+/* argv_replace_one - replace one string in array */
void argv_replace_one(ARGV *argvp, ssize_t where, const char *arg)
{