chiark / gitweb /
New -l options for local cmd. Gah.
authorian <ian>
Sat, 25 Sep 1999 01:44:18 +0000 (01:44 +0000)
committerian <ian>
Sat, 25 Sep 1999 01:44:18 +0000 (01:44 +0000)
ipif/udptunnel

index a40dce06180e6e60060b22de804815729669d42e..7c977e172f6e7b9eb1a23abace21fa938426e922 100755 (executable)
@@ -3,6 +3,7 @@
 #
 # usage:
 #  udptunnel
+#        [ -l[<local-command/arg>] ... . ]
 #            <public-local-host/addr>,<public-local-port>
 #            <public-remote-host/addr>,<public-remote-port>
 #            <private-local-addr>,<private-remote-addr>,<mtu>,<proto>
@@ -24,6 +25,8 @@
 # udptunnel will userv ipif locally, as
 #    userv root ipif <private-local-addr>,<private-remote-addr>,<mtu>,<proto>
 #                    <extra-local-nets>
+# or, if -lc was given, userv root ipif is replaced with the argument(s) to
+# successive -lc options.
 
 use Socket;
 use POSIX;
@@ -68,6 +71,19 @@ sub show_addr_port ($) {
     return inet_ntoa($s[1]).','.$s[0];
 }
 
+@lcmd= ();
+
+while ($ARGV[0] =~ m/^-/) {
+    $_= shift @ARGV;
+    last if $_ eq '--';
+    if (s/^-l//) {
+       push @lcmd,$_ if length;
+       while (@ARGV && ($_= shift @ARGV) ne '-') { push @lcmd, $_; }
+    } else {
+       quit("unknown option \`$_'");
+    }
+}
+
 ($las,$lps)= eat_addr_port('print|silent');
 $la= conv_host_addr($las);
 $lp= conv_port_number($lps);
@@ -134,7 +150,11 @@ $rsp= show_addr_port($rs);
 
 if ($lps eq 'print') { print($lsp,"\n") or quit("write port to stdout: $!"); }
 
+@lcmd= qw(userv root ipif) unless @lcmd;
+
 debug("using remote $rsp local $lsp");
+push @lcmd, ("$lva,$rva,$mtu,$proto",$lepn);
+debug("local command @lcmd");
 
 pipe(UR,UW) or fail("up pipe");
 pipe(DR,DW) or fail("down pipe");
@@ -144,8 +164,8 @@ if (!$c3) {
     close UR; close DW;
     open(STDIN,"<&DR") or fail("reopen stdin for packets");
     open(STDOUT,">&UW") or fail("reopen stdout for packets");
-    exec "userv","root","ipif","$lva,$rva,$mtu,$proto",$lepn;
-    quit("cannot execute userv ipif: $!");
+    exec @lcmd;
+    quit("cannot execute $lcmd[0]: $!");
 }
 close UW;
 close DR;