diff -r a3522064f5dc sys/include/venti.h --- a/sys/include/venti.h Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/include/venti.h Tue Sep 18 19:30:23 2018 -0500 @@ -134,7 +134,8 @@ _VtEntryDir = 1<<1, /* a directory */ _VtEntryDepthShift = 2, /* shift for pointer depth */ _VtEntryDepthMask = 7<<2, /* mask for pointer depth */ - VtEntryLocal = 1<<5 /* for local storage only */ + VtEntryLocal = 1<<5, /* for local storage only */ + VtEntryNoArchive = 1<<6 /* for local storage only */ }; enum { @@ -334,7 +335,9 @@ }; VtConn* vtconn(int infd, int outfd); +int vtreconn(VtConn*, int, int); VtConn* vtdial(char*); +int vtredial(VtConn*, char*); void vtfreeconn(VtConn*); int vtsend(VtConn*, Packet*); Packet* vtrecv(VtConn*); @@ -378,6 +381,10 @@ int vtsync(VtConn*); int vtping(VtConn*); +/* sha1 */ +void vtsha1(uchar score[VtScoreSize], uchar*, int); +int vtsha1check(uchar score[VtScoreSize], uchar*, int); + /* * Data blocks and block cache. */ diff -r a3522064f5dc sys/man/2/venti-conn --- a/sys/man/2/venti-conn Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/man/2/venti-conn Tue Sep 18 19:30:23 2018 -0500 @@ -28,9 +28,15 @@ VtConn* vtconn(int infd, int outfd) .PP .B +int vtreconn(VtConn *z, int infd, int outfd) +.PP +.B VtConn* vtdial(char *addr) .PP .B +int vtredial(VtConn *z, char *addr) +.PP +.B int vtversion(VtConn *z) .PP .B diff -r a3522064f5dc sys/src/cmd/venti/copy.c --- a/sys/src/cmd/venti/copy.c Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/cmd/venti/copy.c Tue Sep 18 19:30:23 2018 -0500 @@ -122,7 +122,7 @@ break; case VtDirType: - for(i=0; inarenas = amn.n; ap->map = amn.map; if(okamap(ap->map, ap->narenas, ap->arenabase, ap->size, "arena table") < 0){ - freearenapart(ap, 0); - return nil; + if(!Emergency){ + freearenapart(ap, 0); + return nil; + } + /* else keep on, for emergency use */ } ap->arenas = MKNZ(Arena*, ap->narenas); @@ -152,8 +156,14 @@ ap->arenas[i] = initarena(part, ap->map[i].start, ap->map[i].stop - ap->map[i].start, ap->blocksize); if(ap->arenas[i] == nil){ seterr(ECorrupt, "%s: %r", ap->map[i].name); - freearenapart(ap, 1); - return nil; + if(!Emergency){ + freearenapart(ap, 1); + return nil; + }else{ + /* keep on, for emergency use */ + ap->narenas = i; + break; + } } if(namecmp(ap->map[i].name, ap->arenas[i]->name) != 0){ seterr(ECorrupt, "arena name mismatches with expected name: %s vs. %s", diff -r a3522064f5dc sys/src/cmd/venti/srv/buildindex.c --- a/sys/src/cmd/venti/srv/buildindex.c Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/cmd/venti/srv/buildindex.c Tue Sep 18 19:30:23 2018 -0500 @@ -813,7 +813,7 @@ } if (nbuf == 0) { fprint(2, "%s: brand-new index, no work to do\n", argv0); - exits(0); + threadexitsall(0); } /* size buffer to use extra memory */ diff -r a3522064f5dc sys/src/cmd/venti/srv/config.c --- a/sys/src/cmd/venti/srv/config.c Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/cmd/venti/srv/config.c Tue Sep 18 19:30:23 2018 -0500 @@ -177,6 +177,10 @@ } config->vaddr = estrdup(flds[1]); }else{ + /* + * this is insanely paranoid. a single typo should not + * prevent venti from starting. + */ seterr(EAdmin, "illegal line '%s' in configuration file %s", line, file); break; } diff -r a3522064f5dc sys/src/cmd/venti/srv/dat.h --- a/sys/src/cmd/venti/srv/dat.h Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/cmd/venti/srv/dat.h Tue Sep 18 19:30:23 2018 -0500 @@ -48,7 +48,7 @@ MaxIo = 64*1024, /* max size of a single read or write operation */ ICacheBits = 16, /* default bits for indexing icache */ MaxAMap = 31*1024, /* max. allowed arenas in an address mapping; must be < 32*1024 */ - Unspecified = ~0ul, + Unspecified = TWID32, /* * return codes from syncarena diff -r a3522064f5dc sys/src/cmd/venti/srv/fixarenas.c --- a/sys/src/cmd/venti/srv/fixarenas.c Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/cmd/venti/srv/fixarenas.c Tue Sep 18 19:30:23 2018 -0500 @@ -130,12 +130,12 @@ int i, j, k, n; if(offset >= partend){ - memset(buf, 0xFB, sizeof buf); + memset(buf, 0xFB, len); return buf; } if(offset+len > partend){ - memset(buf, 0xFB, sizeof buf); + memset(buf, 0xFB, len); len = partend - offset; } diff -r a3522064f5dc sys/src/cmd/venti/srv/unwhack.c --- a/sys/src/cmd/venti/srv/unwhack.c Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/cmd/venti/srv/unwhack.c Tue Sep 18 19:30:23 2018 -0500 @@ -156,8 +156,7 @@ off++; if(off > d - dst){ - snprint(uw->err, WhackErrLen, "offset out of range: off=%d d=%zd len=%d nbits=%d", - off, d - dst, len, uwnbits); + snprint(uw->err, WhackErrLen, "offset out of range: off=%d d=%zd len=%d nbits=%d", off, d - dst, len, uwnbits); return -1; } if(d + len > dmax){ diff -r a3522064f5dc sys/src/libventi/conn.c --- a/sys/src/libventi/conn.c Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/libventi/conn.c Tue Sep 18 19:30:23 2018 -0500 @@ -27,6 +27,28 @@ return z; } +int +vtreconn(VtConn *z, int infd, int outfd) +{ + NetConnInfo *nci; + + z->state = VtStateAlloc; + if(z->infd >= 0) + close(z->infd); + z->infd = infd; + if(z->outfd >= 0) + close(z->outfd); + z->outfd = outfd; + nci = getnetconninfo(nil, infd); + if(nci == nil) + snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd); + else{ + strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr); + freenetconninfo(nci); + } + return 0; +} + void vtfreeconn(VtConn *z) { diff -r a3522064f5dc sys/src/libventi/dial.c --- a/sys/src/libventi/dial.c Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/libventi/dial.c Tue Sep 18 19:30:23 2018 -0500 @@ -23,3 +23,21 @@ strecpy(z->addr, z->addr+sizeof z->addr, na); return z; } + +int +vtredial(VtConn *z, char *addr) +{ + char *na; + int fd; + + if(addr == nil) + addr = getenv("venti"); + if(addr == nil) + addr = "$venti"; + + na = netmkaddr(addr, "tcp", "venti"); + if((fd = dial(na, nil, nil, nil)) < 0) + return fd; + + return vtreconn(z, fd, fd); +} diff -r a3522064f5dc sys/src/libventi/file.c --- a/sys/src/libventi/file.c Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/libventi/file.c Tue Sep 18 19:30:23 2018 -0500 @@ -503,6 +503,7 @@ VtBlock *b; int type; uchar *score; + VtEntry oe; switch(p->type){ case VtDataType: @@ -530,6 +531,8 @@ if(vtglobaltolocal(b->score) != NilBlock) return b; + + oe = *e; /* * Copy on write. @@ -597,6 +600,7 @@ shrinkdepth(VtFile *r, VtBlock *p, VtEntry *e, int depth) { VtBlock *b, *nb, *ob, *rb; + VtEntry oe; assert(ISLOCKED(r)); assert(depth <= VtPointerDepth); @@ -604,6 +608,12 @@ rb = vtcacheglobal(r->c, e->score, e->type); if(rb == nil) return -1; + + /* + * Walk down to the new root block. + * We may stop early, but something is better than nothing. + */ + oe = *e; ob = nil; b = rb; diff -r a3522064f5dc sys/src/libventi/mkfile --- a/sys/src/libventi/mkfile Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/libventi/mkfile Tue Sep 18 19:30:23 2018 -0500 @@ -24,6 +24,7 @@ scorefmt.$O\ send.$O\ server.$O\ + sha1.$O\ srvhello.$O\ strdup.$O\ string.$O\ diff -r a3522064f5dc sys/src/libventi/rpc.c --- a/sys/src/libventi/rpc.c Wed Sep 19 01:11:49 2018 +0200 +++ b/sys/src/libventi/rpc.c Tue Sep 18 19:30:23 2018 -0500 @@ -37,7 +37,6 @@ uchar tag, buf[2], *top; Rwait *r, *rr; - if(z == nil){ werrstr("not connected"); packetfree(p);