import: add -x flag

This commit is contained in:
Russ Cox 2008-12-06 16:44:26 -08:00
parent 3d52c7487f
commit 351f474b11
2 changed files with 41 additions and 26 deletions

View file

@ -4,7 +4,7 @@ import \- import 9P resources from another system
.SH SYNOPSIS
.B import
[
.B -df
.B -dfx
]
[
.B -n
@ -67,6 +67,12 @@ The
option keeps
.I import
from forking itself into the background, also useful for debugging.
.PP
The
.B -x
option reverses the roles of the two machines,
exporting the service to, instead of importing it from,
the remote system.
.SH EXAMPLE
Suppose you run
.B sam

View file

@ -7,19 +7,20 @@
int debug;
int dfd;
int srvfd;
int netfd;
int netfd[2];
int srv_to_net[2];
int net_to_srv[2];
char *srv;
char *addr;
char *ns;
int export;
void shuffle(void *arg);
int post(char *srv);
void remoteside(char *ns, char *srv);
void remoteside(void*);
int call(char *rsys, char *ns, char *srv);
void* emalloc(int size);
void runproc(void *arg);
void localside(void*);
char *REXEXEC = "ssh";
char *prog = "import";
@ -55,6 +56,7 @@ threadmain(int argc, char *argv[])
{
int dofork;
int rem;
void (*fn)(void*);
dofork = 1;
rem = 0;
@ -80,6 +82,9 @@ threadmain(int argc, char *argv[])
case 'R':
rem = 1;
break;
case 'x':
export = 1;
break;
}ARGEND
if(debug){
@ -94,39 +99,43 @@ threadmain(int argc, char *argv[])
fmtinstall('F', fcallfmt);
}
/* is this the remote side? */
if(rem){
if(srv == nil)
fatal("-R requires -s");
remoteside(ns, srv);
threadexitsall(0);
netfd[0] = 0;
netfd[1] = 1;
write(1, "OK", 2);
}else{
if(argc != 1)
usage();
addr = argv[0];
/* connect to remote service */
netfd[0] = netfd[1] = call(addr, ns, srv);
}
if(argc != 1)
usage();
addr = argv[0];
fn = localside;
if(rem+export == 1)
fn = remoteside;
if(dofork)
proccreate(runproc, nil, Stack);
if(rem || !dofork)
fn(nil);
else
runproc(nil);
proccreate(fn, nil, Stack);
}
void
runproc(void *arg)
localside(void *arg)
{
USED(arg);
/* start a loal service and connect to remote service */
/* start a loal service */
srvfd = post(srv);
netfd = call(addr, ns, srv);
/* threads to shuffle messages each way */
srv_to_net[0] = srvfd;
srv_to_net[1] = netfd;
srv_to_net[1] = netfd[1];
proccreate(shuffle, srv_to_net, Stack);
net_to_srv[0] = netfd;
net_to_srv[0] = netfd[0];
net_to_srv[1] = srvfd;
shuffle(net_to_srv);
}
@ -172,6 +181,8 @@ call(char *rsys, char *ns, char *srv)
}
av[ac++] = "-s";
av[ac++] = srv;
if(export)
av[ac++] = "-x";
av[ac] = 0;
if(debug){
@ -254,7 +265,7 @@ shuffle(void *arg)
}
void
remoteside(char *ns, char *srv)
remoteside(void *v)
{
int srv_to_net[2];
int net_to_srv[2];
@ -277,13 +288,11 @@ remoteside(char *ns, char *srv)
fprint(dfd, "remoteside dial %s succeeded\n", addr);
fcntl(srvfd, F_SETFL, FD_CLOEXEC);
write(1, "OK", 2);
/* threads to shuffle messages each way */
srv_to_net[0] = srvfd;
srv_to_net[1] = 1;
srv_to_net[1] = netfd[1];
proccreate(shuffle, srv_to_net, Stack);
net_to_srv[0] = 0;
net_to_srv[0] = netfd[0];
net_to_srv[1] = srvfd;
shuffle(net_to_srv);