lib9p: get rid of Srv.nopipe and Srv.leavefdsopen hacks
it is unclear how Srv.nopipe flag should work inside postmountserv(). if a server wants to serve on stdio descriptors, he can just call srv() after initializing Srv.infd and Srv.outfd. The Srv.leavefdsopen hack can be removed now that acme win has been fixed.
This commit is contained in:
parent
e1cdcfdb17
commit
225c359bea
4 changed files with 21 additions and 71 deletions
|
@ -215,9 +215,7 @@ struct Srv {
|
|||
|
||||
int infd;
|
||||
int outfd;
|
||||
int nopipe;
|
||||
int srvfd;
|
||||
int leavefdsopen; /* magic for acme win */
|
||||
char* keyspec;
|
||||
|
||||
/* below is implementation-specific; don't use */
|
||||
|
|
|
@ -59,7 +59,6 @@ typedef struct Srv {
|
|||
int infd;
|
||||
int outfd;
|
||||
int srvfd;
|
||||
int nopipe;
|
||||
} Srv;
|
||||
.fi
|
||||
.PP
|
||||
|
@ -175,10 +174,7 @@ are wrappers that create a separate process in which to run
|
|||
.IR srv .
|
||||
They do the following:
|
||||
.IP
|
||||
If
|
||||
.IB s -> nopipe
|
||||
is zero (the common case),
|
||||
initialize
|
||||
Initialize
|
||||
.IB s -> infd
|
||||
and
|
||||
.IB s -> outfd
|
||||
|
|
|
@ -12,42 +12,22 @@ _postmountsrv(Srv *s, char *name, char *mtpt, int flag)
|
|||
{
|
||||
int fd[2];
|
||||
|
||||
if(!s->nopipe){
|
||||
if(pipe(fd) < 0)
|
||||
sysfatal("pipe: %r");
|
||||
s->infd = s->outfd = fd[1];
|
||||
s->srvfd = fd[0];
|
||||
}
|
||||
if(pipe(fd) < 0)
|
||||
sysfatal("pipe: %r");
|
||||
s->infd = s->outfd = fd[1];
|
||||
s->srvfd = fd[0];
|
||||
|
||||
if(name)
|
||||
if(postfd(name, s->srvfd) < 0)
|
||||
sysfatal("postfd %s: %r", name);
|
||||
|
||||
if(_forker == nil)
|
||||
sysfatal("no forker");
|
||||
_forker(postproc, s, RFNAMEG);
|
||||
_forker(postproc, s, RFNAMEG|RFFDG|RFNOTEG);
|
||||
|
||||
/*
|
||||
* Normally the server is posting as the last thing it does
|
||||
* before exiting, so the correct thing to do is drop into
|
||||
* a different fd space and close the 9P server half of the
|
||||
* pipe before trying to mount the kernel half. This way,
|
||||
* if the file server dies, we don't have a ref to the 9P server
|
||||
* half of the pipe. Then killing the other procs will drop
|
||||
* all the refs on the 9P server half, and the mount will fail.
|
||||
* Otherwise the mount hangs forever.
|
||||
*
|
||||
* Libthread in general and acme win in particular make
|
||||
* it hard to make this fd bookkeeping work out properly,
|
||||
* so leaveinfdopen is a flag that win sets to opt out of this
|
||||
* safety net.
|
||||
*/
|
||||
if(!s->leavefdsopen){
|
||||
rfork(RFFDG);
|
||||
rendezvous(0, 0);
|
||||
close(s->infd);
|
||||
if(s->infd != s->outfd)
|
||||
close(s->outfd);
|
||||
}
|
||||
close(s->infd);
|
||||
if(s->infd != s->outfd)
|
||||
close(s->outfd);
|
||||
|
||||
if(mtpt){
|
||||
if(amount(s->srvfd, mtpt, flag, "") == -1)
|
||||
|
@ -61,42 +41,22 @@ _postsharesrv(Srv *s, char *name, char *mtpt, char *desc)
|
|||
{
|
||||
int fd[2];
|
||||
|
||||
if(!s->nopipe){
|
||||
if(pipe(fd) < 0)
|
||||
sysfatal("pipe: %r");
|
||||
s->infd = s->outfd = fd[1];
|
||||
s->srvfd = fd[0];
|
||||
}
|
||||
if(pipe(fd) < 0)
|
||||
sysfatal("pipe: %r");
|
||||
s->infd = s->outfd = fd[1];
|
||||
s->srvfd = fd[0];
|
||||
|
||||
if(name)
|
||||
if(postfd(name, s->srvfd) < 0)
|
||||
sysfatal("postfd %s: %r", name);
|
||||
|
||||
if(_forker == nil)
|
||||
sysfatal("no forker");
|
||||
_forker(postproc, s, RFNAMEG);
|
||||
_forker(postproc, s, RFNAMEG|RFFDG|RFNOTEG);
|
||||
|
||||
/*
|
||||
* Normally the server is posting as the last thing it does
|
||||
* before exiting, so the correct thing to do is drop into
|
||||
* a different fd space and close the 9P server half of the
|
||||
* pipe before trying to mount the kernel half. This way,
|
||||
* if the file server dies, we don't have a ref to the 9P server
|
||||
* half of the pipe. Then killing the other procs will drop
|
||||
* all the refs on the 9P server half, and the mount will fail.
|
||||
* Otherwise the mount hangs forever.
|
||||
*
|
||||
* Libthread in general and acme win in particular make
|
||||
* it hard to make this fd bookkeeping work out properly,
|
||||
* so leaveinfdopen is a flag that win sets to opt out of this
|
||||
* safety net.
|
||||
*/
|
||||
if(!s->leavefdsopen){
|
||||
rfork(RFFDG);
|
||||
rendezvous(0, 0);
|
||||
close(s->infd);
|
||||
if(s->infd != s->outfd)
|
||||
close(s->outfd);
|
||||
}
|
||||
close(s->infd);
|
||||
if(s->infd != s->outfd)
|
||||
close(s->outfd);
|
||||
|
||||
if(mtpt){
|
||||
if(sharefd(mtpt, desc, s->srvfd) < 0)
|
||||
|
@ -112,10 +72,6 @@ postproc(void *v)
|
|||
Srv *s;
|
||||
|
||||
s = v;
|
||||
if(!s->leavefdsopen){
|
||||
rfork(RFNOTEG);
|
||||
rendezvous(0, 0);
|
||||
close(s->srvfd);
|
||||
}
|
||||
close(s->srvfd);
|
||||
srv(s);
|
||||
}
|
||||
|
|
|
@ -158,7 +158,7 @@ main(int argc, char **argv)
|
|||
usage();
|
||||
|
||||
if(chatty9p)
|
||||
fprint(2, "ramsrv.nopipe %d srvname %s mtpt %s\n", fs.nopipe, srvname, mtpt);
|
||||
fprint(2, "srvname %s mtpt %s\n", srvname, mtpt);
|
||||
if(addr == nil && srvname == nil && mtpt == nil)
|
||||
sysfatal("must specify -a, -s, or -m option");
|
||||
if(addr)
|
||||
|
|
Loading…
Reference in a new issue