diff options
author | aiju <aiju@phicode.de> | 2012-08-07 17:57:04 +0200 |
---|---|---|
committer | aiju <aiju@phicode.de> | 2012-08-07 17:57:04 +0200 |
commit | b21b9ba89cf66a8fac6f94efb79cfb425a2c4df2 (patch) | |
tree | 42047f997cda3eddec9faeafeb74435cc72a4786 /sys/src/cmd/hjfs/conv.c | |
parent | ef1c1863051d0530a31b291f4e334ee7601c318c (diff) |
added hjfs
Diffstat (limited to 'sys/src/cmd/hjfs/conv.c')
-rw-r--r-- | sys/src/cmd/hjfs/conv.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/sys/src/cmd/hjfs/conv.c b/sys/src/cmd/hjfs/conv.c new file mode 100644 index 000000000..21333e222 --- /dev/null +++ b/sys/src/cmd/hjfs/conv.c @@ -0,0 +1,137 @@ +#include <u.h> +#include <libc.h> +#include <thread.h> +#include "dat.h" +#include "fns.h" + +#define GET8(x) {x = *p++;} +#define GET16(x) {x = *p++; x |= *p++ << 8;} +#define GET24(x) {x = *p++; x |= *p++ << 8; x |= *p++ << 16;} +#define GET32(x) {x = *p++; x |= *p++ << 8; x |= *p++ << 16; x |= *p++ << 24;} +#define GET64(x) \ + {x = (uvlong) *p++; \ + x |= (uvlong) *p++ << 8; \ + x |= (uvlong) *p++ << 16; \ + x |= (uvlong) *p++ << 24; \ + x |= (uvlong) *p++ << 32; \ + x |= (uvlong) *p++ << 40; \ + x |= (uvlong) *p++ << 48; \ + x |= (uvlong) *p++ << 56;} +#define GETS(x, n) {memcpy(x, p, n); p += n;} + +#define PUT8(x) {*p++ = x;} +#define PUT16(x) {*p++ = x; *p++ = x >> 8;} +#define PUT24(x) {*p++ = x; *p++ = x >> 8; *p++ = x >> 16;} +#define PUT32(x) {*p++ = x; *p++ = x >> 8; *p++ = x >> 16; *p++ = x >> 24;} +#define PUT64(x) \ + {*p++ = x; \ + *p++ = x >> 8; \ + *p++ = x >> 16; \ + *p++ = x >> 24; \ + *p++ = x >> 32; \ + *p++ = x >> 40; \ + *p++ = x >> 48; \ + *p++ = x >> 56;} +#define PUTS(x, n) {memcpy(p, x, n); p += n;} + +void +unpack(Buf *b, uchar *p) +{ + Dentry *d; + int i; + + switch(b->type = *p++){ + default: + memcpy(b->data, p, RBLOCK); + break; + case TSUPERBLOCK: + GET32(b->sb.magic); + GET64(b->sb.size); + GET64(b->sb.fstart); + GET64(b->sb.fend); + GET64(b->sb.root); + GET64(b->sb.qidpath); + break; + case TDENTRY: + for(d = b->de; d < b->de + nelem(b->de); d++){ + GETS(d->name, NAMELEN); + GET16(d->uid); + GET16(d->muid); + GET16(d->gid); + GET16(d->mode); + GET64(d->path); + GET32(d->vers); + GET8(d->type); + GET64(d->size); + for(i = 0; i < NDIRECT; i++) + GET64(d->db[i]); + for(i = 0; i < NINDIRECT; i++) + GET64(d->ib[i]); + GET64(d->atime); + GET64(d->mtime); + } + break; + case TINDIR: + for(i = 0; i < OFFPERBLK; i++) + GET64(b->offs[i]); + break; + case TREF: + for(i = 0; i < REFPERBLK; i++) + GET24(b->refs[i]); + break; + } + USED(p); +} + +void +pack(Buf *b, uchar *p) +{ + Dentry *d; + int i; + + switch(*p++ = b->type){ + case TRAW: + memcpy(p, b->data, RBLOCK); + break; + + case TSUPERBLOCK: + PUT32(b->sb.magic); + PUT64(b->sb.size); + PUT64(b->sb.fstart); + PUT64(b->sb.fend); + PUT64(b->sb.root); + PUT64(b->sb.qidpath); + break; + case TDENTRY: + for(d = b->de; d < b->de + nelem(b->de); d++){ + PUTS(d->name, NAMELEN); + PUT16(d->uid); + PUT16(d->muid); + PUT16(d->gid); + PUT16(d->mode); + PUT64(d->path); + PUT32(d->vers); + PUT8(d->type); + PUT64(d->size); + for(i = 0; i < NDIRECT; i++) + PUT64(d->db[i]); + for(i = 0; i < NINDIRECT; i++) + PUT64(d->ib[i]); + PUT64(d->atime); + PUT64(d->mtime); + } + break; + case TINDIR: + for(i = 0; i < OFFPERBLK; i++) + PUT64(b->offs[i]); + break; + case TREF: + for(i = 0; i < REFPERBLK; i++) + PUT24(b->refs[i]); + break; + default: + abort(); + } + USED(p); +} + |