shithub: fsgen

Download patch

ref: e8de389e5962bafe0c32c8911b44809a7af861da
parent: a1ec5db9e60e956073183468ff7b8df57a695bd8
author: sirjofri <sirjofri@sirjofri.de>
date: Tue Dec 16 07:43:55 EST 2025

adds var hashes, ...

--- a/code.c
+++ b/code.c
@@ -208,7 +208,7 @@
 		/* root element */
 		vqids = mallocz(sizeof(Vqid), 1);
 		vqids->name = "root";
-		vqids->vfile = f;
+		vqids->vfile = getfile("/");
 		vqids->vfile->isdir = 1;
 	}
 	
@@ -253,6 +253,7 @@
 {
 	Vqid *v;
 	VFile *f;
+	char *s;
 	char buf[32];
 	if (!vq) return;
 	
@@ -262,7 +263,10 @@
 		pathtostring(buf, sizeof(buf), v->name);
 		print("	[Q%s] {\n", buf);
 		print("		.dir = {\n");
-		print("			.name = \"%s\",\n", v->name);
+		
+		s = strrchr(f->path, '/');
+		print("			.name = \"%s\",\n", s+1);
+		
 		if (f->isdir) {
 			print("			.mode = DMDIR,\n");
 		}
@@ -269,15 +273,15 @@
 		print("		},\n");
 		if (f->hasread) {
 			genfuncname(f, buf, sizeof(buf), "read");
-			print("		.read = %s,\n", buf);
+			print("		.read = Call_%s,\n", buf);
 		}
 		if (f->haswrite) {
 			genfuncname(f, buf, sizeof(buf), "write");
-			print("		.write = %s,\n", buf);
+			print("		.write = Call_%s,\n", buf);
 		}
 		if (f->hasstat) {
 			genfuncname(f, buf, sizeof(buf), "stat");
-			print("		.stat = %s,\n", buf);
+			print("		.stat = Call_%s,\n", buf);
 		}
 		print("	},\n");
 		rprintfilenames(v->children);
--- a/files.c
+++ b/files.c
@@ -12,11 +12,10 @@
 	char *s;
 	int numparts = 1, n;
 	
+	/* root element: / */
 	if (path[1] == 0) {
-		args = mallocz(2, 1);
-		args[0] = mallocz(1, 1);
-		args[0][0] = 0;
-		args[1] = nil;
+		args = mallocz(1, 1);
+		args[0] = nil;
 		return args;
 	}
 	
@@ -80,11 +79,13 @@
 	if (!files) {
 		files = mallocz(sizeof(VFile), 1);
 		files->isdir = 1;
-	} else {
-		old = files;
-		files = mallocz(sizeof(VFile), 1);
-		files->next = old;
+		files->path = strdup("/");
+		files->parts = parsepath(files->path);
 	}
+	old = files;
+	files = mallocz(sizeof(VFile), 1);
+	files->next = old;
+	
 	/* verifyfiles may add new files, thus changing the global files pointer */
 	new = files;
 	new->path = strdup(path);
--- a/fshandler.inc
+++ b/fshandler.inc
@@ -15,34 +15,28 @@
 {
 	uvlong q;
 	Filedata *fd;
-	// TODO: support multiple parameters
 	void (*func)(Req *r);
 	
 	q = breakqid(r->fid->qid.path);
 	
-	for (int i = 0; i < Qmax; i++) {
-		if (q == i) {
-			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;
-			r->d.name = estrdup9p(fd->dir.name);
-			r->d.uid = estrdup9p("none");
-			r->d.gid = estrdup9p("none");
-			r->d.gid = estrdup9p("none");
-			if (fd->stat) {
-				func = fd->stat;
-				func(r);
-				/* if function exists, it should respond */
-				return;
-			} else
-				respond(r, nil);
-			return;
-		}
+	fd = &filedata[q];
+	r->d = fd->dir;
+	qidtype = q;
+	r->d.qid.path = makeqid(getqidhash(r->fid));
+	r->d.qid.vers = 0;
+	r->d.qid.type = fd->dir.mode&DMDIR ? QTDIR : QTFILE;
+	r->d.name = estrdup9p(fd->dir.name);
+	r->d.uid = estrdup9p("none");
+	r->d.gid = estrdup9p("none");
+	r->d.gid = estrdup9p("none");
+	if (fd->stat) {
+		func = fd->stat;
+		func(r);
+		/* if function exists, it should respond */
+		return;
 	}
-	respond(r, "file not found");
+	respond(r, nil);
+	return;
 }
 
 static int
@@ -66,10 +60,29 @@
 	return Qroot;
 }
 
+/* <0 is variable, 0 is root/not found, n is qid */
+static int
+findchild(int qid, char *name)
+{
+	Filedata *fd;
+	char *s;
+	int n;
+	for (int *i = filehierarchy[qid]; *i; i++) {
+		fd = &filedata[*i];
+		s = fd->dir.name;
+		n = strlen(s);
+		if (s[0] == '{' && s[n-1] == '}')
+			return -1;
+		if (strcmp(s, name) == 0)
+			return *i;
+	}
+	return Qroot;
+}
+
 static char*
 fswalk(Fid *fid, char *name, Qid *qid)
 {
-	int qt;
+	int qt, i;
 	uvlong id;
 	Filedata *fd;
 	
@@ -85,7 +98,7 @@
 		qt = findparent(qt);
 		fd = &filedata[qt];
 		qidtype = qt;
-		qid->path = makeqid(id);
+		qid->path = makeqid(getqidhash(fid));
 		qid->vers = 0;
 		qid->type = fd->dir.mode&DMDIR ? QTDIR : QTFILE;
 		fid->qid = *qid;
@@ -93,7 +106,28 @@
 		return nil;
 	}
 	
+	i = findchild(qt, name);
+	switch (i) {
+	case -1:
+		goto Isvar;
+	case 0:
+		/* invalid file */
+		return "file not found";
+	default:
+		/* found child */
+		break;
+	}
+	
+	qidtype = i;
+	fd = &filedata[i];
+	qid->path = makeqid(getqidhash(fid));
+	qid->vers = 0;
+	qid->type = fd->dir.mode&DMDIR ? QTDIR : QTFILE;
+	fid->qid = *qid;
+	
 	return nil;
+Isvar:
+	
 }
 
 static void
