allow plan9-style branded disks as configs

This commit is contained in:
rsc 2007-05-03 03:14:30 +00:00
parent c482feff4b
commit 91872ab97b
2 changed files with 77 additions and 3 deletions

View file

@ -5,11 +5,56 @@
int
readifile(IFile *f, char *name)
{
int m;
Part *p;
ZBlock *b;
u8int *z;
b = readfile(name);
if(b == nil)
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;

View file

@ -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);
}