ref: da0a87c6b0b0294175e5f084118c8d587c65a8f4
dir: /main.c/
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>
enum {
Qroot,
Qitem1,
Qitem2,
};
typedef struct F {
char *name;
Qid qid;
ulong mode;
} F;
F root = {
"/", {Qroot, 0, QTDIR}, 0555|DMDIR
};
F roottab[] = {
"item1", {Qitem1, 0, QTFILE}, 0444,
"item2", {Qitem2, 0, QTFILE}, 0444,
};
enum {Cmdrange};
Cmdtab cmd[] = {
Cmdrange, "range", 3,
};
F*
filebypath(uvlong path)
{
int i;
if(path == Qroot)
return &root;
for(i = 0; i < nelem(roottab); i++)
if(path == roottab[i].qid.path)
return &roottab[i];
return nil;
}
void
fillstat(Dir *d, uvlong path, char *user)
{
F *f;
f = filebypath(path);
d->name = estrdup9p(f->name);
d->qid = f->qid;
d->mode = f->mode;
d->uid = estrdup9p(user);
d->gid = estrdup9p(user);
d->muid = estrdup9p(user);
d->length = 0;
d->atime = time(0);
d->mtime = time(0);
}
void
nattach(Req *r)
{
r->fid->qid = filebypath(Qroot)->qid;
r->ofcall.qid = r->fid->qid;
respond(r, nil);
}
char*
nwalk1(Fid *fid, char *name, Qid *qid)
{
int i;
switch(fid->qid.path){
case Qroot:
for(i = 0; i < nelem(roottab); i++){
if(strcmp(roottab[i].name, name) == 0){
*qid = roottab[i].qid;
fid->qid = *qid;
return nil;
}
}
if(strcmp("..", name) == 0){
*qid = root.qid;
fid->qid = *qid;
return nil;
}
break;
}
return "not found";
}
void
nread(Req *r)
{
}
void
nwrite(Req *r)
{
}
void
nopen(Req *r)
{
}
void
nstat(Req *r)
{
fillstat(&r->d, r->fid->qid.path, r->fid->uid);
respond(r, nil);
return;
}
void
ndestroyfid(Fid *fid)
{
if(fid->aux != nil)
free(fid->aux);
}
Srv fs = {
.attach = nattach,
.walk1 = nwalk1,
.open = nopen,
.stat = nstat,
.read = nread,
.write = nwrite,
.destroyfid = ndestroyfid,
};
void
threadmain(int argc, char **argv)
{
print("This is a demo of namespace in plan9/9p /n");
print("This is not meant for real world use and is just a simple demo /n");
char *mtpt, *srvn;
mtpt = "/mnt/namespace-test";
srvn = nil;
postmountsrv(&fs, srvn, mtpt, MREPL);
}