code: plan9front

Download patch

ref: 9429dd64f746ebf9afc634f50f3f88d9408cfa7e
parent: 2c67fb9794369eea87c0d2179560f8f79198d34c
author: Jacob Moody <moody@posixcafe.org>
date: Sun May 15 01:44:59 EDT 2022

kernel: disable wstat for devpipe

--- a/sys/src/9/port/devpipe.c
+++ b/sys/src/9/port/devpipe.c
@@ -14,7 +14,6 @@
 	Pipe	*next;
 	int	ref;
 	ulong	path;
-	long	perm;
 	Queue	*q[2];
 	int	qref[2];
 };
@@ -35,10 +34,9 @@
 Dirtab pipedir[] =
 {
 	".",		{Qdir,0,QTDIR},	0,		DMDIR|0500,
-	"data",		{Qdata0},	0,		0600,
-	"data1",	{Qdata1},	0,		0600,
+	"data",		{Qdata0},	0,		0666,
+	"data1",	{Qdata1},	0,		0666,
 };
-#define NPIPEDIR 3
 
 static void
 pipeinit(void)
@@ -86,7 +84,6 @@
 	lock(&pipealloc);
 	p->path = ++pipealloc.path;
 	unlock(&pipealloc);
-	p->perm = pipedir[Qdata0].perm;
 
 	mkqid(&c->qid, NETQID(2*p->path, Qdir), 0, QTDIR);
 	c->aux = p;
@@ -123,7 +120,7 @@
 		break;
 	}
 	mkqid(&q, NETQID(NETID(c->qid.path), tab->qid.path), 0, QTFILE);
-	devdir(c, q, tab->name, len, eve, p->perm, dp);
+	devdir(c, q, tab->name, len, eve, tab->perm, dp);
 	return 1;
 }
 
@@ -134,7 +131,7 @@
 	Walkqid *wq;
 	Pipe *p;
 
-	wq = devwalk(c, nc, name, nname, pipedir, NPIPEDIR, pipegen);
+	wq = devwalk(c, nc, name, nname, pipedir, nelem(pipedir), pipegen);
 	if(wq != nil && wq->clone != nil && wq->clone != c){
 		p = c->aux;
 		qlock(p);
@@ -160,18 +157,22 @@
 {
 	Pipe *p;
 	Dir dir;
+	ulong path;
+	Dirtab *d;
 
 	p = c->aux;
+	path = NETTYPE(c->qid.path);
+	d = pipedir + path;
 
-	switch(NETTYPE(c->qid.path)){
+	switch(path){
 	case Qdir:
-		devdir(c, c->qid, ".", 0, eve, 0555, &dir);
+		devdir(c, c->qid, d->name, 0, eve, d->perm, &dir);
 		break;
 	case Qdata0:
-		devdir(c, c->qid, "data", qlen(p->q[0]), eve, p->perm, &dir);
+		devdir(c, c->qid, d->name, qlen(p->q[0]), eve, d->perm, &dir);
 		break;
 	case Qdata1:
-		devdir(c, c->qid, "data1", qlen(p->q[1]), eve, p->perm, &dir);
+		devdir(c, c->qid, d->name, qlen(p->q[1]), eve, d->perm, &dir);
 		break;
 	default:
 		panic("pipestat");
@@ -182,36 +183,6 @@
 	return n;
 }
 
-static int
-pipewstat(Chan* c, uchar* db, int n)
-{
-	int m;
-	Dir *dir;
-	Pipe *p;
-
-	p = c->aux;
-	if(strcmp(up->user, eve) != 0)
-		error(Eperm);
-	if(NETTYPE(c->qid.path) == Qdir)
-		error(Eisdir);
-
-	dir = smalloc(sizeof(Dir)+n);
-	if(waserror()){
-		free(dir);
-		nexterror();
-	}
-	m = convM2D(db, n, &dir[0], (char*)&dir[1]);
-	if(m == 0)
-		error(Eshortstat);
-	if(!emptystr(dir[0].uid))
-		error("can't change owner");
-	if(dir[0].mode != ~0UL)
-		p->perm = dir[0].mode;
-	poperror();
-	free(dir);
-	return m;
-}
-
 /*
  *  if the stream doesn't exist, create it
  */
@@ -309,7 +280,7 @@
 
 	switch(NETTYPE(c->qid.path)){
 	case Qdir:
-		return devdirread(c, va, n, pipedir, NPIPEDIR, pipegen);
+		return devdirread(c, va, n, pipedir, nelem(pipedir), pipegen);
 	case Qdata0:
 		return qread(p->q[0], va, n);
 	case Qdata1:
@@ -424,5 +395,5 @@
 	pipewrite,
 	pipebwrite,
 	devremove,
-	pipewstat,
+	devwstat,
 };