Commit Diff


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