[PATCH nft] parser: Add glob support to include directive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
 src/scanner.l                                 | 36 +++++++++++++++++----------
 tests/shell/testcases/include/0005glob_0      | 32 ++++++++++++++++++++++++
 tests/shell/testcases/include/0006globempty_1 | 14 +++++++++++
 3 files changed, 69 insertions(+), 13 deletions(-)
 create mode 100755 tests/shell/testcases/include/0005glob_0
 create mode 100755 tests/shell/testcases/include/0006globempty_1

diff --git a/src/scanner.l b/src/scanner.l
index 625023f..64fe6fc 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -11,6 +11,7 @@
 %{

 #include <limits.h>
+#include <glob.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <linux/types.h>
@@ -640,37 +641,46 @@ int scanner_include_file(void *scanner, const
char *filename,
     struct parser_state *state = yyget_extra(scanner);
     struct error_record *erec;
     char buf[PATH_MAX];
-    const char *name = buf;
     unsigned int i;
-    FILE *f;
+    glob_t globbuf;

-    f = NULL;
+    globbuf.gl_pathc = 0;
     if (search_in_include_path(filename)) {
         for (i = 0; i < INCLUDE_PATHS_MAX; i++) {
             if (include_paths[i] == NULL)
                 break;
             snprintf(buf, sizeof(buf), "%s/%s",
                  include_paths[i], filename);
-            f = fopen(buf, "r");
-            if (f != NULL)
+            if (glob(buf, 0, NULL, &globbuf) != 0) {
                 break;
+            }
         }
     } else {
-        f = fopen(filename, "r");
-        name = filename;
+        glob(filename, 0, NULL, &globbuf);
     }
-    if (f == NULL) {
-        erec = error(loc, "Could not open file \"%s\": %s",
-                 filename, strerror(errno));
+    if (globbuf.gl_pathc == 0) {
+        erec = error(loc, "Could not find file matching \"%s\"\n", filename);
         goto err;
     }

-    erec = scanner_push_file(scanner, name, f, loc);
-    if (erec != NULL)
-        goto err;
+    for (i = 0; i < globbuf.gl_pathc; i++) {
+        const char *name = globbuf.gl_pathv[i];
+        FILE *f = fopen(name, "r");
+        if (f == NULL) {
+            erec = error(loc, "Could not open file \"%s\": %s\n",
name, strerror(errno));
+            goto err;
+        }
+        erec = scanner_push_file(scanner, name, f, loc);
+        if (erec != NULL) {
+            goto err;
+        }
+    }
+
+    globfree(&globbuf);
     return 0;

 err:
+    globfree(&globbuf);
     erec_queue(erec, state->msgs);
     return -1;
 }
diff --git a/tests/shell/testcases/include/0005glob_0
b/tests/shell/testcases/include/0005glob_0
new file mode 100755
index 0000000..99dbf53
--- /dev/null
+++ b/tests/shell/testcases/include/0005glob_0
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+set -e
+
+tmpdir=$(mktemp -d)
+tmpfile=$(mktemp)
+
+trap "rm -rf $tmpdir $tmpfile" EXIT # cleanup if aborted
+
+RULESET1="add table x"
+RULESET2="add table y"
+RULESET3="include \"$tmpdir/*.conf\""
+
+echo "$RULESET1" > $tmpdir/ruleset1.conf
+echo "$RULESET2" > $tmpdir/ruleset2.conf
+echo "$RULESET3" > $tmpfile
+
+$NFT -f $tmpfile
+if [ $? -ne 0 ] ; then
+        echo "E: unable to load good ruleset" >&2
+        exit 1
+fi
+$NFT list table x
+if [ $? -ne 0 ] ; then
+        echo "E: unable to include ruleset1.conf" >&2
+        exit 1
+fi
+$NFT list table y
+if [ $? -ne 0 ] ; then
+        echo "E: unable to include ruleset2.conf" >&2
+        exit 1
+fi
diff --git a/tests/shell/testcases/include/0006globempty_1
b/tests/shell/testcases/include/0006globempty_1
new file mode 100755
index 0000000..3ac8c72
--- /dev/null
+++ b/tests/shell/testcases/include/0006globempty_1
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+set -e
+
+tmpdir=$(mktemp -d)
+tmpfile=$(mktemp)
+
+trap "rm -rf $tmpdir $tmpfile" EXIT # cleanup if aborted
+
+RULESET="include \"$tmpdir/*.conf\""
+
+echo "$RULESET" > $tmpfile
+
+$NFT -f $tmpfile 2>/dev/null
-- 
2.10.2


Kohei Suzuki
eagletmt@xxxxxxxxx
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux