Commit Diff


commit - 4b5766580559d101dd1c29cc575b3ffa9f51c2d7
commit + b32de4ae73509092107b116fefbc4003fefc35c3
blob - c4c9579934fcf66ddd0a783a379885cbdfb83b05
blob + 01033596ea73b32345c567705db2a8b96ff077b4
--- src/cmd/fossil/9p.c
+++ src/cmd/fossil/9p.c
@@ -935,6 +935,7 @@ parseAname(char *aname, char **fsname, char **path)
 		*path = "";
 }
 
+#ifndef PLAN9PORT
 /*
  * Check remote IP address against /mnt/ipok.
  * Sources.cs.bell-labs.com uses this to disallow
@@ -972,6 +973,7 @@ conIPCheck(Con* con)
 	}
 	return 1;
 }
+#endif
 
 static int
 rTattach(Msg* m)
@@ -996,12 +998,14 @@ rTattach(Msg* m)
 	else
 		fid->uname = vtstrdup(unamenone);
 
+#ifndef PLAN9PORT
 	if((fid->con->flags&ConIPCheck) && !conIPCheck(fid->con)){
 		consPrint("reject %s from %s: %r\n", fid->uname, fid->con->remote);
 		fidClunk(fid);
 		vtfree(fsname);
 		return 0;
 	}
+#endif
 	if(fsysNoAuthCheck(fsys) || (m->con->flags&ConNoAuthCheck)){
 		if((fid->uid = uidByUname(fid->uname)) == nil)
 			fid->uid = vtstrdup(unamenone);
@@ -1032,7 +1036,9 @@ rTattach(Msg* m)
 static int
 rTauth(Msg* m)
 {
+#ifndef PLAN9PORT
 	int afd;
+#endif
 	Con *con;
 	Fid *afid;
 	Fsys *fsys;
@@ -1064,13 +1070,20 @@ rTauth(Msg* m)
 	}
 	afid->fsys = fsys;
 
+#ifndef PLAN9PORT
 	if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0){
 		werrstr("can't open \"/mnt/factotum/rpc\"");
 		fidClunk(afid);
 		return 0;
 	}
+#endif
+
+#ifdef PLAN9PORT
+	if((afid->rpc = auth_allocrpc()) == nil){
+#else
 	if((afid->rpc = auth_allocrpc(afd)) == nil){
 		close(afd);
+#endif
 		werrstr("can't auth_allocrpc");
 		fidClunk(afid);
 		return 0;
blob - f87cdc4d1ba6ae9c6beac00b6c5e31d16c44cf9e
blob + 23da4f4ef665f1c2af5b2fafe16a5af6f8564efd
--- src/cmd/fossil/9proc.c
+++ src/cmd/fossil/9proc.c
@@ -250,12 +250,13 @@ msgFlush(Msg* m)
 }
 
 static void
-msgProc(void*)
+msgProc(void* v)
 {
 	Msg *m;
 	char e[ERRMAX];
 	Con *con;
 
+	USED(v);
 	threadsetname("msgProc");
 
 	for(;;){
blob - 94e6724591f7afa63a9e7d55477cf6c3b2b5915c
blob + 0dad3d11f4cc431cbc1251f864a808479613a5e1
--- src/cmd/fossil/9srv.c
+++ src/cmd/fossil/9srv.c
@@ -20,6 +20,7 @@ static struct {
 	Srv*	tail;
 } sbox;
 
+#ifndef PLAN9PORT
 static int
 srvFd(char* name, int mode, int fd, char** mntpnt)
 {
@@ -54,6 +55,7 @@ srvFd(char* name, int mode, int fd, char** mntpnt)
 
 	return srvfd;
 }
+#endif
 
 static void
 srvFree(Srv* srv)
@@ -100,7 +102,12 @@ srvAlloc(char* service, int mode, int fd)
 		break;
 	}
 
+#ifdef PLAN9PORT
+	mntpnt = nil;
+	if((srvfd = post9pservice(fd, service, mntpnt)) < 0){
+#else
 	if((srvfd = srvFd(service, mode, fd, &mntpnt)) < 0){
+#endif
 		wunlock(&sbox.lock);
 		return nil;
 	}
@@ -203,6 +210,11 @@ cmdSrv(int argc, char* argv[])
 		return 1;
 	}
 
+#ifdef PLAN9PORT	/* fossilcons unsupported */
+	if(pflag)
+		return 1;
+#endif
+
 	if(pipe(fd) < 0){
 		werrstr("srv pipe: %r");
 		return 0;
blob - f24ef4af32f33115cdad6bc42a653fe5b29beef1
blob + b4496d72c4f7c6a8d640d06c80363c88a3ff4a9d
--- src/cmd/fossil/9user.c
+++ src/cmd/fossil/9user.c
@@ -338,7 +338,11 @@ int
 validUserName(char* name)
 {
 	Rune *r;
+#ifdef PLAN9PORT
+	static Rune invalid[] = {'#', ':', ',', '(', ')', '\0'};
+#else
 	static Rune invalid[] = L"#:,()";
+#endif
 
 	for(r = invalid; *r != '\0'; r++){
 		if(utfrune(name, *r))
blob - 3e062889be899cb9d50cbdca3062c3682c1b8749
blob + 3dde81c4dcb56a6850d08401c8bf2464007531da
--- src/cmd/fossil/Ccmd.c
+++ src/cmd/fossil/Ccmd.c
@@ -27,19 +27,22 @@ cmd9pStrtoull(char* s)
 }
 
 static int
-cmd9pTag(Fcall*, int, char **argv)
+cmd9pTag(Fcall* f, int i, char **argv)
 {
+	USED(f);
+	USED(i);
 	cbox.tag = strtoul(argv[0], 0, 0)-1;
 
 	return 1;
 }
 
 static int
-cmd9pTwstat(Fcall* f, int, char **argv)
+cmd9pTwstat(Fcall* f, int i, char **argv)
 {
 	Dir d;
 	static uchar buf[DIRMAX];
 
+	USED(i);
 	memset(&d, 0, sizeof d);
 	nulldir(&d);
 	d.name = argv[1];
@@ -61,32 +64,36 @@ cmd9pTwstat(Fcall* f, int, char **argv)
 }
 
 static int
-cmd9pTstat(Fcall* f, int, char** argv)
+cmd9pTstat(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->fid = strtol(argv[0], 0, 0);
 
 	return 1;
 }
 
 static int
-cmd9pTremove(Fcall* f, int, char** argv)
+cmd9pTremove(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->fid = strtol(argv[0], 0, 0);
 
 	return 1;
 }
 
 static int
-cmd9pTclunk(Fcall* f, int, char** argv)
+cmd9pTclunk(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->fid = strtol(argv[0], 0, 0);
 
 	return 1;
 }
 
 static int
-cmd9pTwrite(Fcall* f, int, char** argv)
+cmd9pTwrite(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->fid = strtol(argv[0], 0, 0);
 	f->offset = strtoll(argv[1], 0, 0);
 	f->data = argv[2];
@@ -96,8 +103,9 @@ cmd9pTwrite(Fcall* f, int, char** argv)
 }
 
 static int
-cmd9pTread(Fcall* f, int, char** argv)
+cmd9pTread(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->fid = strtol(argv[0], 0, 0);
 	f->offset = strtoll(argv[1], 0, 0);
 	f->count = strtol(argv[2], 0, 0);
@@ -106,8 +114,9 @@ cmd9pTread(Fcall* f, int, char** argv)
 }
 
 static int
-cmd9pTcreate(Fcall* f, int, char** argv)
+cmd9pTcreate(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->fid = strtol(argv[0], 0, 0);
 	f->name = argv[1];
 	f->perm = strtol(argv[2], 0, 8);
@@ -117,8 +126,9 @@ cmd9pTcreate(Fcall* f, int, char** argv)
 }
 
 static int
-cmd9pTopen(Fcall* f, int, char** argv)
+cmd9pTopen(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->fid = strtol(argv[0], 0, 0);
 	f->mode = strtol(argv[1], 0, 0);
 
@@ -148,16 +158,18 @@ cmd9pTwalk(Fcall* f, int argc, char** argv)
 }
 
 static int
-cmd9pTflush(Fcall* f, int, char** argv)
+cmd9pTflush(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->oldtag = strtol(argv[0], 0, 0);
 
 	return 1;
 }
 
 static int
-cmd9pTattach(Fcall* f, int, char** argv)
+cmd9pTattach(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->fid = strtol(argv[0], 0, 0);
 	f->afid = strtol(argv[1], 0, 0);
 	f->uname = argv[2];
@@ -167,8 +179,9 @@ cmd9pTattach(Fcall* f, int, char** argv)
 }
 
 static int
-cmd9pTauth(Fcall* f, int, char** argv)
+cmd9pTauth(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->afid = strtol(argv[0], 0, 0);
 	f->uname = argv[1];
 	f->aname = argv[2];
@@ -177,8 +190,9 @@ cmd9pTauth(Fcall* f, int, char** argv)
 }
 
 static int
-cmd9pTversion(Fcall* f, int, char** argv)
+cmd9pTversion(Fcall* f, int i, char** argv)
 {
+	USED(i);
 	f->msize = strtoul(argv[0], 0, 0);
 	if(f->msize > cbox.con->msize){
 		werrstr("msize too big");
@@ -420,6 +434,7 @@ cmdBind(int argc, char* argv[])
 	if(argc != 2 || (flag&MAFTER)&&(flag&MBEFORE))
 		return cliError(usage);
 
+#ifndef PLAN9PORT
 	if(bind(argv[0], argv[1], flag) < 0){
 		/* try to give a less confusing error than the default */
 		if(access(argv[0], 0) < 0)
@@ -429,6 +444,7 @@ cmdBind(int argc, char* argv[])
 		else
 			return cliError("bind %s %s: %r", argv[0], argv[1]);
 	}
+#endif
 	return 1;
 }
 
blob - afa025616899fbee132137ad8862ca42fa72ed68
blob + fed24d5581260b0feb8598458c2acdf8df0f59dc
--- src/cmd/fossil/Ccons.c
+++ src/cmd/fossil/Ccons.c
@@ -221,8 +221,9 @@ qAlloc(void)
 }
 
 static void
-consProc(void*)
+consProc(void* v)
 {
+	USED(v);
 	Q *q;
 	int argc, i, n, r;
 	char *argv[20], buf[Nq], *lp, *wbuf;
@@ -345,13 +346,21 @@ consTTY(void)
 
 	name = "/dev/cons";
 	if((fd = open(name, ORDWR)) < 0){
+#ifdef PLAN9PORT
+		name = "/dev/tty";
+#else
 		name = "#c/cons";
+#endif
 		if((fd = open(name, ORDWR)) < 0){
 			werrstr("consTTY: open %s: %r", name);
 			return 0;
 		}
 	}
 
+#ifdef PLAN9PORT
+	USED(p);
+	ctl = 0;
+#else
 	p = smprint("%sctl", name);
 	if((ctl = open(p, OWRITE)) < 0){
 		close(fd);
@@ -367,6 +376,7 @@ consTTY(void)
 		return 0;
 	}
 	free(p);
+#endif
 
 	if(consOpen(fd, fd, ctl) == 0){
 		close(ctl);
blob - 88c36611b62cea97de41bc6728af9f8e65973033
blob + 7ce281e31696b41c1b605a720ec0544d31af7dc6
--- src/cmd/fossil/check.c
+++ src/cmd/fossil/check.c
@@ -778,22 +778,34 @@ warn(Fsck *chk, char *fmt, ...)
 }
 
 static void
-clrenop(Fsck*, Block*, int)
+clrenop(Fsck *chk, Block *b, int i)
 {
+	USED(chk);
+	USED(b);
+	USED(i);
 }
 
 static void
-closenop(Fsck*, Block*, u32int)
+closenop(Fsck *chk, Block *b, u32int i)
 {
+	USED(chk);
+	USED(b);
+	USED(i);
 }
 
 static void
-clrinop(Fsck*, char*, MetaBlock*, int, Block*)
+clrinop(Fsck *chk, char *c, MetaBlock *mb, int i, Block *b)
 {
+	USED(chk);
+	USED(c);
+	USED(mb);
+	USED(i);
+	USED(b);
 }
 
 static int
-printnop(char*, ...)
+printnop(char *c, ...)
 {
+	USED(c);
 	return 0;
 }
blob - d01dedb6424eb86fc226b9e25263c1ac5478163b
blob + 4a8405968c405325763c65fe3fa07828c836733f
--- src/cmd/fossil/dat.h
+++ src/cmd/fossil/dat.h
@@ -328,4 +328,4 @@ enum {
 	PartVenti,	/* fake partition */
 };
 
-extern vtType[BtMax];
+extern int vtType[BtMax];
blob - 8491a4b9e6e5e979847eb2ac147307e48ed89619
blob + 04ea5cdd8de38c94a78362904ba1ef4ad0c04a9f
--- src/cmd/fossil/disk.c
+++ src/cmd/fossil/disk.c
@@ -288,8 +288,10 @@ disk2file(Disk *disk)
 {
 	static char buf[256];
 
+#ifndef PLAN9PORT
 	if (fd2path(disk->fd, buf, sizeof buf) < 0)
 		strncpy(buf, "GOK", sizeof buf);
+#endif
 	return buf;
 }
 
blob - 0506c6823655f32ecdb0a57fca413ff79b815d62
blob + c003f70693886c64e35dd14447649feb23285de8
--- src/cmd/fossil/flchk.c
+++ src/cmd/fossil/flchk.c
@@ -28,26 +28,33 @@ flprint(char *fmt, ...)
 }
 
 static void
-flclre(Fsck*, Block *b, int o)
+flclre(Fsck *chk, Block *b, int o)
 {
+	USED(chk);
 	Bprint(&bout, "# clre 0x%ux %d\n", b->addr, o);
 }
 
 static void
-flclrp(Fsck*, Block *b, int o)
+flclrp(Fsck *chk, Block *b, int o)
 {
+	USED(chk);
 	Bprint(&bout, "# clrp 0x%ux %d\n", b->addr, o);
 }
 
 static void
-flclri(Fsck*, char *name, MetaBlock*, int, Block*)
+flclri(Fsck *chk, char *name, MetaBlock *mb, int i, Block *b)
 {
+	USED(chk);
+	USED(mb);
+	USED(i);
+	USED(b);
 	Bprint(&bout, "# clri %s\n", name);
 }
 
 static void
-flclose(Fsck*, Block *b, u32int epoch)
+flclose(Fsck *chk, Block *b, u32int epoch)
 {
+	USED(chk);
 	Bprint(&bout, "# bclose 0x%ux %ud\n", b->addr, epoch);
 }
 
blob - bdfc8ada782fb25bc3068cdc4da7877428aae7a2
blob + 002e851037b7c0bcd4a2612273d524c17eb588ac
--- src/cmd/fossil/fossil.c
+++ src/cmd/fossil/fossil.c
@@ -73,7 +73,11 @@ threadmain(int argc, char* argv[])
 	/*
 	 * Insulate from the invoker's environment.
 	 */
+#ifdef PLAN9PORT
+	if(rfork(RFNAMEG) < 0)
+#else
 	if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0)
+#endif
 		sysfatal("rfork: %r");
 
 	close(0);
blob - 7b76af765a2d19825fc1da3426ba9413dadf9e1c
blob + 83770a1197718a25242d41ce952bf6e94570a500
--- src/cmd/fossil/mkfile
+++ src/cmd/fossil/mkfile
@@ -1,5 +1,6 @@
-</$objtype/mkfile
-BIN=/$objtype/bin/fossil
+<$PLAN9/src/mkhdr
+MKSHELL=$PLAN9/bin/rc
+BIN=$BIN/fossil
 
 TARG=fossil flchk flfmt conf last view
 
@@ -34,10 +35,10 @@ LIBFILES=\
 
 LIBCFILES=${LIBFILES:%=%.c}
 LIBOFILES=${LIBFILES:%=%.$O}
-LIB=libfs.a$O
+LIB=libfs.a
 
 HFILES=\
-	/sys/include/venti.h\
+	$PLAN9/include/venti.h\
 	stdinc.h\
 	vac.h\
 	dat.h\
@@ -98,12 +99,12 @@ test:V: all
 #	unmount /n/fossil
 #	rm /srv/fossil
 
-</sys/src/cmd/mkmany
+<$PLAN9/src/mkmany
 
 $LIB(%.$O):N: %.$O
 $LIB:	${LIBOFILES:%=$LIB(%)}
-	names = `{echo $newprereq |sed 's/ /\n/g' |sed -n 's/'$LIB'\(([^)]+)\)/\1/gp'}
-	ar vu $LIB $names
+	names = `{echo $newprereq |sed 's/ /\n/g' |9 sed -n 's/'$LIB'\(([^)]+)\)/\1/gp'}
+	$AR rsc $LIB $names
 #	rm $names
 
 $O.flfmt: flfmt9660.$O
@@ -128,9 +129,14 @@ bundle:V:
 
 $O.conf:D: conf.rc
 	{
-		echo '#!/bin/rc'
+		echo '#!/usr/local/plan9/bin/rc'
 		echo '# THIS FILE IS AUTOMATICALLY GENERATED'
-		echo '# FROM /sys/src/cmd/fossil/conf.rc.  DO NOT EDIT.'
+		echo '# FROM /usr/local/plan9/src/cmd/fossil/conf.rc.  DO NOT EDIT.'
 		echo 
 		sed 1d conf.rc
 	} >$target && chmod +x $target
+
+clean:
+	rm -f $LIB
+
+nuke: clean
blob - 698e86f410435af2cdfd28cbaa6c078ffb5fe7ff
blob + 9f98c03fe178aa06faf985a2d26e47246fbfad41
--- src/cmd/fossil/nobwatch.c
+++ src/cmd/fossil/nobwatch.c
@@ -15,8 +15,9 @@ bwatchInit(void)
 }
 
 void
