#include #include #include #include #include #include #include #include #include #include #define NODEFINE #include #include #include #include "fd.h" long pm_pread(int fd, void *a, long n, vlong offset) { off_t off; File *f; if(offset == -1) return pm_read(fd, a, n); if(offset < 0){ pm_werrstr("negative pread offset"); return -1; } off = offset; if((vlong)off != offset){ pm_werrstr("pread offset does not fit in off_t"); return -1; } if((f = pm_lockfile(fd, 0)) == nil) return -1; switch(f->type){ default: pm_werrstr("unknown file type in pm_pread"); n = -1; break; case Tdir: pm_werrstr("no pread in directory"); n = -1; break; case Tfile: n = pread(f->ufd, a, n, off); if(n < 0){ pm_oserror(); n = -1; } break; } pm_qunlock(&f->lk); return n; }