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");}
--
⑨