git: 9front

Download patch

ref: c6f61aae7a9a8a1cf0b3e85daf66c38ada86e07b
parent: b309f685bce252a009de0a7b6e8fa3d2153aaef6
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Jul 28 05:52:21 EDT 2015

kernel: export mntattach() from devmnt.c avoiding bogus struct passing and special case in namec()

we already export mntauth() and mntversion(), so why not stop
being sneaky and just export mntattach() so bindmount() and
devshr can just call it directly with proper arguments being
checked.

we can also avoid handling #M attach specially in namec()
by having the devmnt's attach function do error(Enoattach).

--- a/sys/src/9/port/chan.c
+++ b/sys/src/9/port/chan.c
@@ -1399,8 +1399,6 @@
 		 */
 		n = chartorune(&r, up->genbuf+1)+1;
 		/* actually / is caught by parsing earlier */
-		if(utfrune("M", r) != nil)
-			error(Enoattach);
 		if(up->pgrp->noattach && utfrune("|decp", r)==nil)
 			error(Enoattach);
 		t = devno(r, 1);
--- a/sys/src/9/port/devmnt.c
+++ b/sys/src/9/port/devmnt.c
@@ -302,22 +302,12 @@
 
 }
 
-static Chan*
-mntattach(char *muxattach)
+Chan*
+mntattach(Chan *c, Chan *ac, char *spec, int flags)
 {
 	Mnt *m;
-	Chan *c;
 	Mntrpc *r;
-	struct bogus{
-		Chan	*chan;
-		Chan	*authchan;
-		char	*spec;
-		int	flags;
-	}bogus;
 
-	bogus = *((struct bogus *)muxattach);
-	c = bogus.chan;
-
 	m = c->mux;
 	if(m == nil){
 		mntversion(c, nil, 0, 0);
@@ -342,12 +332,12 @@
 	}
 	r->request.type = Tattach;
 	r->request.fid = c->fid;
-	if(bogus.authchan == nil)
+	if(ac == nil)
 		r->request.afid = NOFID;
 	else
-		r->request.afid = bogus.authchan->fid;
+		r->request.afid = ac->fid;
 	r->request.uname = up->user;
-	r->request.aname = bogus.spec;
+	r->request.aname = spec;
 	mountrpc(m, r);
 
 	c->qid = r->reply.qid;
@@ -360,12 +350,19 @@
 
 	poperror();	/* c */
 
-	if(bogus.flags&MCACHE)
+	if(flags&MCACHE)
 		c->flag |= CCACHE;
 	return c;
 }
 
 static Chan*
+noattach(char *)
+{
+	error(Enoattach);
+	return nil;
+}
+
+static Chan*
 mntchan(void)
 {
 	Chan *c;
@@ -1422,7 +1419,7 @@
 	mntreset,
 	devinit,
 	devshutdown,
-	mntattach,
+	noattach,
 	mntwalk,
 	mntstat,
 	mntopen,
--- a/sys/src/9/port/devshr.c
+++ b/sys/src/9/port/devshr.c
@@ -724,12 +724,6 @@
 	Chan *bc, *c0;
 	Mhead *h;
 	Mount *m;
-	struct{
-		Chan	*chan;
-		Chan	*authchan;
-		char	*spec;
-		int	flags;
-	}bogus;
 
 	if(up->pgrp->noattach)
 		error(Enoattach);
@@ -758,11 +752,7 @@
 		cclose(bc);
 		nexterror();
 	}
-	bogus.flags = 0;
-	bogus.chan = bc;
-	bogus.authchan = nil;
-	bogus.spec = aname;
-	c0 = devtab[devno('M', 0)]->attach((char*)&bogus);
+	c0 = mntattach(bc, nil, aname, 0);
 	poperror();
 	cclose(bc);
 	poperror();
--- a/sys/src/9/port/portfns.h
+++ b/sys/src/9/port/portfns.h
@@ -173,6 +173,7 @@
 void		mkqid(Qid*, vlong, ulong, int);
 void		mmurelease(Proc*);
 void		mmuswitch(Proc*);
+Chan*		mntattach(Chan*, Chan*, char*, int);
 Chan*		mntauth(Chan*, char*);
 long		mntversion(Chan*, char*, int, int);
 void		mouseresize(void);
--- a/sys/src/9/port/sysfile.c
+++ b/sys/src/9/port/sysfile.c
@@ -1006,12 +1006,6 @@
 {
 	int ret;
 	Chan *c0, *c1, *ac, *bc;
-	struct{
-		Chan	*chan;
-		Chan	*authchan;
-		char	*spec;
-		int	flags;
-	}bogus;
 
 	if((flag&~MMASK) || (flag&MORDER)==(MBEFORE|MAFTER))
 		error(Ebadarg);
@@ -1039,12 +1033,7 @@
 		if(afd >= 0)
 			ac = fdtochan(afd, ORDWR, 0, 1);
 
-		bogus.flags = flag & MCACHE;
-		bogus.chan = bc;
-		bogus.authchan = ac;
-		bogus.spec = spec;
-		ret = devno('M', 0);
-		c0 = devtab[ret]->attach((char*)&bogus);
+		c0 = mntattach(bc, ac, spec, flag&MCACHE);
 		poperror();	/* ac bc */
 		if(ac != nil)
 			cclose(ac);
--