diff options
author | rsc <devnull@localhost> | 2005-07-12 15:23:36 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-07-12 15:23:36 +0000 |
commit | a0d146edd7a7de6236a0d60baafeeb59f8452aae (patch) | |
tree | b55baa526d9f5adfc73246e6ee2fadf455e0b7a2 /src/cmd/venti/srv/zblock.c | |
parent | 88bb285e3d87ec2508840af33f7e0af53ec3c13c (diff) | |
download | plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.gz plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.bz2 plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.zip |
return of venti
Diffstat (limited to 'src/cmd/venti/srv/zblock.c')
-rw-r--r-- | src/cmd/venti/srv/zblock.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/cmd/venti/srv/zblock.c b/src/cmd/venti/srv/zblock.c new file mode 100644 index 00000000..b33cdd25 --- /dev/null +++ b/src/cmd/venti/srv/zblock.c @@ -0,0 +1,93 @@ +#include "stdinc.h" +#include "dat.h" +#include "fns.h" + +void +fmtzbinit(Fmt *f, ZBlock *b) +{ + f->runes = 0; + f->start = b->data; + f->to = f->start; + f->stop = (char*)f->start + b->len; + f->flush = nil; + f->farg = nil; + f->nfmt = 0; +} + +#define ROUNDUP(p, n) ((void*)(((ulong)(p)+(n)-1)&~(ulong)((n)-1))) + +static char zmagic[] = "1234567890abcdefghijkl"; + +ZBlock * +alloczblock(u32int size, int zeroed, uint blocksize) +{ + uchar *p, *data; + ZBlock *b; + static ZBlock z; + int n; + + if(blocksize == 0) + blocksize = 32; /* try for cache line alignment */ + + n = size+32/*XXX*/+sizeof(ZBlock)+blocksize+8; + p = malloc(n); + if(p == nil){ + seterr(EOk, "out of memory"); + return nil; + } + + data = ROUNDUP(p, blocksize); + b = ROUNDUP(data+size+32/*XXX*/, 8); + if(0) fprint(2, "alloc %p-%p data %p-%p b %p-%p\n", + p, p+n, data, data+size, b, b+1); + *b = z; + b->data = data; + b->free = p; + b->len = size; + b->_size = size; + if(zeroed) + memset(b->data, 0, size); + memmove(b->data+size, zmagic, 32/*XXX*/); + return b; +} + +void +freezblock(ZBlock *b) +{ + if(b){ + if(memcmp(b->data+b->_size, zmagic, 32) != 0) + abort(); + memset(b->data+b->_size, 0, 32); + free(b->free); + } +} + +ZBlock* +packet2zblock(Packet *p, u32int size) +{ + ZBlock *b; + + if(p == nil) + return nil; + b = alloczblock(size, 0, 0); + if(b == nil) + return nil; + if(packetcopy(p, b->data, 0, size) < 0){ + freezblock(b); + return nil; + } + return b; +} + +Packet* +zblock2packet(ZBlock *zb, u32int size) +{ + Packet *p; + + if(zb == nil) + return nil; + p = packetalloc(); + packetappend(p, zb->data, size); + return p; +} + |