Add -a option to trampoline between two different network addresses.
Change -m option to take netdir explicitly. (See man page.)
[rsc] --rw-rw-r-- M 284191 rsc sys 1199 Sep 7 10:54 sys/man/8/trampoline
/n/sourcesdump/2005/0907/plan9/sys/man/8/trampoline:4,13 -
/n/sources/plan9/sys/man/8/trampoline:4,20
.SH SYNOPSIS
.B aux/trampoline
[
- .B -m9
+ .B -9
]
+ [
+ .B -a
+ .I altaddr
+ ]
+ [
+ .B -m
+ .I netdir
+ ]
.I addr
- .RI [ netdir ]
.SH DESCRIPTION
.I Trampoline
can be used in a service file (see
/n/sourcesdump/2005/0907/plan9/sys/man/8/trampoline:20,35 -
/n/sources/plan9/sys/man/8/trampoline:27,48
.I addr
and copies data between that connection
and its own standard input and output.
- Use the
+ .PP
+ The options are:
+ .TP
.B -9
- option if the connection carries only unencrypted 9P messages, to allow
+ The connection carries only 9P messages. In this case
.I trampoline
- to size its buffer automatically.
- .PP
- Forwarding can be restricted to a particular calling machine,
- using the
- .B -m
- option.
+ will relay whole messages at a time.
+ .TP
+ .BI -a " altaddr
+ Dial
+ .I altaddr
+ and relay between the two network connections,
+ ignoring standard input and output.
+ .TP
+ .BI -m " netdir
+ Restrict forwarding to particular machines.
.I Netdir
must be the incoming call directory.
.I Trampoline
/n/sourcesdump/2005/0907/plan9/sys/man/8/trampoline:42,47 -
/n/sources/plan9/sys/man/8/trampoline:55,61
and the attribute
.BR trampok .
If no such entry is found, the call is rejected.
+ .PD
.SH FILES
.TF /sys/log/trampoline
.TP
[rsc] --rw-rw-r-- M 284191 glenda sys 3790 Sep 7 10:54 sys/src/cmd/aux/trampoline.c
/n/sourcesdump/2005/0907/plan9/sys/src/cmd/aux/trampoline.c:27,56 -
/n/sources/plan9/sys/src/cmd/aux/trampoline.c:27,68
int macok(char*);
void
+ usage(void)
+ {
+ fprint(2, "usage: trampoline [-9] [-a addr] [-m netdir] addr\n");
+ exits("usage");
+ }
+
+ void
main(int argc, char **argv)
{
- int fd;
- int checkmac = 0;
- Endpoints *ep;
- char *mac;
+ char *altaddr, *checkmac, *mac;
+ int fd, fd0, fd1;
void (*x)(int, int);
+ Endpoints *ep;
+ checkmac = nil;
+ altaddr = nil;
x = xfer;
ARGBEGIN{
- case 'm':
- checkmac = 1;
- break;
case '9':
x = xfer9p;
break;
+ case 'a':
+ altaddr = EARGF(usage());
+ break;
+ case 'm':
+ checkmac = EARGF(usage());
+ break;
+ default:
+ usage();
}ARGEND;
- if(argc < 1){
- fprint(2, "usage: %s dialstring\n", argv0);
- exits("usage");
- }
- if(checkmac && argc > 1){
- ep = getendpoints(argv[1]);
+ if(argc != 1)
+ usage();
+
+ if(checkmac){
+ ep = getendpoints(checkmac);
mac = iptomac(ep->rsys, ep->net);
if(!macok(mac)){
syslog(0, "trampoline", "badmac %s from %s!%s for %s!%s on %s",
/n/sourcesdump/2005/0907/plan9/sys/src/cmd/aux/trampoline.c:58,68 -
/n/sources/plan9/sys/src/cmd/aux/trampoline.c:70,88
exits("bad mac");
}
}
- fd = dial(argv[0], 0, 0, 0);
- if(fd < 0){
- fprint(2, "%s: dialing %s: %r\n", argv0, argv[0]);
- exits("dial");
+
+ fd0 = 0;
+ fd1 = 1;
+ if(altaddr){
+ fd0 = dial(altaddr, 0, 0, 0);
+ if(fd0 < 0)
+ sysfatal("dial %s: %r", altaddr);
+ fd1 = fd0;
}
+ fd = dial(argv[0], 0, 0, 0);
+ if(fd < 0)
+ sysfatal("dial %s: %r", argv[0]);
+
rfork(RFNOTEG);
switch(fork()){
case -1:
/n/sourcesdump/2005/0907/plan9/sys/src/cmd/aux/trampoline.c:69,78 -
/n/sources/plan9/sys/src/cmd/aux/trampoline.c:89,98
fprint(2, "%s: fork: %r\n", argv0);
exits("dial");
case 0:
- (*x)(0, fd);
+ (*x)(fd0, fd);
break;
default:
- (*x)(fd, 1);
+ (*x)(fd, fd1);
break;
}
postnote(PNGROUP, getpid(), "die yankee pig dog");
[sys] --rwxrwxr-x M 284191 glenda sys 83645 Sep 7 23:07 386/bin/aux/trampoline
/sys/src/cmd/aux/trampoline.c:getendpoint
/sys/src/cmd/aux/trampoline.c:getendpoints
/sys/src/cmd/aux/trampoline.c:iptomac
/sys/src/cmd/aux/trampoline.c:macok
/sys/src/cmd/aux/trampoline.c:main
/sys/src/cmd/aux/trampoline.c:usage
/sys/src/cmd/aux/trampoline.c:xfer9p
|