12 fprint(2, "mntgen [-s srvname] [mtpt]\n");
18 typedef struct Tab Tab;
37 if(tab[i].qid == path)
45 vlong digest[MD5dlen / sizeof(vlong) + 1];
46 md5((uchar *)name, strlen(name), (uchar *)digest, nil);
47 return digest[0] & ((1ULL<<48)-1);
53 if(r->ifcall.mode != OREAD)
54 respond(r, "permission denied");
60 dirgen(int i, Dir *d, void*)
64 memset(d, 0, sizeof *d);
66 d->uid = estrdup9p("sys");
67 d->gid = estrdup9p("sys");
71 d->name = estrdup9p("/");
72 d->atime = d->mtime = time0;
74 d->qid.path = tab[i].qid;
75 d->name = estrdup9p(tab[i].name);
76 d->atime = d->mtime = tab[i].time;
84 if(r->fid->qid.path == 0)
85 dirread9p(r, dirgen, nil);
97 qid = r->fid->qid.path;
99 dirgen(-1, &r->d, nil);
101 if((t = findtab(qid)) == nil){
102 respond(r, "path not found (???)");
105 dirgen(t-tab, &r->d, nil);
111 fswalk1(Fid *fid, char *name, void*)
117 if(fid->qid.path != 0){
118 /* nothing in child directory */
119 if(strcmp(name, "..") == 0){
120 if((t = findtab(fid->qid.path)) != nil)
125 return "path not found";
128 if(strcmp(name, "..") == 0)
130 for(i=0; i<ntab; i++)
131 if(strcmp(tab[i].name, name) == 0){
133 fid->qid.path = tab[i].qid;
137 if(findtab(h) != nil)
138 return "hash collision";
146 tab = erealloc9p(tab, sizeof(tab[0])*mtab);
149 fid->qid.path = tab[ntab].qid;
150 tab[ntab].name = estrdup9p(name);
151 tab[ntab].time = time(0);
159 fsclone(Fid *fid, Fid*, void*)
163 if((t = findtab(fid->qid.path)) != nil)
171 walkandclone(r, fswalk1, fsclone, nil);
183 if((t = findtab(qid)) == nil){
184 fprint(2, "warning: cannot find %llux\n", qid);
189 tab[t-tab] = tab[--ntab];
191 fprint(2, "warning: negative ref count for %s\n", t->name);
199 spec = r->ifcall.aname;
201 respond(r, "invalid attach specifier");
205 r->ofcall.qid = (Qid){0, 0, QTDIR};
206 r->fid->qid = r->ofcall.qid;
221 main(int argc, char **argv)
232 service = EARGF(usage());
240 postmountsrv(&fs, service, argc ? argv[0] : "/n", MAFTER);