static long fsread(Chan *c, void *va, long n, vlong offset) { int r; UnixFd *ufd; if(c->qid.type & QTDIR) return fsdirread(c, va, n, offset); ufd = c->aux; if(ufd->issocket) r = read(ufd->fd, va, n); else r = pread(ufd->fd, va, n, offset); if(r < 0) oserror(); return r; }
void loadmboxfaces(char *maildir) { CFid *dirfd; Dir *d; int i, n; dirfd = fsopen(mailfs, maildir, OREAD); if(dirfd != nil){ while((n = fsdirread(dirfd, &d)) > 0){ for(i=0; i<n; i++) addface(dirface(maildir, d[i].name)); free(d); } fsclose(dirfd); }else sysfatal("open %s: %r", maildir); }
long fsread(Chan *c, void *va, long n, vlong offset) { int r; if(c->qid.type & QTDIR){ /* need to maintain offset only for directories */ qlock(FS(c)); if(waserror()){ qunlock(FS(c)); nexterror(); } r = fsdirread(c, va, n, offset); poperror(); qunlock(FS(c)); }else{ osenter(); r = pread(FS(c)->fd, va, n, offset); osleave(); } if(r < 0) fserr(FS(c)); return r; }
static long fsread(Chan *c, void *va, long n, vlong offset) { HANDLE fh; DWORD r; Ufsinfo *uif; if(c->qid.type & QTDIR) return fsdirread(c, va, n, offset); uif = c->aux; qlock(&uif->oq); if(waserror()) { qunlock(&uif->oq); nexterror(); } fh = uif->fh; if(uif->offset != offset) { LONG high; high = offset>>32; offset = SetFilePointer(fh, (LONG)(offset & 0xFFFFFFFF), &high, FILE_BEGIN); offset |= (vlong)high<<32; uif->offset = offset; }