summaryrefslogtreecommitdiff
path: root/sys/src/lib9p
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-03-08 22:00:23 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2020-03-08 22:00:23 +0100
commite9e55a21f66a3eff114025dcb1fe62570d0fa3e6 (patch)
tree779a635590ee01c03219b4054757ec7fc905904d /sys/src/lib9p
parent11628e90fb85137a3f02e4ad5c343c15a90846b5 (diff)
lib9p: implement automatic remove-on-close cleanup in postsharesrv(), remove postfd() and sharefd() functions
with the latest changes to shr(3), we can use ORCLOSE on the control file to get the mount in the share automatically removed when the server exits or something goes wrong during postsharesrv(). do not expose postfd() and sharefd() functions. they where undocumented and leak the control file descriptors.
Diffstat (limited to 'sys/src/lib9p')
-rw-r--r--sys/src/lib9p/post.c99
-rw-r--r--sys/src/lib9p/srv.c56
2 files changed, 54 insertions, 101 deletions
diff --git a/sys/src/lib9p/post.c b/sys/src/lib9p/post.c
index 65a98e1f6..ba4265494 100644
--- a/sys/src/lib9p/post.c
+++ b/sys/src/lib9p/post.c
@@ -5,21 +5,37 @@
#include <9p.h>
#include <auth.h>
-static void postproc(void*);
+static void
+postproc(void *v)
+{
+ Srv *s;
-void
-_postmountsrv(Srv *s, char *name, char *mtpt, int flag)
+ s = v;
+ rendezvous(0, 0);
+ close(s->srvfd);
+ srv(s);
+}
+
+static void
+postsrv(Srv *s, char *name)
{
+ char buf[80];
int fd[2];
+ int cfd;
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(name != nil){
+ snprint(buf, sizeof buf, "/srv/%s", name);
+ if((cfd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600)) < 0)
+ sysfatal("create %s: %r", buf);
+ if(fprint(cfd, "%d", s->srvfd) < 0)
+ sysfatal("write %s: %r", buf);
+ } else
+ cfd = -1;
if(_forker == nil)
sysfatal("no forker");
@@ -32,53 +48,46 @@ _postmountsrv(Srv *s, char *name, char *mtpt, int flag)
if(s->infd != s->outfd)
close(s->outfd);
- if(mtpt){
- if(amount(s->srvfd, mtpt, flag, "") == -1)
- sysfatal("mount %s: %r", mtpt);
- }else
- close(s->srvfd);
+ if(cfd >= 0)
+ close(cfd);
}
void
-_postsharesrv(Srv *s, char *name, char *mtpt, char *desc)
+_postmountsrv(Srv *s, char *name, char *mtpt, int flag)
{
- int fd[2];
-
- if(pipe(fd) < 0)
- sysfatal("pipe: %r");
- s->infd = s->outfd = fd[1];
- s->srvfd = fd[0];
+ postsrv(s, name);
- if(name)
- if(postfd(name, s->srvfd) < 0)
- sysfatal("postfd %s: %r", name);
-
- if(_forker == nil)
- sysfatal("no forker");
- _forker(postproc, s, RFNAMEG|RFNOTEG);
-
- rfork(RFFDG);
- rendezvous(0, 0);
-
- close(s->infd);
- if(s->infd != s->outfd)
- close(s->outfd);
-
- if(mtpt){
- if(sharefd(mtpt, desc, s->srvfd) < 0)
- sysfatal("sharefd %s: %r", mtpt);
- }else
+ if(mtpt != nil){
+ if(amount(s->srvfd, mtpt, flag, "") == -1)
+ sysfatal("mount %s: %r", mtpt);
+ /* mount closed s->srvfd */
+ } else
close(s->srvfd);
}
-
-static void
-postproc(void *v)
+void
+_postsharesrv(Srv *s, char *name, char *mtpt, char *desc)
{
- Srv *s;
-
- s = v;
- rendezvous(0, 0);
+ char buf[80];
+ int cfd;
+
+ if(mtpt != nil && desc != nil){
+ snprint(buf, sizeof buf, "#σc/%s", mtpt);
+ if((cfd = create(buf, OREAD, DMDIR|0700)) >= 0)
+ close(cfd);
+
+ snprint(buf, sizeof buf, "#σc/%s/%s", mtpt, desc);
+ if((cfd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600)) < 0)
+ sysfatal("create %s: %r", buf);
+ } else
+ cfd = -1;
+
+ postsrv(s, name);
+
+ if(cfd >= 0){
+ if(fprint(cfd, "%d\n", s->srvfd) < 0)
+ sysfatal("write %s: %r", buf);
+ close(cfd);
+ }
close(s->srvfd);
- srv(s);
}
diff --git a/sys/src/lib9p/srv.c b/sys/src/lib9p/srv.c
index 25276d2ad..a764f9c78 100644
--- a/sys/src/lib9p/srv.c
+++ b/sys/src/lib9p/srv.c
@@ -918,59 +918,3 @@ responderror(Req *r)
rerrstr(errbuf, sizeof errbuf);
respond(r, errbuf);
}
-
-int
-postfd(char *name, int pfd)
-{
- int fd;
- char buf[80];
-
- snprint(buf, sizeof buf, "/srv/%s", name);
- if(chatty9p)
- fprint(2, "postfd %s\n", buf);
- fd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600);
- if(fd < 0){
- if(chatty9p)
- fprint(2, "create fails: %r\n");
- return -1;
- }
- if(fprint(fd, "%d", pfd) < 0){
- if(chatty9p)
- fprint(2, "write fails: %r\n");
- close(fd);
- return -1;
- }
- if(chatty9p)
- fprint(2, "postfd successful\n");
- return 0;
-}
-
-int
-sharefd(char *name, char *desc, int pfd)
-{
- int fd;
- char buf[80];
-
- snprint(buf, sizeof buf, "#σc/%s", name);
- if((fd = create(buf, OREAD, 0700|DMDIR)) >= 0)
- close(fd);
- snprint(buf, sizeof buf, "#σc/%s/%s", name, desc);
- if(chatty9p)
- fprint(2, "sharefd %s\n", buf);
- fd = create(buf, OWRITE, 0600);
- if(fd < 0){
- if(chatty9p)
- fprint(2, "create fails: %r\n");
- return -1;
- }
- if(fprint(fd, "%d\n", pfd) < 0){
- if(chatty9p)
- fprint(2, "write fails: %r\n");
- close(fd);
- return -1;
- }
- close(fd);
- if(chatty9p)
- fprint(2, "sharefd successful\n");
- return 0;
-}