14 if((fsmain->flags & FSNOAUTH) != 0)
15 respond(req, "no authentication required");
27 if((fsmain->flags & FSNOAUTH) == 0 && authattach(req) < 0)
29 if(name2uid(fsmain, req->ifcall.uname, &uid) <= 0){
30 respond(req, "no such user");
33 if(req->ifcall.aname == nil || *req->ifcall.aname == 0)
35 else if(strcmp(req->ifcall.aname, "dump") == 0)
36 flags = CHFDUMP|CHFRO;
41 ch = chanattach(fsmain, flags);
44 req->fid->qid = ch->loc->Qid;
45 req->ofcall.qid = ch->loc->Qid;
54 if((req->fid->qid.type & QTAUTH) != 0){
55 switch(req->ifcall.type){
69 respond(req, "operation on closed fid");
77 ((Req *) ch->lreq)->aux = req;
79 if(ch->qnext == nil && (ch->wflags & CHWBUSY) == 0){
81 ch->qprev = ch->qnext->qprev;
82 ch->qnext->qprev = ch;
83 ch->qprev->qnext = ch;
86 if(req->ifcall.type == Tremove)
96 if((fid->qid.type & QTAUTH) != 0){
104 ch->wflags |= CHWCLUNK;
105 if(ch->qnext == nil && (ch->wflags & CHWBUSY) == 0){
106 ch->qnext = &readych;
107 ch->qprev = ch->qnext->qprev;
108 ch->qnext->qprev = ch;
109 ch->qprev->qnext = ch;
133 .destroyfid = tdestroyfid,
138 start9p(char *service, int stdio)
145 threadpostmountsrv(&mysrv, service, nil, 0);
149 twalk(Chan *ch, Fid *fid, Fid *nfid, int n, char **name, Qid *qid)
155 werrstr("trying to clone an open fid");
162 nfid->qid = ch->loc->Qid;
164 for(i = 0; i < n; i++){
165 if(chanwalk(ch, name[i]) <= 0)
166 return i > 0 ? i : -1;
167 qid[i] = ch->loc->Qid;
168 nfid->qid = ch->loc->Qid;
183 while(readych.qnext == &readych)
186 ch->qnext->qprev = ch->qprev;
187 ch->qprev->qnext = ch->qnext;
190 assert((ch->wflags & CHWBUSY) == 0);
191 ch->wflags |= CHWBUSY;
192 while(ch != nil && ch->freq != nil){
199 assert(req->responded == 0);
202 switch(req->ifcall.type){
204 rc = twalk(ch, req->fid, req->newfid, i->nwname, i->wname, o->wqid);
209 rc = chanopen(ch, i->mode);
212 rc = chancreat(ch, i->name, i->perm, i->mode);
214 o->qid = ch->loc->Qid;
215 req->fid->qid = o->qid;
219 rc = o->count = chanread(ch, o->data, i->count, i->offset);
222 rc = o->count = chanwrite(ch, i->data, i->count, i->offset);
226 req->fid->aux = ch = nil;
229 rc = chanstat(ch, &req->d);
232 rc = chanwstat(ch, &req->d);
245 ch->wflags &= ~CHWBUSY;
246 if((ch->wflags & CHWCLUNK) != 0)
261 readych.qnext = readych.qprev = &readych;
263 for(i = 0; i < NWORKERS; i++)
264 threadcreate(workerproc, nil, mainstacksize);