allow plan9-style branded disks as configs
This commit is contained in:
parent
c482feff4b
commit
91872ab97b
2 changed files with 77 additions and 3 deletions
|
|
@ -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;
|
||||
|
|
|
|||
29
src/cmd/venti/srv/readifile.c
Normal file
29
src/cmd/venti/srv/readifile.c
Normal 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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue