commit 8f5b5e45a980c2f2bf7106963a74aa8558469d7b from: Stefan Sperling date: Thu Sep 14 08:25:42 2023 UTC repair "write-config" command which broke with introduction of struct ctl2 Writing any changes to dhcp config was causing "genget internal failure". Regression found by Tom. commit - 0b2393c6d725b6b3d75b61dd387fce4836cf24db commit + 8f5b5e45a980c2f2bf7106963a74aa8558469d7b blob - 84ff64c42be556f8392417b7ba5f35c45332fff5 blob + 4ea2eea776b13eccf93bdbeeedffc97c48466cfa --- conf.c +++ conf.c @@ -371,26 +371,85 @@ void conf_rtables_rtable(FILE *output, int rtableid) sl_free(rtable_daemons, 1); fprintf(output, "!\n"); +} + +/* + * Figure out whether this particular ctl accepts the standard "enable", + * etc. argument or calls them something else. + * This is done by mapping DB_X_ flags to ctl table entry names. + * + * XXX This currently ignores "disable" arguments; They will always be + * displayed as "disable" even when the table entry with the DB_X_DISABLE + * flag uses a different name... + */ +static void +get_argnames(int flag_x, char *name, int *defenable, char **fenablenm, + char **flocalnm, char **fothernm) +{ + switch(flag_x) { + case DB_X_ENABLE_DEFAULT: + *defenable = 1; + /* FALLTHROUGH */ + case DB_X_ENABLE: + *fenablenm = name; + break; + case DB_X_LOCAL: + *flocalnm = name; + break; + case DB_X_OTHER: + *fothernm = name; + break; + case DB_X_DISABLE: + case DB_X_REMOVE: + case DB_X_DISABLE_ALWAYS: + case 0: + break; + default: + printf("%% conf_ctl: flag_x %d unknown\n", flag_x); + } } void conf_ctl(FILE *output, char *delim, char *name, int rtableid) { FILE *conf; struct daemons *x; - struct ctl *ctl; + struct daemons2 *x2; + struct ctl *ctl, *x_table = NULL; + struct ctl2 *ctl2, *x2_table = NULL; char tmp_str[TMPSIZ], tmpfile[64]; char *fenablenm = NULL, *fothernm = NULL, *flocalnm = NULL; - int defenable = 0, pntdrules = 0, pntdflag = 0, dbflag; + int defenable = 0, pntdrules = 0, pntdflag = 0, dbflag, x_doreload = 0; + char *x_tmpfile, *x_name; x = (struct daemons *)genget(name, (char **)ctl_daemons, sizeof(struct daemons)); - if (x == 0 || Ambiguous(x)) { - printf("%% conf_ctl: %s: genget internal failure\n", name); - return; + if (x == NULL) { + x2 = (struct daemons2 *)genget(name, (char **)ctl_daemons2, + sizeof(struct daemons2)); + if (x2 == NULL) { + printf("%% conf_ctl: %s: genget internal failure\n", + name); + return; + } + x_tmpfile = x2->tmpfile; + x_name = x2->name; + x_doreload = x2->doreload; + x2_table = x2->table; + } else { + if (Ambiguous(x)) { + printf("%% conf_ctl: %s: genget internal failure\n", + name); + return; + } + + x_tmpfile = x->tmpfile; + x_name = x->name; + x_doreload = x->doreload; + x_table = x->table; } /* print rules if they exist */ - snprintf(tmpfile, sizeof(tmpfile), "%s.%d", x->tmpfile, rtableid); + snprintf(tmpfile, sizeof(tmpfile), "%s.%d", x_tmpfile, rtableid); if ((conf = fopen(tmpfile, "r")) != NULL) { fprintf(output, "%s%s rules\n", delim, name); for (;;) { @@ -407,55 +466,39 @@ void conf_ctl(FILE *output, char *delim, char *name, i printf("%% conf_ctl: %s: %s\n", tmpfile, strerror(errno)); /* fill in argument names from table */ - for (ctl = x->table; ctl != NULL && ctl->name != NULL; ctl++) { - switch(ctl->flag_x) { - case DB_X_ENABLE_DEFAULT: - defenable = 1; - /* FALLTHROUGH */ - case DB_X_ENABLE: - fenablenm = ctl->name; - break; - case DB_X_LOCAL: - flocalnm = ctl->name; - break; - case DB_X_OTHER: - fothernm = ctl->name; - break; - case DB_X_DISABLE: - case DB_X_REMOVE: - case DB_X_DISABLE_ALWAYS: - case 0: - break; - default: - printf("%% conf_ctl: flag_x %d unknown\n", ctl->flag_x); - return; - } + for (ctl = x_table; ctl != NULL && ctl->name != NULL; ctl++) { + get_argnames(ctl->flag_x, ctl->name, &defenable, &fenablenm, + &flocalnm, &fothernm); } + for (ctl2 = x2_table; ctl2 != NULL && ctl2->name != NULL; ctl2++) { + get_argnames(ctl2->flag_x, ctl2->name, &defenable, &fenablenm, + &flocalnm, &fothernm); + } /* print rules as currently enabled in running time database */ - if ((dbflag = db_select_flag_x_dbflag_rtable("ctl", x->name, rtableid)) + if ((dbflag = db_select_flag_x_dbflag_rtable("ctl", x_name, rtableid)) < 0) { - printf("%% database ctl select failure (%s, %d)\n", x->name, rtableid); + printf("%% database ctl select failure (%s, %d)\n", x_name, rtableid); return; } switch(dbflag) { case DB_X_ENABLE: - fprintf(output, "%s%s %s\n", delim, x->name, fenablenm ? + fprintf(output, "%s%s %s\n", delim, x_name, fenablenm ? fenablenm : "enable"); pntdflag = 1; break; case DB_X_LOCAL: - fprintf(output, "%s%s %s\n", delim, x->name, flocalnm ? + fprintf(output, "%s%s %s\n", delim, x_name, flocalnm ? flocalnm : "local"); pntdflag = 1; break; case DB_X_OTHER: - fprintf(output, "%s%s %s\n", delim, x->name, fothernm ? + fprintf(output, "%s%s %s\n", delim, x_name, fothernm ? fothernm : "other"); pntdflag = 1; break; case DB_X_DISABLE_ALWAYS: - fprintf(output, "%s%s disable\n", delim, x->name); + fprintf(output, "%s%s disable\n", delim, x_name); pntdflag = 1; /* FALLTHROUGH */ case DB_X_DISABLE: @@ -469,12 +512,12 @@ void conf_ctl(FILE *output, char *delim, char *name, i printf("%% conf_ctl: dbflag %d unknown\n", dbflag); } if (defenable) { - fprintf(output, "%s%s %s\n", delim, x->name, fenablenm ? + fprintf(output, "%s%s %s\n", delim, x_name, fenablenm ? fenablenm : "enable"); pntdflag = 1; } - if (pntdrules && x->doreload) { - fprintf(output, "%s%s reload\n", delim, x->name); + if (pntdrules && x_doreload) { + fprintf(output, "%s%s reload\n", delim, x_name); pntdflag = 1; } if (pntdflag) blob - 8140478bd623a1711ccbe4f587611cde53515ea7 blob + 016abaae50e11fbd1d3585543f0a51c23e3fcfc2 --- ctl.h +++ ctl.h @@ -172,6 +172,7 @@ extern char *ctl_sshd_test[]; /* tftpproxy test no config test yet */ extern struct daemons ctl_daemons[]; +extern struct daemons2 ctl_daemons2[]; extern struct ctl ctl_pf[]; extern struct ctl ctl_ospf[]; extern struct ctl ctl_ospf6[];