shithub: fsgen

Download patch

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;
 
--