diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-03-07 20:19:14 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-03-07 20:19:14 +0100 |
commit | 225c359beab9e2f17c66e65647b9e0a94f942620 (patch) | |
tree | f68865f87f1c741a3a7205d66a1f9a0cddc7bde2 /sys/src/lib9p/post.c | |
parent | e1cdcfdb172071bafef18b1ac160138c97459b79 (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.c | 86 |
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); } |