ipif: service-wrap: Scan directories
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 19 Apr 2017 17:22:50 +0000 (18:22 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 19 Apr 2017 17:24:38 +0000 (18:24 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
ipif/service-wrap

index 7f6dad4..412c2dc 100755 (executable)
@@ -15,7 +15,8 @@
 #
 #   .../ipif1 <v1config> <real-service-program> -- <service-args>...
 #
-# Config file is a series of lines.
+# Config file is a series of lines, or a directory.  If a directory,
+# all files with names matching ^[-A-Za-z0-9_]+$ are processed.
 #
 #   permit <keyword>....
 #
@@ -47,7 +48,7 @@
 #              if a permit has no ifname at all, it is as if
 #              `ifname userv%d' was specified
 #
-#   include <other-config-file>
+#   include <other-config-file-or-directory>
 #
 #   v0config <v0configfile>
 #
@@ -176,8 +177,21 @@ sub maybe_allow_addrs ($$) {
     }
 }
 
+sub readconfig ($);
 sub readconfig ($) {
     local ($cfgpath) = @_;
+
+    my $dirfh;
+    if (opendir $dirfh, $cfgpath) {
+       while ($!=0, my $ent = readdir $dirfh) {
+           next if $ent =~ m/[^-A-Za-z0-9_]/;
+           readconfig "$cfgpath/$ent";
+       }
+       die "$0: $cfgpath: $!\n" if $!;
+       return;
+    }
+    die "$0: $cfgpath: $!\n" unless $!==ENOENT || $!==ENOTDIR;
+
     my $cfgfh = new IO::File $cfgpath, "<";
     if (!$cfgfh) {
        die "$0: $cfgpath: $!\n" unless $!==ENOENT;