long dirreadall(int fd, Dir **d) { uchar *buf, *nbuf; long n, ts; struct stat st; if(fstat(fd, &st) < 0) return -1; if(st.st_blksize < 8192) st.st_blksize = 8192; buf = nil; ts = 0; for(;;){ nbuf = realloc(buf, ts+st.st_blksize); if(nbuf == nil){ free(buf); return -1; } buf = nbuf; n = mygetdents(fd, (void*)(buf+ts), st.st_blksize); if(n <= 0) break; ts += n; } if(ts >= 0) ts = dirpackage(fd, (char*)buf, ts, d); free(buf); if(ts == 0 && n < 0) return -1; return ts; }
long dirreadall(int fd, Dir **d) { uchar *buf, *nbuf; long n, ts; buf = nil; ts = 0; for(;;){ nbuf = realloc(buf, ts+DIRMAX); if(nbuf == nil){ free(buf); return -1; } buf = nbuf; n = read(fd, buf+ts, DIRMAX); if(n <= 0) break; ts += n; } if(ts >= 0) ts = dirpackage(buf, ts, d); free(buf); if(ts == 0 && n < 0) return -1; return ts; }
long dirread(int fd, Dir **dp) { char *buf; struct stat st; int n; *dp = 0; if(fstat(fd, &st) < 0) return -1; if(st.st_blksize < 8192) st.st_blksize = 8192; buf = malloc(st.st_blksize); if(buf == nil) return -1; n = mygetdents(fd, (void*)buf, st.st_blksize); if(n < 0){ free(buf); return -1; } n = dirpackage(fd, buf, n, dp); free(buf); return n; }
__private_extern__ int readdirs_9p(mount_9p *nmp, fid_9p fid, dir_9p **d, uint32_t *nd) { uint8_t *p, *newp; uint32_t n; int e, ts; TRACE(); *d = NULL; *nd = 0; ts = 0; p = NULL; for (;;) { newp = malloc_9p(ts+DIRMAX); if (newp == NULL) { e = ENOMEM; break; } bcopy(p, newp, ts); free_9p(p); p = newp; if ((e=read_9p(nmp, fid, p+ts, DIRMAX, ts, &n)) || n==0) break; ts += n; } if (!e) e = dirpackage(p, ts, d, nd, ISSET(nmp->flags, F_DOTU)); free_9p(p); return e; }
long dirread(int fd, Dir **d) { uchar *buf; long ts; buf = malloc(DIRMAX); if(buf == nil) return -1; ts = read(fd, buf, DIRMAX); if(ts >= 0) ts = dirpackage(buf, ts, d); free(buf); return ts; }
__private_extern__ int readdir_9p(mount_9p *nmp, fid_9p fid, off_t off, dir_9p **d, uint32_t *nd, uint32_t *nrd) { void *p; int e; TRACE(); *d = NULL; *nd = 0; *nrd = 0; p = malloc_9p(DIRMAX); if (p == NULL) return ENOMEM; e = read_9p(nmp, fid, p, DIRMAX, off, nrd); if (!e) e = dirpackage(p, *nrd, d, nd, ISSET(nmp->flags, F_DOTU)); free_9p(p); return e; }
void dump(char *path) { char *elem, *p, *path0, *err; uchar buf[4096]; Fid fid; Qid qid; Dir *d; Req r; int off, i, n; // root memset(&fid, 0, sizeof fid); dostat(0, &fid.qid, nil); qid = fid.qid; path0 = path; while(path != nil) { p = strchr(path, '/'); if(p != nil) *p = '\0'; elem = path; if(strcmp(elem, "") != 0 && strcmp(elem, ".") != 0) { err = xwalk1(&fid, elem, &qid); if(err != nil) { fprint(2, "%s: %s\n", path0, err); exits(err); } } if(p) *p++ = '/'; path = p; } memset(&r, 0, sizeof r); xsrv.fake = 1; // read and display off = 0; for(;;) { r.srv = &xsrv; r.fid = &fid; r.ifcall.type = Tread; r.ifcall.count = sizeof buf; r.ifcall.offset = off; r.ofcall.data = (char*)buf; r.ofcall.count = 0; xread(&r); if(r.ofcall.type != Rread) { fprint(2, "reading %s: %s\n", path0, r.ofcall.ename); exits(r.ofcall.ename); } n = r.ofcall.count; if(n == 0) break; if(off == 0 && pflag > 1) { print("\001"); } off += n; if(qid.type & QTDIR) { n = dirpackage(buf, n, &d); for(i=0; i<n; i++) print("%s%s\n", d[i].name, (d[i].mode&DMDIR) ? "/" : ""); free(d); } else write(1, buf, n); } }