summary refs log tree commit diff
path: root/src/settings/plugins/ifupdown
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings/plugins/ifupdown')
-rw-r--r--src/settings/plugins/ifupdown/Makefile.in2
-rw-r--r--src/settings/plugins/ifupdown/interface_parser.c50
-rw-r--r--src/settings/plugins/ifupdown/tests/Makefile.am3
-rw-r--r--src/settings/plugins/ifupdown/tests/Makefile.in5
-rw-r--r--src/settings/plugins/ifupdown/tests/test-ifupdown.c23
-rw-r--r--src/settings/plugins/ifupdown/tests/test21-source-dir-stanza1
-rw-r--r--src/settings/plugins/ifupdown/tests/test21-source-dir-stanza.d/test21-source-dir-stanza.eth02
7 files changed, 69 insertions, 17 deletions
diff --git a/src/settings/plugins/ifupdown/Makefile.in b/src/settings/plugins/ifupdown/Makefile.in
index 4e1c657b..385a55d9 100644
--- a/src/settings/plugins/ifupdown/Makefile.in
+++ b/src/settings/plugins/ifupdown/Makefile.in
@@ -93,7 +93,7 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/attributes.m4 \
 	$(top_srcdir)/m4/ax_lib_readline.m4 \
 	$(top_srcdir)/m4/compiler_options.m4 \
-	$(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/git-sha-record.m4 \
 	$(top_srcdir)/m4/gnome-code-coverage.m4 \
 	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intltool.m4 \
diff --git a/src/settings/plugins/ifupdown/interface_parser.c b/src/settings/plugins/ifupdown/interface_parser.c
index 7ad902d4..764ba5c9 100644
--- a/src/settings/plugins/ifupdown/interface_parser.c
+++ b/src/settings/plugins/ifupdown/interface_parser.c
@@ -100,7 +100,7 @@ static char *join_values_with_spaces(char *dst, char **src)
 	return(dst);
 }
 
-static void _ifparser_source (const char *path, const char *en_dir, int quiet);
+static void _ifparser_source (const char *path, const char *en_dir, int quiet, int dir);
 
 static void
 _recursive_ifparser (const char *eni_file, int quiet)
@@ -189,9 +189,9 @@ _recursive_ifparser (const char *eni_file, int quiet)
 			continue;
 		}
 
-		/* There are five different stanzas:
-		 * iface, mapping, auto, allow-* and source.
-		 * Create a block for each of them except source.  */
+		/* There are six different stanzas:
+		 * iface, mapping, auto, allow-*, source, and source-directory.
+		 * Create a block for each of them except source and source-directory.  */
 
 		/* iface stanza takes at least 3 parameters */
 		if (strcmp(token[0], "iface") == 0) {
@@ -226,22 +226,28 @@ _recursive_ifparser (const char *eni_file, int quiet)
 				add_block(token[0], token[i]);
 			skip_to_block = 0;
 		}