-bwatchSetBlockSize(uint)
+bwatchSetBlockSize(uint i)
 {
+	USED(i);
 }
 
 void
blob - e18ad91a4d7b5b6271e179d32fcdfd845ab85a09
blob + 43b65e2285bb314e2f4cf5923f87efea114e3a25
--- src/cmd/fossil/stdinc.h
+++ src/cmd/fossil/stdinc.h
@@ -2,11 +2,10 @@
 #include <libc.h>
 #include <libsec.h>
 #include <thread.h>
+#ifdef PLAN9PORT
+#include <9pclient.h>
+#endif
 
-typedef uvlong	u64int;
-typedef	uchar	u8int;
-typedef ushort	u16int;
-
 #include "venti.h"
 #include "vac.h"
 #include "fs.h"
blob - 54a5586159fa614e1bea55e9d66d6e3efaa8cfcb
blob + 645a45a109788eb8799db8ca181ca92adea9e13a
--- src/cmd/fossil/view.c
+++ src/cmd/fossil/view.c
@@ -463,7 +463,7 @@ initxlabel(Label l)
 typedef struct Xblock Xblock;
 struct Xblock
 {
-	Tnode;
+	Tnode *t;
 	Block *b;
 	int (*gen)(void*, Block*, int, Tnode**);
 	void *arg;
@@ -478,57 +478,58 @@ xblockexpand(Tnode *tt)
 	Xblock *t = (Xblock*)tt;
 	Tnode *nn;
 
-	if(t->nkid >= 0)
+	if(t->t->nkid >= 0)
 		return;
 
 	j = 0;
 	if(t->printlabel){
-		t->kid = mallocz(Q*sizeof(t->kid[0]), 1);
-		t->kid[0] = initxlabel(t->b->l);
+		t->t->kid = mallocz(Q*sizeof(t->t->kid[0]), 1);
+		t->t->kid[0] = initxlabel(t->b->l);
 		j = 1;
 	}
 
 	for(i=0;; i++){
 		switch((*t->gen)(t->arg, t->b, i, &nn)){
 		case -1:
-			t->nkid = j;
+			t->t->nkid = j;
 			return;
 		case 0:
 			break;
 		case 1:
 			if(j%Q == 0)
-				t->kid = realloc(t->kid, (j+Q)*sizeof(t->kid[0]));
-			t->kid[j++] = nn;
+				t->t->kid = realloc(t->t->kid, (j+Q)*sizeof(t->t->kid[0]));
+			t->t->kid[j++] = nn;
 			break;
 		}
 	}
 }
 
 int
