Enhance --conf-dir to load files in a deterministic order.

This commit is contained in:
Simon Kelley
2020-01-10 20:44:48 +00:00
parent 6c1e9ac14b
commit ab53883c94
3 changed files with 37 additions and 15 deletions

View File

@@ -62,6 +62,9 @@ version 2.81
Add --tftp-single-port option. Add --tftp-single-port option.
Enhance --conf-dir to load files in a deterministic order. Thanks to
Evgenii Seliavka for the suggestion and initial patch.
version 2.80 version 2.80
Add support for RFC 4039 DHCP rapid commit. Thanks to Ashram Method Add support for RFC 4039 DHCP rapid commit. Thanks to Ashram Method

View File

@@ -1967,7 +1967,7 @@ which have that extension are loaded. So
.B --conf-dir=/path/to/dir,*.conf .B --conf-dir=/path/to/dir,*.conf
loads all files with the suffix .conf in /path/to/dir. This flag may be given on the command loads all files with the suffix .conf in /path/to/dir. This flag may be given on the command
line or in a configuration file. If giving it on the command line, be sure to line or in a configuration file. If giving it on the command line, be sure to
escape * characters. escape * characters. Files are loaded in alphabetical order of filename.
.TP .TP
.B --servers-file=<file> .B --servers-file=<file>
A special case of A special case of

View File

@@ -1665,9 +1665,9 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
struct dirent *ent; struct dirent *ent;
char *directory, *path; char *directory, *path;
struct list { struct list {
char *suffix; char *name;
struct list *next; struct list *next;
} *ignore_suffix = NULL, *match_suffix = NULL, *li; } *ignore_suffix = NULL, *match_suffix = NULL, *files = NULL, *li;
comma = split(arg); comma = split(arg);
if (!(directory = opt_string_alloc(arg))) if (!(directory = opt_string_alloc(arg)))
@@ -1689,7 +1689,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
li->next = match_suffix; li->next = match_suffix;
match_suffix = li; match_suffix = li;
/* Have to copy: buffer is overwritten */ /* Have to copy: buffer is overwritten */
li->suffix = opt_string_alloc(arg+1); li->name = opt_string_alloc(arg+1);
} }
} }
else else
@@ -1697,7 +1697,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
li->next = ignore_suffix; li->next = ignore_suffix;
ignore_suffix = li; ignore_suffix = li;
/* Have to copy: buffer is overwritten */ /* Have to copy: buffer is overwritten */
li->suffix = opt_string_alloc(arg); li->name = opt_string_alloc(arg);
} }
} }
} }
@@ -1722,9 +1722,9 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
for (li = match_suffix; li; li = li->next) for (li = match_suffix; li; li = li->next)
{ {
/* check for required suffices */ /* check for required suffices */
size_t ls = strlen(li->suffix); size_t ls = strlen(li->name);
if (len > ls && if (len > ls &&
strcmp(li->suffix, &ent->d_name[len - ls]) == 0) strcmp(li->name, &ent->d_name[len - ls]) == 0)
break; break;
} }
if (!li) if (!li)
@@ -1734,9 +1734,9 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
for (li = ignore_suffix; li; li = li->next) for (li = ignore_suffix; li; li = li->next)
{ {
/* check for proscribed suffices */ /* check for proscribed suffices */
size_t ls = strlen(li->suffix); size_t ls = strlen(li->name);
if (len > ls && if (len > ls &&
strcmp(li->suffix, &ent->d_name[len - ls]) == 0) strcmp(li->name, &ent->d_name[len - ls]) == 0)
break; break;
} }
if (li) if (li)
@@ -1753,25 +1753,44 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
/* only reg files allowed. */ /* only reg files allowed. */
if (S_ISREG(buf.st_mode)) if (S_ISREG(buf.st_mode))
one_file(path, 0); {
/* sort files into order. */
struct list **up, *new = opt_malloc(sizeof(struct list));
new->name = path;
free(path); for (up = &files, li = files; li; up = &li->next, li = li->next)
if (strcmp(li->name, path) >=0)
break;
new->next = li;
*up = new;
} }
}
for (li = files; li; li = li->next)
one_file(li->name, 0);
closedir(dir_stream); closedir(dir_stream);
free(directory); free(directory);
for(; ignore_suffix; ignore_suffix = li) for(; ignore_suffix; ignore_suffix = li)
{ {
li = ignore_suffix->next; li = ignore_suffix->next;
free(ignore_suffix->suffix); free(ignore_suffix->name);
free(ignore_suffix); free(ignore_suffix);
} }
for(; match_suffix; match_suffix = li) for(; match_suffix; match_suffix = li)
{ {
li = match_suffix->next; li = match_suffix->next;
free(match_suffix->suffix); free(match_suffix->name);
free(match_suffix); free(match_suffix);
} }
for(; files; files = li)
{
li = files->next;
free(files->name);
free(files);
}
break; break;
} }