X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/3d80c3754b3421428b47f89ce26f07adf10e7501..e65143df0ddb3905335fb399bab2961095127a2a:/openwrt/package/config/zconf.l

diff --git a/openwrt/package/config/zconf.l b/openwrt/package/config/zconf.l
index 55517b287..3a4947a88 100644
--- a/openwrt/package/config/zconf.l
+++ b/openwrt/package/config/zconf.l
@@ -12,6 +12,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <glob.h>
 
 #define LKC_DIRECT_LINK
 #include "lkc.h"
@@ -301,32 +302,52 @@ void zconf_initscan(const char *name)
 
 void zconf_nextfile(const char *name)
 {
-	struct file *file = file_lookup(name);
-	struct buffer *buf = malloc(sizeof(*buf));
-	memset(buf, 0, sizeof(*buf));
-
-	current_buf->state = YY_CURRENT_BUFFER;
-	yyin = zconf_fopen(name);
-	if (!yyin) {
-		printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
+	size_t i;
+	int retval;
+	glob_t files;
+	char *filename;
+	struct file *file;
+	struct buffer *buf;
+
+	retval = glob(name, GLOB_ERR | GLOB_MARK, NULL, &files);
+	if (retval == GLOB_NOSPACE || retval == GLOB_ABORTED || retval == GLOB_NOMATCH) {
+		printf("%s:%d: glob failed: %s \"%s\"\n", zconf_curname(), zconf_lineno(),
+			retval == GLOB_NOSPACE ? "failed to allocate memory" :
+				retval == GLOB_ABORTED ? "read error" : "no match",
+			name);
 		exit(1);
 	}
-	yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
-	buf->parent = current_buf;
-	current_buf = buf;
 
-	if (file->flags & FILE_BUSY) {
-		printf("recursive scan (%s)?\n", name);
-		exit(1);
-	}
-	if (file->flags & FILE_SCANNED) {
-		printf("file %s already scanned?\n", name);
-		exit(1);
+	for (i = files.gl_pathc-1; i != (size_t)-1; --i) {
+		filename = files.gl_pathv[i];
+
+		file = file_lookup(filename);
+		buf = malloc(sizeof(*buf));
+		memset(buf, 0, sizeof(*buf));
+		current_buf->state = YY_CURRENT_BUFFER;
+		zconfin = zconf_fopen(filename);
+		if (!zconfin) {
+			printf("%s:%d: can't open file \"%s\"\n",
+				zconf_curname(), zconf_lineno(), filename);
+			exit(1);
+		}
+		zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE));
+		buf->parent = current_buf;
+		current_buf = buf;
+
+		if (file->flags & FILE_BUSY) {
+			printf("recursive scan (%s)?\n", filename);
+			exit(1);
+		}
+		if (file->flags & FILE_SCANNED) {
+			printf("file %s already scanned?\n", filename);
+			exit(1);
+		}
+		file->flags |= FILE_BUSY;
+		file->lineno = 1;
+		file->parent = current_file;
+		current_file = file;
 	}
-	file->flags |= FILE_BUSY;
-	file->lineno = 1;
-	file->parent = current_file;
-	current_file = file;
 }
 
 static struct buffer *zconf_endfile(void)