diff options
author | rsc <devnull@localhost> | 2005-07-24 20:15:44 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-07-24 20:15:44 +0000 |
commit | 23fb2edb22703ad10aae02295e654b3de68617c5 (patch) | |
tree | 68033bae1131e4028eb4a78d4cc028bd2c77839d /src/cmd/vac/file.c | |
parent | 7ba8aa0c7083415ad69c2f8e591425f3c6ebf952 (diff) | |
download | plan9port-23fb2edb22703ad10aae02295e654b3de68617c5.tar.gz plan9port-23fb2edb22703ad10aae02295e654b3de68617c5.tar.bz2 plan9port-23fb2edb22703ad10aae02295e654b3de68617c5.zip |
venti updates
Diffstat (limited to 'src/cmd/vac/file.c')
-rw-r--r-- | src/cmd/vac/file.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/src/cmd/vac/file.c b/src/cmd/vac/file.c index bb0bb03d..10c632c9 100644 --- a/src/cmd/vac/file.c +++ b/src/cmd/vac/file.c @@ -4,6 +4,8 @@ #include "fns.h" #include "error.h" +#define debug 0 + /* * locking order is upwards. A thread can hold the lock for a VacFile * and then acquire the lock of its parent @@ -122,12 +124,16 @@ Err: VacFile* _vacfileroot(VacFs *fs, VtFile *r) { + int redirected; + char err[ERRMAX]; VtBlock *b; VtFile *r0, *r1, *r2; MetaBlock mb; MetaEntry me; VacFile *root, *mr; + redirected = 0; +Top: b = nil; root = nil; mr = nil; @@ -137,14 +143,31 @@ _vacfileroot(VacFs *fs, VtFile *r) if(vtfilelock(r, -1) < 0) return nil; r0 = vtfileopen(r, 0, fs->mode); + if(debug) + fprint(2, "r0 %p\n", r0); if(r0 == nil) goto Err; + r2 = vtfileopen(r, 2, fs->mode); + if(debug) + fprint(2, "r2 %p\n", r2); + if(r2 == nil){ + /* + * some vac files (e.g., from fossil) + * have an extra layer of indirection. + */ + rerrstr(err, sizeof err); + if(!redirected && strstr(err, "not active")){ + vtfileunlock(r); + r = r0; + goto Top; + } + goto Err; + } r1 = vtfileopen(r, 1, fs->mode); + if(debug) + fprint(2, "r1 %p\n", r1); if(r1 == nil) goto Err; - r2 = vtfileopen(r, 2, fs->mode); - if(r2 == nil) - goto Err; mr = filealloc(fs); mr->msource = r2; |