summaryrefslogtreecommitdiff
path: root/sys/src/lib9p/post.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-03-07 20:19:14 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2020-03-07 20:19:14 +0100
commit225c359beab9e2f17c66e65647b9e0a94f942620 (patch)
treef68865f87f1c741a3a7205d66a1f9a0cddc7bde2 /sys/src/lib9p/post.c
parente1cdcfdb172071bafef18b1ac160138c97459b79 (diff)
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.
Diffstat (limited to 'sys/src/lib9p/post.c')
-rw-r--r--sys/src/lib9p/post.c86
1 files changed, 21 insertions, 65 deletions
diff --git a/sys/src/lib9p/post.c b/sys/src/lib9p/post.c
index 8abddfbd1..0241c3157 100644
--- a/sys/src/lib9p/post.c
+++ b/sys/src/lib9p/post.c
@@ -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);
-
- /*
- * 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);
- }
+ _forker(postproc, s, RFNAMEG|RFFDG|RFNOTEG);
+
+ 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);
-
- /*
- * 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);
- }
+ _forker(postproc, s, RFNAMEG|RFFDG|RFNOTEG);
+
+ 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);
}