commit 91872ab97b7c9cabacef61f37b90a1af29f257af from: rsc date: Thu May 03 03:14:30 2007 UTC allow plan9-style branded disks as configs commit - c482feff4bc6002f0c1373a8d41e04f86dda5a21 commit + 91872ab97b7c9cabacef61f37b90a1af29f257af blob - fc784c9bb4c8ecfc9e08ec8f79658c97e293596e blob + e5d5460aea59905ea4c6c36a83d86beb225a31e0 --- src/cmd/venti/srv/ifile.c +++ src/cmd/venti/srv/ifile.c @@ -5,11 +5,56 @@ int readifile(IFile *f, char *name) { + int m; + Part *p; ZBlock *b; - - b = readfile(name); - if(b == nil) + u8int *z; + + p = initpart(name, OREAD); + if(p == nil) return -1; + b = alloczblock(8192, 1, 0); + if(b == nil){ + seterr(EOk, "can't alloc for %s: %R", name); + return -1; + } + if(p->size > PartBlank){ + /* + * this is likely a real venti partition, in which case + * we're looking for the config file stored as 8k at end of PartBlank. + */ + if(readpart(p, PartBlank-8192, b->data, 8192) < 0){ + seterr(EOk, "can't read %s: %r", name); + freezblock(b); + freepart(p); + return -1; + } + m = 5+1+6+1; + if(memcmp(b->data, "venti config\n", m) != 0){ + seterr(EOk, "bad venti config magic in %s", name); + freezblock(b); + freepart(p); + return -1; + } + b->data += m; + b->len -= m; + z = memchr(b->data, 0, b->len); + if(z) + b->len = z - b->data; + }else if(p->size > 8192){ + seterr(EOk, "config file is too large"); + freepart(p); + freezblock(b); + return -1; + }else{ + freezblock(b); + b = readfile(name); + if(b == nil){ + freepart(p); + return -1; + } + } + freepart(p); f->name = name; f->b = b; f->pos = 0; blob - /dev/null blob + a822a9878c46c7ec96cbe59081dd8ef17a824ffb (mode 644) --- /dev/null +++ src/cmd/venti/srv/readifile.c @@ -0,0 +1,29 @@ +#include "stdinc.h" +#include "dat.h" +#include "fns.h" + +void +usage(void) +{ + fprint(2, "usage: readifile file\n"); + threadexitsall("usage"); +} + +void +threadmain(int argc, char *argv[]) +{ + IFile ifile; + + ARGBEGIN{ + default: + usage(); + }ARGEND + + if(argc != 1) + usage(); + + if(readifile(&ifile, argv[0]) < 0) + sysfatal("readifile %s: %r", argv[0]); + write(1, ifile.b->data, ifile.b->len); + threadexitsall(nil); +}