diff options
Diffstat (limited to 'src/libfs/dirread.c')
-rw-r--r-- | src/libfs/dirread.c | 100 |
1 files changed, 0 insertions, 100 deletions
diff --git a/src/libfs/dirread.c b/src/libfs/dirread.c deleted file mode 100644 index 0ca40645..00000000 --- a/src/libfs/dirread.c +++ /dev/null @@ -1,100 +0,0 @@ -/* Mostly copied from Plan 9's libc. */ - -#include <u.h> -#include <libc.h> -#include <fcall.h> -#include <fs.h> - -static -long -dirpackage(uchar *buf, long ts, Dir **d) -{ - char *s; - long ss, i, n, nn, m; - - *d = nil; - if(ts <= 0) - return 0; - - /* - * first find number of all stats, check they look like stats, & size all associated strings - */ - ss = 0; - n = 0; - for(i = 0; i < ts; i += m){ - m = BIT16SZ + GBIT16(&buf[i]); - if(statcheck(&buf[i], m) < 0) - break; - ss += m; - n++; - } - - if(i != ts) - return -1; - - *d = malloc(n * sizeof(Dir) + ss); - if(*d == nil) - return -1; - - /* - * then convert all buffers - */ - s = (char*)*d + n * sizeof(Dir); - nn = 0; - for(i = 0; i < ts; i += m){ - m = BIT16SZ + GBIT16((uchar*)&buf[i]); - if(nn >= n || convM2D(&buf[i], m, *d + nn, s) != m){ - free(*d); - *d = nil; - return -1; - } - nn++; - s += m; - } - - return nn; -} - -long -fsdirread(Fid *fid, Dir **d) -{ - uchar *buf; - long ts; - - buf = malloc(DIRMAX); - if(buf == nil) - return -1; - ts = fsread(fid, buf, DIRMAX); - if(ts >= 0) - ts = dirpackage(buf, ts, d); - free(buf); - return ts; -} - -long -fsdirreadall(Fid *fid, 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 = fsread(fid, 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; -} |