-		/* source stanza takes one or more filepaths as parameters */
-		else if (strcmp(token[0], "source") == 0) {
+		/* source and source-directory stanzas take one or more paths as parameters */
+		else if (strcmp (token[0], "source") == 0 || strcmp (token[0], "source-directory") == 0) {
 			int i;
 			char *en_dir;
 
 			skip_to_block = 0;
 
 			if (toknum == 1) {
-				if (!quiet)
-					nm_log_warn (LOGD_SETTINGS, "Invalid source line without parameters\n");
+				if (!quiet) {
+					nm_log_warn (LOGD_SETTINGS, "Invalid %s line without parameters\n",
+					             token[0]);
+				}
 				continue;
 			}
 
 			en_dir = g_path_get_dirname (eni_file);
-			for (i = 1; i < toknum; ++i)
-				_ifparser_source (token[i], en_dir, quiet);
+			for (i = 1; i < toknum; ++i) {
+				if (strcmp (token[0], "source-directory") == 0)
+					_ifparser_source (token[i], en_dir, quiet, TRUE);
+				else
+					_ifparser_source (token[i], en_dir, quiet, FALSE);
+			}
 			g_free (en_dir);
 		}
 		else {
@@ -261,10 +267,13 @@ _recursive_ifparser (const char *eni_file, int quiet)
 }
 
 static void
-_ifparser_source (const char *path, const char *en_dir, int quiet)
+_ifparser_source (const char *path, const char *en_dir, int quiet, int dir)
 {
 	char *abs_path;
+	const char *item;
 	wordexp_t we;
+	GDir *source_dir;
+	GError *error = NULL;
 	uint i;
 
 	if (g_path_is_absolute (path))
@@ -280,8 +289,23 @@ _ifparser_source (const char *path, const char *en_dir, int quiet)
 		if (!quiet)
 			nm_log_warn (LOGD_SETTINGS, "word expansion for %s failed\n", abs_path);
 	} else {
-		for (i = 0; i < we.we_wordc; i++)
-			_recursive_ifparser (we.we_wordv[i], quiet);
+		for (i = 0; i < we.we_wordc; i++) {
+			if (dir) {
+				source_dir = g_dir_open (we.we_wordv[i], 0, &error);
+				if (!source_dir) {
+					if (!quiet) {
+						nm_log_warn (LOGD_SETTINGS, "Failed to open directory %s: %s",
+						             we.we_wordv[i], error->message);
+					}
+					g_clear_error (&error);
+				} else {
+					while ((item = g_dir_read_name (source_dir)))
+						_ifparser_source (item, we.we_wordv[i], quiet, FALSE);
+					g_dir_close (source_dir);
+				}
+			} else
+				_recursive_ifparser (we.we_wordv[i], quiet);
+		}
 		wordfree (&we);
 	}
 	g_free (abs_path);
diff --git a/src/settings/plugins/ifupdown/tests/Makefile.am b/src/settings/plugins/ifupdown/tests/Makefile.am
index 1287a716..3d702375 100644
--- a/src/settings/plugins/ifupdown/tests/Makefile.am
+++ b/src/settings/plugins/ifupdown/tests/Makefile.am
@@ -35,4 +35,5 @@ EXTRA_DIST = \
 	test1 test2 test3 test4 test5 test6 test7 test8 test9 test11 test12 \
 	test13 test14 test15 test16 test17-wired-static-verify-ip4 \
 	test18-wired-static-verify-ip6 test19-wired-static-verify-ip4-plen \
-	test20-source-stanza test20-source-stanza.eth0 test20-source-stanza.eth1
+	test20-source-stanza test20-source-stanza.eth0 test20-source-stanza.eth1 \
+	test21-source-dir-stanza test21-source-dir-stanza.d
diff --git a/src/settings/plugins/ifupdown/tests/Makefile.in b/src/settings/plugins/ifupdown/tests/Makefile.in
index b63f9a89..b3be79e1 100644
--- a/src/settings/plugins/ifupdown/tests/Makefile.in
+++ b/src/settings/plugins/ifupdown/tests/Makefile.in
@@ -95,7 +95,7 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/attributes.m4 \
 	$(top_srcdir)/m4/ax_lib_readline.m4 \
 	$(top_srcdir)/m4/compiler_options.m4 \
-	$(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/git-sha-record.m4 \
 	$(top_srcdir)/m4/gnome-code-coverage.m4 \
 	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intltool.m4 \
@@ -688,7 +688,8 @@ EXTRA_DIST = \
 	test1 test2 test3 test4 test5 test6 test7 test8 test9 test11 test12 \
 	test13 test14 test15 test16 test17-wired-static-verify-ip4 \
 	test18-wired-static-verify-ip6 test19-wired-static-verify-ip4-plen \
-	test20-source-stanza test20-source-stanza.eth0 test20-source-stanza.eth1
+	test20-source-stanza test20-source-stanza.eth0 test20-source-stanza.eth1 \
+	test21-source-dir-stanza test21-source-dir-stanza.d
 
 all: all-am
 
diff --git a/src/settings/plugins/ifupdown/tests/test-ifupdown.c b/src/settings/plugins/ifupdown/tests/test-ifupdown.c
index 7ce08aee..11b42c71 100644
--- a/src/settings/plugins/ifupdown/tests/test-ifupdown.c
+++ b/src/settings/plugins/ifupdown/tests/test-ifupdown.c
@@ -627,6 +627,27 @@ test20_source_stanza (const char *path)
 	expected_free (e);
 }
 
+static void
+test21_source_dir_stanza (const char *path)
+{
+	Expected *e;
+	ExpectedBlock *b;
+
+	e = expected_new ();
+
+	b = expected_block_new ("auto", "eth0");
+	expected_add_block (e, b);
+	b = expected_block_new ("iface", "eth0");
+	expected_add_block (e, b);
+	expected_block_add_key (b, expected_key_new ("inet", "dhcp"));
+
+	init_ifparser_with_file (path, "test21-source-dir-stanza");
+	compare_expected_to_ifparser (e);
+
+	ifparser_destroy ();
+	expected_free (e);
+}
+
 NMTST_DEFINE ();
 
 int
@@ -675,6 +696,8 @@ main (int argc, char **argv)
 	                      (GTestDataFunc) test19_read_static_ipv4_plen);
 	g_test_add_data_func ("/ifupdate/source_stanza", TEST_ENI_DIR,
 	                      (GTestDataFunc) test20_source_stanza);
+	g_test_add_data_func ("/ifupdate/source_dir_stanza", TEST_ENI_DIR,
+	                      (GTestDataFunc) test21_source_dir_stanza);
 
 	return g_test_run ();
 }
diff --git a/src/settings/plugins/ifupdown/tests/test21-source-dir-stanza b/src/settings/plugins/ifupdown/tests/test21-source-dir-stanza
new file mode 100644
index 00000000..d0604ddc
--- /dev/null
+++ b/src/settings/plugins/ifupdown/tests/test21-source-dir-stanza
@@ -0,0 +1 @@
+source-directory test21-source-dir-stanza.d
diff --git a/src/settings/plugins/ifupdown/tests/test21-source-dir-stanza.d/test21-source-dir-stanza.eth0 b/src/settings/plugins/ifupdown/tests/test21-source-dir-stanza.d/test21-source-dir-stanza.eth0
new file mode 100644
index 00000000..81922cea
--- /dev/null
+++ b/src/settings/plugins/ifupdown/tests/test21-source-dir-stanza.d/test21-source-dir-stanza.eth0
@@ -0,0 +1,2 @@
+auto eth0
+iface eth0 inet dhcp