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 {--
⑨