shithub: fsgen

Download patch

ref: e81025205d1ac4e517e2a4e21dfa9326c937a57b
parent: 447faea42c09161a13f57523a3726dfee294d0e8
author: sirjofri <sirjofri@sirjofri.de>
date: Mon Dec 15 13:17:31 EST 2025

working mount

--- a/code.c
+++ b/code.c
@@ -137,7 +137,7 @@
 	else
 		s = buf;
 	
-	print("\n#line 0 \"fshandler.inc\"\n"
+	print("%s", "\n#line 0 \"fshandler.inc\"\n"
 #include "fshandler.cinc"
 	);
 	
@@ -144,12 +144,13 @@
 	print("\n#line 0 \"fsgen/code.c\"");
 	print("\n"
 	"Srv fs = {\n"
+	"	.attach = fsattach,\n"
 	"	.read = fsread,\n"
 	"	.stat = fsstat,\n"
 	"	.walk1 = fswalk,\n"
 	"};\n\n");
 	
-	print("int **filehierarchy = nil;\n\n"
+	print(
 	"static void\n"
 	"buildfilehierarchy()\n"
 	"{\n");
@@ -165,7 +166,7 @@
 	"Srv*\n"
 	"getfs_%s()\n", s);
 	
-	print("#line 0 \"fsfunc.inc\"\n"
+	print("%s", "#line 0 \"fsfunc.inc\"\n"
 #include "fsfunc.cinc"
 	);
 }
@@ -187,6 +188,7 @@
 {
 	Vqid *v, *nv;
 	char **s;
+	char buf[64];
 	
 	if (!vqids) {
 		/* root element */
@@ -193,6 +195,7 @@
 		vqids = mallocz(sizeof(Vqid), 1);
 		vqids->name = "root";
 		vqids->vfile = f;
+		vqids->vfile->isdir = 1;
 	}
 	
 	v = vqids;
@@ -207,7 +210,8 @@
 			continue;
 		}
 		nv = mallocz(sizeof(Vqid), 1);
-		nv->name = strdup(*s);
+		pathtostring(buf, sizeof(buf), f->path);
+		nv->name = strdup(buf);
 		nv->vfile = f;
 		nv->next = v->children;
 		v->children = nv;
@@ -244,6 +248,9 @@
 		print("	[Q%s] {\n", buf);
 		print("		.dir = {\n");
 		print("			.name = \"%s\",\n", v->name);
+		if (f->isdir) {
+			print("			.mode = DMDIR,\n");
+		}
 		print("		},\n");
 		if (f->hasread) {
 			genfuncname(f, buf, sizeof(buf), "read");
--- a/files.c
+++ b/files.c
@@ -40,10 +40,37 @@
 	return nil;
 }
 
+static int
+verifyfiles(char **parts)
+{
+	VFile *vf;
+	char buf[64];
+	char *s;
+	char **a;
+	int i, numparts = 0;
+	
+	for (a = parts; *a; a++)
+		numparts++;
+	
+	s = buf;
+	for (i = 1; i < numparts - 1; i++) {
+		strcpy(s, parts[i]);
+		vf = addfile(buf);
+		if (!vf)
+			return 0;
+		vf->isdir = 1;
+		s += strlen(parts[i]);
+		*s = '_';
+		s++;
+	}
+	return 1;
+}
+
 VFile*
 addfile(char *path)
 {
 	VFile *old;
+	
 	old = getfile(path);
 	if (old)
 		return old;
@@ -50,6 +77,7 @@
 	
 	if (!files) {
 		files = mallocz(sizeof(VFile), 1);
+		files->isdir = 1;
 	} else {
 		old = files;
 		files = mallocz(sizeof(VFile), 1);
@@ -59,6 +87,10 @@
 	files->parts = parsepath(path);
 	if (!files->parts)
 		return nil;
+	
+	if (!verifyfiles(files->parts))
+		return nil;
+	
 	return files;
 }
 
--- a/fshandler.inc
+++ b/fshandler.inc
@@ -28,9 +28,15 @@
 			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;
@@ -39,8 +45,69 @@
 	respond(r, "file not found");
 }
 
+static int
+childrencontains(int *fh, int search)
+{
+	int *i;
+	for (i = fh; *i; i++) {
+		if (*i == search)
+			return 1;
+	}
+	return 0;
+}
+
+static int
+findparent(int qid)
+{
+	for (int i = Qroot; i < Qmax; i++) {
+		if (childrencontains(filehierarchy[i], qid))
+			return i;
+	}
+	return Qroot;
+}
+
 static char*
 fswalk(Fid *fid, char *name, Qid *qid)
 {
+	int qt;
+	uvlong id;
+	Filedata *fd;
+	
+	if (strcmp(name, ".") == 0) {
+		*qid = fid->qid;
+		return nil;
+	}
+	
+	qt = breakqid(fid->qid.path);
+	id = getqidid(fid->qid.path);
+	
+	if (strcmp(name, "..") == 0) {
+		qt = findparent(qt);
+		fd = &filedata[qt];
+		qidtype = qt;
+		qid->path = makeqid(id);
+		qid->vers = 0;
+		qid->type = fd->dir.mode&DMDIR ? QTDIR : QTFILE;
+		fid->qid = *qid;
+		fprint(2, "walk: QID: %d %d\n", qt, qid->type);
+		return nil;
+	}
+	
 	return nil;
+}
+
+static void
+fsattach(Req *r)
+{
+	Qid q;
+	
+	qidtype = Qroot;
+	q.path = makeqid(0);
+	q.vers = 0;
+	q.type = QTDIR;
+	
+	fprint(2, "qtype: %d\n", q.type);
+	
+	r->ofcall.qid = r->fid->qid = q;
+	respond(r, nil);
 }
--- a/preamble.inc
+++ b/preamble.inc
@@ -4,10 +4,7 @@
 #include <fcall.h>
 #include <9p.h>
 
-typedef struct Fchildren Fchildren;
-struct Fchildren {
-	int *children;
-};
+int **filehierarchy = nil;
 
 typedef struct Filedata Filedata;
 struct Filedata {
--