-nilgen(void*, Block*, int, Tnode**)
+nilgen(void *v, Block *b, int o, Tnode **tp)
 {
 	return -1;
 }
 
 Tnode*
-initxblock(Block *b, char *s, int (*gen)(void*, Block*, int, Tnode**), void *arg)
+initxblock(Block *b, char *s, int (*gen)(void *v, Block *b, int o, Tnode **tp), void *arg)
 {
 	Xblock *t;
 
 	if(gen == nil)
 		gen = nilgen;
 	t = mallocz(sizeof(Xblock), 1);
+	t->t = mallocz(sizeof(Tnode), 1);
 	t->b = b;
 	t->gen = gen;
 	t->arg = arg;
 	if(b->addr == NilBlock)
-		t->str = smprint("Block %V: %s", b->score, s);
+		t->t->str = smprint("Block %V: %s", b->score, s);
 	else
-		t->str = smprint("Block %#ux: %s", b->addr, s);
+		t->t->str = smprint("Block %#ux: %s", b->addr, s);
 	t->printlabel = 1;
-	t->nkid = -1;
-	t->expand = xblockexpand;
-	return t;
+	t->t->nkid = -1;
+	t->t->expand = xblockexpand;
+	return t->t;
 }
 
 int
@@ -557,7 +558,7 @@ initxentryblock(Block *b, Entry *ed)
 typedef struct Xentry Xentry;
 struct Xentry 
 {
-	Tnode;
+	Tnode *t;
 	Entry e;
 };
 
