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:
cinap_lenrek 2020-03-07 20:19:14 +01:00
parent e1cdcfdb17
commit 225c359bea
4 changed files with 21 additions and 71 deletions

View file

@ -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 */

View file

@ -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

View file

@ -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);
}

View file

@ -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)