shithub: riscv

Download patch

ref: e9e55a21f66a3eff114025dcb1fe62570d0fa3e6
parent: 11628e90fb85137a3f02e4ad5c343c15a90846b5
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Mar 8 18:00:23 EDT 2020

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.

--- a/sys/include/9p.h
+++ b/sys/include/9p.h
@@ -246,8 +246,6 @@
 void		_postsharesrv(Srv*, char*, char*, char*);
 void		listensrv(Srv*, char*);
 void		_listensrv(Srv*, char*);
-int 		postfd(char*, int);
-int		sharefd(char*, char*, int);
 int		chatty9p;
 void		respond(Req*, char*);
 void		responderror(Req*);
--- a/sys/man/2/9p
+++ b/sys/man/2/9p
@@ -1,12 +1,12 @@
 .TH 9P 2
 .SH NAME
 Srv,
+chatty9p,
 dirread9p,
 emalloc9p,
 erealloc9p,
 estrdup9p,
 listensrv,
-postfd,
 postmountsrv,
 postsharesrv,
 readbuf,
@@ -72,7 +72,6 @@
 void	threadpostsharesrv(Srv *s, char *name, char *mtpt, char *desc)
 void	listensrv(Srv *s, char *addr)
 void	threadlistensrv(Srv *s, char *addr)
-int	postfd(char *srvname, int fd)
 void	respond(Req *r, char *error)
 void	responderror(Req*)
 void	readstr(Req *r, char *src)
@@ -185,12 +184,9 @@
 .IP
 If
 .B name
-is non-nil, call
-.BI postfd( s -> srvfd ,
-.IB name )
-to post
+is non-nil, post the file descriptor
 .IB s -> srvfd
-as
+under the name
 .BI /srv/ name .
 .IP
 Fork a child process via
--- a/sys/src/lib9p/post.c
+++ b/sys/src/lib9p/post.c
@@ -5,12 +5,23 @@
 #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");
@@ -17,9 +28,14 @@
 	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,10 +48,20 @@
 	if(s->infd != s->outfd)
 		close(s->outfd);
 
-	if(mtpt){
+	if(cfd >= 0)
+		close(cfd);
+}
+
+void
+_postmountsrv(Srv *s, char *name, char *mtpt, int flag)
+{
+	postsrv(s, name);
+
+	if(mtpt != nil){
 		if(amount(s->srvfd, mtpt, flag, "") == -1)
 			sysfatal("mount %s: %r", mtpt);
-	}else
+		/* mount closed s->srvfd */
+	} else
 		close(s->srvfd);
 }
 
@@ -42,43 +68,26 @@
 void
 _postsharesrv(Srv *s, char *name, char *mtpt, char *desc)
 {
-	int fd[2];
+	char buf[80];
+	int cfd;
 
-	if(pipe(fd) < 0)
-		sysfatal("pipe: %r");
-	s->infd = s->outfd = fd[1];
-	s->srvfd = fd[0];
+	if(mtpt != nil && desc != nil){
+		snprint(buf, sizeof buf, "#σc/%s", mtpt);
+		if((cfd = create(buf, OREAD, DMDIR|0700)) >= 0)
+			close(cfd);
 
-	if(name)
-		if(postfd(name, s->srvfd) < 0)
-			sysfatal("postfd %s: %r", name);
+		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;
 
-	if(_forker == nil)
-		sysfatal("no forker");
-	_forker(postproc, s, RFNAMEG|RFNOTEG);
+	postsrv(s, name);
 
-	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
-		close(s->srvfd);
-}
-
-
-static void
-postproc(void *v)
-{
-	Srv *s;
-
-	s = v;
-	rendezvous(0, 0);
+	if(cfd >= 0){
+		if(fprint(cfd, "%d\n", s->srvfd) < 0)
+			sysfatal("write %s: %r", buf);
+		close(cfd);
+	}
 	close(s->srvfd);
-	srv(s);
 }
--- a/sys/src/lib9p/srv.c
+++ b/sys/src/lib9p/srv.c
@@ -918,59 +918,3 @@
 	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;
-}