[PATCH] ifupdown: Use recursive_action for "source-directory"
Brandon Maier
brandon.maier at rockwellcollins.com
Mon Oct 1 23:05:47 UTC 2018
There is an existing function for recursing through directories. So use
that instead. source-directory only recurses through a single directory,
so we set a maximum depth of 1.
ifupdown only selects files that match the regex '^[a-zA-Z0-9_-]+$'[1].
Comply so that we don't include invalid files.
[1] https://manpages.debian.org/stretch/ifupdown/interfaces.5.en.html#INCLUDING_OTHER_FILES
Signed-off-by: Brandon Maier <brandon.maier at rockwellcollins.com>
---
networking/ifupdown.c | 47 ++++++++++++++++++++++++++++++++-----------
1 file changed, 35 insertions(+), 12 deletions(-)
diff --git a/networking/ifupdown.c b/networking/ifupdown.c
index 41cc86df7..ef6b185fc 100644
--- a/networking/ifupdown.c
+++ b/networking/ifupdown.c
@@ -159,6 +159,8 @@
/* Forward declaration */
struct interface_defn_t;
+static struct interfaces_file_t *read_interfaces(const char *filename, struct interfaces_file_t *defn);
+
typedef int execfn(char *command);
struct method_t {
@@ -857,6 +859,31 @@ static const struct method_t *get_method(const struct address_family_t *af, char
return NULL;
}
+static int FAST_FUNC read_interfaces_action(const char *fileName,
+ struct stat *statbuf UNUSED_PARAM, void* userData, int depth)
+{
+ const char *p;
+
+ if (depth == 0)
+ return SKIP;
+
+ for (p = bb_basename(fileName); *p; p++)
+ if (!(isalnum(*p) || *p == '_' || *p == '-'))
+ return SKIP;
+
+ read_interfaces(fileName, userData);
+
+ return TRUE;
+}
+
+static int FAST_FUNC max_depth_one(const char *fileName UNUSED_PARAM,
+ struct stat *statbuf UNUSED_PARAM, void* userData UNUSED_PARAM, int depth)
+{
+ if (depth > 0)
+ return SKIP;
+ return TRUE;
+}
+
static struct interfaces_file_t *read_interfaces(const char *filename, struct interfaces_file_t *defn)
{
/* Let's try to be compatible.
@@ -1019,20 +1046,16 @@ static struct interfaces_file_t *read_interfaces(const char *filename, struct in
read_interfaces(next_word(&rest_of_line), defn);
} else if (is_prefixed_with(first_word, "source-dir")) {
const char *dirpath;
- DIR *dir;
- struct dirent *entry;
dirpath = next_word(&rest_of_line);
- dir = xopendir(dirpath);
- while ((entry = readdir(dir)) != NULL) {
- char *path;
- if (entry->d_name[0] == '.')
- continue;
- path = concat_path_file(dirpath, entry->d_name);
- read_interfaces(path, defn);
- free(path);
- }
- closedir(dir);
+ debug_noise("%s %s\n", first_word, dirpath);
+ recursive_action(dirpath,
+ ACTION_RECURSE|ACTION_FOLLOWLINKS|ACTION_QUIET,
+ read_interfaces_action, /* file action */
+ max_depth_one, /* dir action */
+ defn, /* user data */
+ 0 /* depth */
+ );
} else {
switch (currently_processing) {
case IFACE:
--
2.19.0
More information about the busybox
mailing list