static char* fswalk1(Fid *fid, char *name, void*) { int i; Tab *t; vlong h; if(fid->qid.path != 0){ /* nothing in child directory */ if(strcmp(name, "..") == 0){ if((t = findtab(fid->qid.path)) != nil) t->ref--; fid->qid.path = 0; return nil; } return "path not found"; } /* root */ if(strcmp(name, "..") == 0) return nil; for(i=0; i<ntab; i++) if(strcmp(tab[i].name, name) == 0){ tab[i].ref++; fid->qid.path = tab[i].qid; return nil; } h = hash(name); if(findtab(h) != nil) return "hash collision"; /* create it */ if(ntab == mtab){ if(mtab == 0) mtab = 16; else mtab *= 2; tab = erealloc9p(tab, sizeof(tab[0])*mtab); } tab[ntab].qid = h; fid->qid.path = tab[ntab].qid; tab[ntab].name = estrdup9p(name); tab[ntab].time = time(0); tab[ntab].ref = 1; ntab++; return nil; }
static int rflush(Req *r, char *error) { Req *or; assert(error == nil); or = r->oldreq; if(or){ qlock(&or->lk); if(or->responded == 0){ or->flush = erealloc9p(or->flush, (or->nflush+1)*sizeof(or->flush[0])); or->flush[or->nflush++] = r; qunlock(&or->lk); return -1; /* delay response until or is responded */ } qunlock(&or->lk); closereq(or); } r->oldreq = nil; return 0; }
static void fsread(Req* r) { Query* q; char** toks; int ntoks; int atoks; char* s; int pos; File* f; if(r->fid->qid.type&QTDIR){ respond(r, "bug: write on dir"); return; } f = r->fid->file; if(f == ctlf){ ctlread(r); return; } q = f->aux; /* The first read process the query. * Further reads just retrieve more data, * if any. */ if(q->expr == nil){ atoks = 512; toks = emalloc9p(atoks*sizeof(char*)); do { s = estrdup9p(q->text); ntoks = tokenize(s, toks, atoks); if(ntoks == atoks){ atoks += 512; toks = erealloc9p(toks, atoks*sizeof(char*)); free(s); } }while(ntoks == atoks); pos = 0; if(chatty9p) fprint(2, "compiling %s (%d toks)\n", q->text, ntoks); q->expr = parseexpr(ntoks, toks, &pos); if(q->expr == nil){ free(s); free(toks); respond(r, "syntax error"); return; } if(chatty9p) fprint(2, "evaluating %s (%d toks)\n", q->text, ntoks); evalexpr(trie, q->expr); free(s); free(toks); free(q->text); /* smprintexprval limits the total output to * at most 64K of text */ q->text = smprintexprval(q->expr); if(chatty9p) fprint(2, "result is [%s]\n", q->text); } /* After the query is process, * q->text holds the reply. */ readstr(r, q->text); respond(r, nil); }