--- a/main.c
+++ b/main.c
@@ -247,6 +247,7 @@
 	
 	vfileinit();
 	prepass(bin);
+	print("/* this file was generated from %s */\n", file);
 	printpre();
 	
 	printauxvars();
--- a/preamble.inc
+++ b/preamble.inc
@@ -3,6 +3,8 @@
 #include <thread.h>
 #include <fcall.h>
 #include <9p.h>
+#include <mp.h>
+#include <libsec.h>
 
 int **filehierarchy = nil;
 
--- a/vars.c
+++ b/vars.c
@@ -82,4 +82,39 @@
 	}
 	
 	print("};\n\n");
+	
+	// TODO: secure array out of bounds!
+	print("static uvlong\ngetqidhash(Fid *fid)\n{\n");
+	print(
+	"	FileAux *f = fid->aux;\n"
+	"	char buf[1024];\n"
+	"	uchar dig[SHA1dlen];\n"
+	"	char *s;\n"
+	"	uvlong hash;\n");
+	
+	print("	if (!f) return 0;\n");
+	
+	print("\n	s = buf;\n");
+	for (v = vars; v; v = v->next) {
+		strcpy(buf, v->name+1);
+		s = strchr(buf, '}');
+		*s = 0;
+		
+		print(
+		"	if (f->%s) {\n"
+		"		strcpy(s, f->%s);\n"
+		"		s += strlen(f->%s);\n"
+		"		*s = '/';\n"
+		"		s++;\n"
+		"		*s = 0;\n"
+		"	}\n",
+		buf, buf, buf);
+	}
+	
+	print(
+	"	sha1((uchar*)buf, sizeof(buf), dig, nil);\n"
+	"	memcpy(&hash, dig, sizeof(hash));\n"
+	);
+	
+	print("	return hash & ((0x1<<(SHIFT+1))-1);\n}\n\n");
 }
--