@@ -566,12 +567,12 @@ xentryexpand(Tnode *tt)
 {
 	Xentry *t = (Xentry*)tt;
 
-	if(t->nkid >= 0)
+	if(t->t->nkid >= 0)
 		return;
 
-	t->nkid = 1;
-	t->kid = mallocz(sizeof(t->kid[0])*t->nkid, 1);
-	t->kid[0] = initxsource(t->e, 1);
+	t->t->nkid = 1;
+	t->t->kid = mallocz(sizeof(t->t->kid[0])*t->t->nkid, 1);
+	t->t->kid[0] = initxsource(t->e, 1);
 }
 
 Tnode*
@@ -580,14 +581,15 @@ initxentry(Entry e)
 	Xentry *t;
 
 	t = mallocz(sizeof *t, 1);
-	t->nkid = -1;
-	t->str = smprint("Entry gen=%#ux psize=%d dsize=%d depth=%d flags=%#ux size=%lld score=%V",
+	t->t = mallocz(sizeof(Tnode), 1);
+	t->t->nkid = -1;
+	t->t->str = smprint("Entry gen=%#ux psize=%d dsize=%d depth=%d flags=%#ux size=%lld score=%V",
 		e.gen, e.psize, e.dsize, e.depth, e.flags, e.size, e.score);
 	if(e.flags & VtEntryLocal)
-		t->str = smprint("%s archive=%d snap=%d tag=%#ux", t->str, e.archive, e.snap, e.tag);
-	t->expand = xentryexpand;
+		t->t->str = smprint("%s archive=%d snap=%d tag=%#ux", t->t->str, e.archive, e.snap, e.tag);
+	t->t->expand = xentryexpand;
 	t->e = e;
-	return t;	
+	return t->t;	
 }
 
 int
