chiark / gitweb /
ipif: service-wrap: Scan directories
[userv-utils.git] / ipif / service-wrap
index 7f6dad46becb56bc3fa3cdd422f127b2a9f28c6b..412c2dc9510bf5d498584461f50188ee95ed92f0 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;