Remove the table_static_parse() indirection for parsing the file content. The "type" parameter is useless since the "(t->t_type & type)" test is always true. I think this is a left-over from the old design when table parsing was done in context of its intended use in the global config.
Eric. Index: table_static.c =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/table_static.c,v retrieving revision 1.15 diff -u -p -r1.15 table_static.c --- table_static.c 22 Jan 2016 13:08:44 -0000 1.15 +++ table_static.c 13 Aug 2017 11:28:50 -0000 @@ -47,7 +47,6 @@ static int table_static_lookup(void *, s static int table_static_fetch(void *, struct dict *, enum table_service, union lookup *); static void table_static_close(void *); -static int table_static_parse(struct table *, const char *, enum table_type); struct table_backend table_backend_static = { K_ALIAS|K_CREDENTIALS|K_DOMAIN|K_NETADDR|K_USERINFO| @@ -71,17 +70,7 @@ static struct keycmp { static int -table_static_config(struct table *table) -{ - /* no config ? ok */ - if (*table->t_config == '\0') - return 1; - - return table_static_parse(table, table->t_config, T_LIST|T_HASH); -} - -static int -table_static_parse(struct table *t, const char *config, enum table_type type) +table_static_config(struct table *t) { FILE *fp; char *buf = NULL; @@ -91,10 +80,14 @@ table_static_parse(struct table *t, cons char *valp; size_t ret = 0; - if ((fp = fopen(config, "r")) == NULL) { - log_warn("warn: Table \"%s\"", config); - return 0; - } + /* no config ? ok */ + if (*t->t_config == '\0') + return 1; + + if ((fp = fopen(t->t_config, "r")) == NULL) { + log_warn("warn: Table \"%s\"", t->t_config); + return 0; + } while ((flen = getline(&buf, &sz, fp)) != -1) { if (buf[flen - 1] == '\n') @@ -122,9 +115,6 @@ table_static_parse(struct table *t, cons if (t->t_type == 0) t->t_type = (valp == keyp || valp == NULL) ? T_LIST : T_HASH; - - if (!(t->t_type & type)) - goto end; if ((valp == keyp || valp == NULL) && t->t_type == T_LIST) table_add(t, keyp, NULL);