@@ -659,7 +661,7 @@ initxsource(Entry e, int dowrap)
 }
 
 int
-xlocalrootgen(void*, Block *b, int o, Tnode **tp)
+xlocalrootgen(void *v, Block *b, int o, Tnode **tp)
 {
 	Entry e;
 
@@ -684,7 +686,7 @@ initxlocalroot(char *name, u32int addr)
 }
 
 int
-xvacrootgen(void*, Block *b, int o, Tnode **tp)
+xvacrootgen(void *v, Block *b, int o, Tnode **tp)
 {
 	Entry e;
 
@@ -734,7 +736,7 @@ initxdirentry(MetaEntry *me)
 }
 
 int
-metaentrygen(void *v, Block*, int o, Tnode **tp)
+metaentrygen(void *v, Block *b, int o, Tnode **tp)
 {
 	Tnode *t;
 	MetaBlock *mb;
@@ -765,11 +767,11 @@ metablockgen(void *v, Block *b, int o, Tnode **tp)
 	/* hack: reuse initxblock as a generic iterator */
 	mb = v;
 	t = (Xblock*)initxblock(b, "", metaentrygen, mb);
-	t->str = smprint("MetaBlock %d/%d space used, %d add'l free %d/%d table used%s",
+	t->t->str = smprint("MetaBlock %d/%d space used, %d add'l free %d/%d table used%s",
 		mb->size, mb->maxsize, mb->free, mb->nindex, mb->maxindex,
 		mb->botch ? " [BOTCH]" : "");
 	t->printlabel = 0;
-	*tp = t;
+	*tp = t->t;
 	return 1;
 }