Hello, On 11/2/20 8:24 AM, Steve Dickson wrote: >> You would need to write an equivalent of conf_load_file() that created >> a new transaction id and read in all the files before committing them >> to do it this way. > I kinda do think we should be able to read in multiple files... > If that free was not done until all the files are read in, would something > like that work? I guess I'm ask how difficult would be to re-work > the code to do something like this. > Something similar to this... load all the files under the same trans id: (Compiled tested): diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c index c60e511..f003fe1 100644 --- a/support/nfs/conffile.c +++ b/support/nfs/conffile.c @@ -578,6 +578,30 @@ static void conf_free_bindings(void) } } +static int +conf_load_files(int trans, const char *conf_file) +{ + char *conf_data; + char *section = NULL; + char *subsection = NULL; + + conf_data = conf_readfile(conf_file); + if (conf_data == NULL) + return 1; + + /* Load default configuration values. */ + conf_load_defaults(); + + /* Parse config contents into the transaction queue */ + conf_parse(trans, conf_data, §ion, &subsection, conf_file); + if (section) + free(section); + if (subsection) + free(subsection); + free(conf_data); + + return 0; +} /* Open the config file and map it into our address space, then parse it. */ static int conf_load_file(const char *conf_file) @@ -616,6 +640,7 @@ conf_init_dir(const char *conf_file) struct dirent **namelist = NULL; char *dname, fname[PATH_MAX + 1]; int n = 0, nfiles = 0, i, fname_len, dname_len; + int trans; dname = malloc(strlen(conf_file) + 3); if (dname == NULL) { @@ -637,6 +662,7 @@ conf_init_dir(const char *conf_file) return nfiles; } + trans = conf_begin(); dname_len = strlen(dname); for (i = 0; i < n; i++ ) { struct dirent *d = namelist[i]; @@ -660,11 +686,17 @@ conf_init_dir(const char *conf_file) } sprintf(fname, "%s/%s", dname, d->d_name); - if (conf_load_file(fname)) + if (conf_load_files(trans, fname)) continue; nfiles++; } + /* Free potential existing configuration. */ + conf_free_bindings(); + + /* Apply the new configuration values */ + conf_end(trans, 1); + for (i = 0; i < n; i++) free(namelist[i]); free(namelist);