diff options
author | aiju <aiju@phicode.de> | 2012-08-08 10:14:20 +0200 |
---|---|---|
committer | aiju <aiju@phicode.de> | 2012-08-08 10:14:20 +0200 |
commit | 9e608833e922c318b431aead7874a8f8f1539ae7 (patch) | |
tree | 25f41f5a4ac655eb2b0e2214d4bd0a450d762505 /sys/src/cmd/hjfs/fs2.c | |
parent | f2c70fe2f708446794af299b1130b7aaf8dc73e5 (diff) |
hjfs: various fixes
Diffstat (limited to 'sys/src/cmd/hjfs/fs2.c')
-rw-r--r-- | sys/src/cmd/hjfs/fs2.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/sys/src/cmd/hjfs/fs2.c b/sys/src/cmd/hjfs/fs2.c index 173cc7da7..ee1bc4e01 100644 --- a/sys/src/cmd/hjfs/fs2.c +++ b/sys/src/cmd/hjfs/fs2.c @@ -429,7 +429,7 @@ error: } static void -statbuf(Fs *fs, Dentry *d, Dir *di) +statbuf(Fs *fs, Dentry *d, Dir *di, char *buf) { di->qid = d->Qid; di->mode = (d->mode & 0777) | (d->Qid.type << 24); @@ -438,10 +438,19 @@ statbuf(Fs *fs, Dentry *d, Dir *di) di->length = d->size; if(d->type & QTDIR) di->length = 0; - di->name = strdup(d->name); - di->uid = uid2name(fs, d->uid); - di->gid = uid2name(fs, d->gid); - di->muid = uid2name(fs, d->muid); + if(buf == nil){ + di->name = strdup(d->name); + di->uid = uid2name(fs, d->uid, nil); + di->gid = uid2name(fs, d->gid, nil); + di->muid = uid2name(fs, d->muid, nil); + }else{ + memset(buf, 0, NAMELEN + 3 * USERLEN); + strncpy(buf, d->name, NAMELEN - 1); + di->name = buf; + di->uid = uid2name(fs, d->uid, buf + NAMELEN); + di->gid = uid2name(fs, d->gid, buf + NAMELEN + USERLEN); + di->muid = uid2name(fs, d->muid, buf + NAMELEN + 2 * USERLEN); + } } int @@ -455,7 +464,7 @@ chanstat(Chan *ch, Dir *di) chend(ch); return -1; } - statbuf(ch->fs, &b->de[ch->loc->deind], di); + statbuf(ch->fs, &b->de[ch->loc->deind], di, nil); putbuf(b); chend(ch); return 0; @@ -471,6 +480,7 @@ chandirread(Chan *ch, void *buf, ulong n, uvlong off) int rc; ulong wr; Dir di; + char cbuf[NAMELEN + 3 * USERLEN]; if(off == 0){ ch->dwloff = 0; @@ -515,12 +525,8 @@ chandirread(Chan *ch, void *buf, ulong n, uvlong off) goto next; if((ch->flags & CHFDUMP) != 0 && (c->de[j].type & QTTMP) != 0) goto next; - statbuf(ch->fs, &c->de[j], &di); + statbuf(ch->fs, &c->de[j], &di, cbuf); rc = convD2M(&di, (uchar *) buf + wr, n - wr); - free(di.uid); - free(di.gid); - free(di.muid); - free(di.name); if(rc <= BIT16SZ) break; wr += rc; |