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