summaryrefslogtreecommitdiff
path: root/sys/src/cmd/hjfs/conv.c
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2012-08-07 17:57:04 +0200
committeraiju <aiju@phicode.de>2012-08-07 17:57:04 +0200
commitb21b9ba89cf66a8fac6f94efb79cfb425a2c4df2 (patch)
tree42047f997cda3eddec9faeafeb74435cc72a4786 /sys/src/cmd/hjfs/conv.c
parentef1c1863051d0530a31b291f4e334ee7601c318c (diff)
added hjfs
Diffstat (limited to 'sys/src/cmd/hjfs/conv.c')
-rw-r--r--sys/src/cmd/hjfs/conv.c137
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);
+}
+