shithub: drawfs

Download patch

ref: 9712751526835c0a190e8abcd6f495df9cc80b87
parent: 798897c28e191cd4c2513afb658fa196b3fbb95c
author: sirjofri <sirjofri@sirjofri.de>
date: Fri Jan 24 12:49:10 EST 2025

fixes client counting in drawgen dirread function

--- a/drawfs/fs.c
+++ b/drawfs/fs.c
@@ -913,7 +913,7 @@
 	cl = mallocz(sizeof(Client), 1);
 	if (!cl)
 		return nil;
-	fprint(2, "new client: %d\n", i);
+	fprint(2, "new client: %d\n", sdraw.clientid+1);
 	cl->slot = i;
 	cl->clientid = ++sdraw.clientid;
 	cl->op = SoverD;
@@ -960,8 +960,10 @@
 	switch (QIDTYPE(q)) {
 	case Qclient:
 		cl = drawclientofpath(q);
-		if (!cl)
+		if (!cl) {
+			fprint(2, "invalid client\n");
 			return; // TODO: error: invalid client
+		}
 		snprint(buf, sizeof buf, "%d", cl->clientid);
 		d->name = estrdup9p(buf);
 	}
@@ -996,6 +998,25 @@
 	return -1;
 }
 
+static Client*
+getnthclient(int n)
+{
+	Client *cl;
+	
+	if (n > sdraw.nclient)
+		return nil;
+	
+	for (int i = 0; i < sdraw.nclient; i++) {
+		if (sdraw.client[i]) {
+			n--;
+		}
+		if (!n) {
+			return sdraw.client[i];
+		}
+	}
+	return nil;
+}
+
 static int
 drawgen(int n, Dir *dir, void*)
 {
@@ -1006,16 +1027,12 @@
 		return 0;
 	}
 	
-	/* n is index for client, starting at 1 */
-	if (n <= sdraw.nclient) {
-		cl = sdraw.client[n-1];
-		if (!cl)
-			return -1;
-		gendir(dir, (n<<QSHIFT)|Qclient, 0);
-		return 0;
-	}
-	
-	return -1;
+	cl = getnthclient(n);
+	if (!cl)
+		return -1;
+	fprint(2, "found client: %d %p\n", n, cl);
+	gendir(dir, ((cl->slot+1)<<QSHIFT)|Qclient, 0);
+	return 0;
 }
 
 static int
@@ -1056,8 +1073,7 @@
 	case Qnew:
 		break;
 	case Qctl:
-		if (!cl)
-			cl = drawclient(r->fid->qid);
+		cl = drawclient(r->fid->qid);
 		if (cl->busy) {
 			respond(r, Einuse);
 			goto Out;
@@ -1091,6 +1107,7 @@
 		if (!cl) {
 			fprint(2, "client not valid: %uld\n", CLIENT(r->fid->qid));
 		}
+		fprint(2, "open file for client: %d\n", cl->clientid);
 		incref(&cl->r);
 		break;
 	}
@@ -1141,6 +1158,7 @@
 		}
 		sdraw.client[cl->slot] = nil;
 		drawflush(); /* to erase visible, now dead windows */
+		fprint(2, "delete client: %d\n", cl->clientid);
 		free(cl);
 	}
 	dunlock();
@@ -1379,6 +1397,7 @@
 		respond(r, nil);
 }
 
+// TODO: BUG: draw/N/data is not found for second+ client
 static char*
 fswalk(Fid *fid, char *name, Qid *qid)
 {
@@ -1449,6 +1468,7 @@
 	
 	if (q >= 0 && q < Qmax) {
 		gendir(&r->d, r->fid->qid.path, r->fid->qid.vers);
+		fprint(2, "fsstat: gendir\n");
 		respond(r, nil);
 		return;
 	}
--- a/t.rc
+++ b/t.rc
@@ -2,12 +2,12 @@
 
 rfork en
 
-srvfiles=(srv/drawfs.test /srv/drawfs.test.cmd /srv/mousefs.test /srv/mousefs.test.cmd)
+srvfiles=(/srv/drawfs.test /srv/drawfs.test.cmd /srv/mousefs.test /srv/mousefs.test.cmd)
 
 rm $srvfiles >[2]/dev/null
 
-drawfs/6.out -n test
-mousefs/6.out -n test $*
+drawfs/6.out -n test $*
+mousefs/6.out -n test
 
 mount -b /srv/drawfs.test /dev
 mount -b /srv/mousefs.test /dev