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
|
int
|
||||||
readifile(IFile *f, char *name)
|
readifile(IFile *f, char *name)
|
||||||
{
|
{
|
||||||
|
int m;
|
||||||
|
Part *p;
|
||||||
ZBlock *b;
|
ZBlock *b;
|
||||||
|
u8int *z;
|
||||||
|
|
||||||
b = readfile(name);
|
p = initpart(name, OREAD);
|
||||||
if(b == nil)
|
if(p == nil)
|
||||||
return -1;
|
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->name = name;
|
||||||
f->b = b;
|
f->b = b;
|
||||||
f->pos = 0;
|
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