ref: e81025205d1ac4e517e2a4e21dfa9326c937a57b
dir: /fshandler.inc/
static void
fsread(Req *r)
{
respond(r, nil);
}
static void
fswrite(Req *r)
{
respond(r, nil);
}
static void
fsstat(Req *r)
{
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;
}
}
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);
}