ifupdown: support "source-directory" stanza
authorBrandon Maier <brandon.maier@rockwellcollins.com>
Fri, 21 Sep 2018 17:54:05 +0000 (12:54 -0500)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 30 Sep 2018 11:23:05 +0000 (13:23 +0200)
Support the "source-directory" stanza from ifupdown[1]. source-directory
will include all files in the named directory. Similar to the Busybox
version of the "source" stanza, this version of source-directory does
not currently support shell wildcards.

We only check that the stanza starts with "source-dir" as ifupdown does[2].

[1] https://manpages.debian.org/stretch/ifupdown/interfaces.5.en.html#INCLUDING_OTHER_FILES
[2] https://salsa.debian.org/debian/ifupdown/blob/0.8.33/config.c#L498

function                                             old     new   delta
read_interfaces                                     1150    1241     +91

Signed-off-by: Brandon Maier <brandon.maier@rockwellcollins.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ifupdown.c

index 5481134e513db7a1f2763e2ae9bc80d59e2843de..80fce87a6d5a4e18b08ac77cbe7af70ffa5c8abd 100644 (file)
@@ -1022,6 +1022,22 @@ static struct interfaces_file_t *read_interfaces(const char *filename, struct in
                        currently_processing = NONE;
                } else if (strcmp(first_word, "source") == 0) {
                        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);
                } else {
                        switch (currently_processing) {
                        case IFACE: