ref: 447faea42c09161a13f57523a3726dfee294d0e8
parent: 17039fc93f8eb42fe58797dee5082f486616a6a6
author: sirjofri <sirjofri@sirjofri.de>
date: Mon Dec 15 11:59:36 EST 2025
call functions (no parameters yet)
--- a/code.c
+++ b/code.c
@@ -49,12 +49,20 @@
*s = '_';
}
+static void
+genfuncname(VFile *file, char *buf, int size, char *nm)
+{+ char pbuf[32];
+ pathtostring(pbuf, sizeof(pbuf), file->path);
+ snprint(buf, size, "fs%s_%s", nm, pbuf);
+}
+
void
printgenfunc(VFile *file, char *nm)
{- char buf[64];
- pathtostring(buf, sizeof(buf), file->path);
- print("static void\nfs%s_%s(Req *r", nm, buf);+ char buf[32];
+ genfuncname(file, buf, sizeof(buf), nm);
+ print("static void\n%s(Req *r", buf);printvars(file);
print(")\n");}
@@ -184,6 +192,7 @@
/* root element */
vqids = mallocz(sizeof(Vqid), 1);
vqids->name = "root";
+ vqids->vfile = f;
}
v = vqids;
@@ -224,13 +233,30 @@
rprintfilenames(Vqid *vq)
{Vqid *v;
+ VFile *f;
char buf[32];
if (!vq) return;
for (v = vq; v; v = v->next) {+ f = v->vfile;
+ assert(f);
pathtostring(buf, sizeof(buf), v->name);
print(" [Q%s] {\n", buf);- print(" .name = \"%s\",\n", v->name);+ print(" .dir = {\n");+ print(" .name = \"%s\",\n", v->name);+ print(" },\n");+ if (f->hasread) {+ genfuncname(f, buf, sizeof(buf), "read");
+ print(" .read = %s,\n", buf);+ }
+ if (f->haswrite) {+ genfuncname(f, buf, sizeof(buf), "write");
+ print(" .write = %s,\n", buf);+ }
+ if (f->hasstat) {+ genfuncname(f, buf, sizeof(buf), "stat");
+ print(" .stat = %s,\n", buf);+ }
print(" },\n");rprintfilenames(v->children);
}
@@ -244,7 +270,7 @@
rprintqids(vqids, 1);
print(" Qmax,\n"); print("};\n\n");- print("Dir filedata[] = {\n");+ print("Filedata filedata[] = {\n");rprintfilenames(vqids);
print("};\n\n");}
--- a/fshandler.inc
+++ b/fshandler.inc
@@ -14,13 +14,25 @@
fsstat(Req *r)
{uvlong q;
+ Filedata *fd;
+ // TODO: support multiple parameters
+ void (*func)(Req *r);
q = breakqid(r->fid->qid.path);
- for (int i = 1; i < Qmax; i++) {+ for (int i = 0; i < Qmax; i++) { if (q == i) {- r->d = filedata[i];
- respond(r, nil);
+ fd = &filedata[i];
+ r->d = fd->dir;
+ qidtype = i;
+ r->d.qid.path = makeqid(0);
+ r->d.qid.vers = 0;
+ r->d.qid.type = fd->dir.mode&DMDIR ? QTDIR : QTFILE;
+ if (fd->stat) {+ func = fd->stat;
+ func(r);
+ } else
+ respond(r, nil);
return;
}
}
--- a/preamble.inc
+++ b/preamble.inc
@@ -9,6 +9,15 @@
int *children;
};
+typedef struct Filedata Filedata;
+struct Filedata {+ void *read;
+ void *write;
+ void *stat;
+
+ Dir dir;
+};
+
int SHIFT = 3;
int qidtype = -1;
--
⑨