History

20090521-2101

Charles.Forsyth committed 17 years ago

Commit 0bf7f301 parent c14afec7 files · +45 −24Browse files

Unified · Split

7 files
  1. CHANGES +2 −0
  2. appl/cmd/vacfs.b +10 −3
  3. appl/lib/vac.b +33 −22
  4. dis/lib/vac.dis +0 −0
  5. dis/vacfs.dis +0 −0
  6. include/version.h +1 −1
  7. module/vac.m +1 −0
CHANGES+2−0
@@ -1,3 +1,5 @@
1+20090521
2+ module/vac.m appl/cmd/vacfs.b appl/lib/vac.b [issue 152] (Mecchiel)
13 20090505
24 add -h/-t header/trailer options to man2html
35 20090430
appl/cmd/vacfs.b+10−3
@@ -158,6 +158,8 @@ walk(ed: ref Elem.Dir, name: string): (ref Elem, string) · 157 unmodified lines
158158 if(ne == nil) {
159159 nqid := childput(ed.qid, de.qid);
160160 ne = Elem.new(nqid, ed.vd, de, ed.qid);
161+ if(ne == nil)
162+ return (nil, sprint("%r"));
161163 set(ne);
162164 }
163165 return (ne, nil);
@@ -204,14 +206,15 @@ init(nil: ref Draw->Context, args: list of string) · 40 unmodified lines
204206 styx = load Styx Styx->PATH;
205207 styxservers = load Styxservers Styxservers->PATH;
206208 vac = load Vac Vac->PATH;
207− if(venti == nil || vac == nil)
208− error("loading venti,vac");
209− sys->pctl(sys->NEWPGRP, nil);
210209 venti->init();
211210 vac->init();
212211 styx->init();
213212 styxservers->init(styx);
214213
214+ sys->pctl(sys->NEWPGRP, nil);
215+ if(venti == nil || vac == nil)
216+ error("loading venti,vac");
217+
215218 arg->init(args);
216219 arg->setusage(arg->progname()+" [-Ddp] [-a addr] [[tag:]score]");
217220 while((ch := arg->opt()) != 0)
@@ -402,6 +405,10 @@ loop: · 184 unmodified lines
402405 if(ne == nil) {
403406 nqid := childput(ed.qid, de.qid);
404407 ne = Elem.new(nqid, ed.vd, de, ed.qid);
408+ if(ne == nil) {
409+ n.reply <-= (nil, sprint("%r"));
410+ continue loop;
411+ }
405412 }
406413 d := ne.stat();
407414 ed.prev[ed.nprev++] = d;
appl/lib/vac.b+33−22
@@ -436,7 +436,7 @@ fflush(f: ref File, last: int): (int, ref Entry) · 435 unmodified lines
436436 return (0, nil);
437437 if(last && f.p[i].o == Scoresize) {
438438 flags := Entryactive;
439− if(f.dtype & Dirtype)
439+ if(f.dtype == Dirtype)
440440 flags |= Entrydir;
441441 flags |= i<<Entrydepthshift;
442442 score := Score(f.p[i].data());
@@ -540,7 +540,7 @@ Mentry.cmp(a, b: ref Mentry): int · 97 unmodified lines
540540
541541 MSink.new(s: ref Venti->Session, dsize: int): ref MSink
542542 {
543− return ref MSink(File.new(s, Dirtype, dsize), array[dsize] of byte, 0, nil);
543+ return ref MSink(File.new(s, Datatype, dsize), array[dsize] of byte, 0, nil);
544544 }
545545
546546 l2a[T](l: list of T): array of T
@@ -620,7 +620,10 @@ MSink.finish(m: self ref MSink): ref Entry · 73 unmodified lines
620620
621621 Source.new(s: ref Session, e: ref Entry): ref Source
622622 {
623− return ref Source(s, e);
623+ dsize := e.dsize;
624+ if(e.flags&Entrydir)
625+ dsize = Entrysize*(dsize/Entrysize);
626+ return ref Source(s, e, dsize);
624627 }
625628
626629 power(b, e: int): big
@@ -640,13 +643,13 @@ blocksize(e: ref Entry): int · 13 unmodified lines
640643
641644 Source.get(s: self ref Source, i: big, d: array of byte): int
642645 {
643− npages := (s.e.size+big (s.e.dsize-1))/big s.e.dsize;
644− if(i*big s.e.dsize >= s.e.size)
646+ npages := (s.e.size+big (s.dsize-1))/big s.dsize;
647+ if(i*big s.dsize >= s.e.size)
645648 return 0;
646649
647− want := s.e.dsize;
650+ want := s.dsize;
648651 if(i == npages-big 1)
649− want = int (s.e.size - i*big s.e.dsize);
652+ want = int (s.e.size - i*big s.dsize);
650653 last := s.e.score;
651654 bsize := blocksize(s.e);
652655 buf: array of byte;
@@ -710,11 +713,12 @@ Vacfile.read(v: self ref Vacfile, d: array of byte, n: int): int · 57 unmodified lines
710713
711714 Vacfile.pread(v: self ref Vacfile, d: array of byte, n: int, offset: big): int
712715 {
713− dsize := v.s.e.dsize;
716+ dsize := v.s.dsize;
717+say(sprint("vf.preadn, len d %d, n %d, offset %bd", len d, n, offset));
714718 have := v.s.get(big (offset/big dsize), buf := array[dsize] of byte);
715719 if(have <= 0)
716720 return have;
717−say(sprint("vacfile.read: have=%d dsize=%d", have, dsize));
721+say(sprint("vacfile.pread: have=%d dsize=%d", have, dsize));
718722 o := int (offset % big dsize);
719723 have -= o;
720724 if(have > n)
@@ -775,7 +779,7 @@ finddirentry(d: array of byte, elem: string): (int, ref Direntry) · 54 unmodified lines
775779 if(c == 0)
776780 break;
777781 }
778− de := readdirentry(d, left);
782+ de := readdirentry(d, left, 0);
779783 if(de != nil && de.elem == elem)
780784 return (1, de);
781785 return (0, nil);
@@ -809,7 +813,7 @@ say(sprint("vfreadentry: reading entry=%d", entry)); · 27 unmodified lines
809813 if(n < 0)
810814 return nil;
811815 if(n != len ebuf) {
812− werrstr(sprint("bad archive, entry=%d not present", entry));
816+ werrstr(sprint("bad archive, entry=%d not present (read %d, wanted %d)", entry, n, len ebuf));
813817 return nil;
814818 }
815819 e := Entry.unpack(ebuf);
@@ -817,7 +821,8 @@ say(sprint("vfreadentry: reading entry=%d", entry)); · 1 unmodified line
817821 werrstr("entry not active");
818822 return nil;
819823 }
820− if(e.flags&Entrylocal) {
824+ # p9p writes archives with Entrylocal set?
825+ if(0 && e.flags&Entrylocal) {
821826 werrstr("entry is local");
822827 return nil;
823828 }
@@ -848,14 +853,14 @@ say(sprint("vacdir.open: have mentry, score=%s size=%bd", me.score.text(), e.siz · 24 unmodified lines
848853 return (e, me);
849854 }
850855
851−readdirentry(buf: array of byte, i: int): ref Direntry
856+readdirentry(buf: array of byte, i: int, allowroot: int): ref Direntry
852857 {
853858 me := Metaentry.unpack(buf, i);
854859 if(me == nil)
855860 return nil;
856861 o := me.offset;
857862 de := Direntry.unpack(buf[o:o+me.size]);
858− if(badelem(de.elem)) {
863+ if(badelem(de.elem) && !(allowroot && de.elem == "/")) {
859864 werrstr(sprint("bad direntry: %s", de.elem));
860865 return nil;
861866 }
@@ -875,18 +880,18 @@ badelem(elem: string): int · 13 unmodified lines
875880 return elem == "" || elem == "." || elem == ".." || has('/', elem) || has(0, elem);
876881 }
877882
878−Vacdir.readdir(vd: self ref Vacdir): (int, ref Direntry)
883+vdreaddir(vd: ref Vacdir, allowroot: int): (int, ref Direntry)
879884 {
880−say(sprint("vacdir.readdir: ms.e.size=%bd vd.p=%bd vd.i=%d", vd.ms.e.size, vd.p, vd.i));
881− dsize := vd.ms.e.dsize;
885+say(sprint("vdreaddir: ms.e.size=%bd vd.p=%bd vd.i=%d", vd.ms.e.size, vd.p, vd.i));
886+ dsize := vd.ms.dsize;
882887 n := vd.ms.get(vd.p, buf := array[dsize] of byte);
883888 if(n <= 0)
884889 return (n, nil);
885−say(sprint("vacdir.readdir: have buf, length=%d e.size=%bd", n, vd.ms.e.size));
890+say(sprint("vdreaddir: have buf, length=%d e.size=%bd", n, vd.ms.e.size));
886891 mb := Metablock.unpack(buf);
887892 if(mb == nil)
888893 return (-1, nil);
889− de := readdirentry(buf, vd.i);
894+ de := readdirentry(buf, vd.i, allowroot);
890895 if(de == nil)
891896 return (-1, nil);
892897 vd.i++;
@@ -894,10 +899,16 @@ say(sprint("vacdir.readdir: have buf, length=%d e.size=%bd", n, vd.ms.e.size)); · 1 unmodified line
894899 vd.p++;
895900 vd.i = 0;
896901 }
897−say("vacdir.readdir: have entry");
902+say("vdreaddir: have entry");
898903 return (1, de);
899904 }
900905
906+Vacdir.readdir(vd: self ref Vacdir): (int, ref Direntry)
907+{
908+ return vdreaddir(vd, 0);
909+}
910+
911+
901912 Vacdir.rewind(vd: self ref Vacdir)
902913 {
903914 vd.p = big 0;
@@ -944,8 +955,8 @@ vdroot(session: ref Session, score: Venti->Score): (ref Vacdir, ref Direntry, st · 40 unmodified lines
944955 }
945956 say("top entries unpacked");
946957
947− mroot := Vacdir.new(session, nil, e[2]);
948− (ok, de) := mroot.readdir();
958+ mroot := Vacdir.mk(nil, Source.new(session, e[2]));
959+ (ok, de) := vdreaddir(mroot, 1);
949960 if(ok <= 0)
950961 return (nil, nil, sprint("reading root meta entry: %r"));
951962
dis/lib/vac.dis+0−0

Binary file not shown.

dis/vacfs.dis+0−0

Binary file not shown.

include/version.h+1−1
@@ -1 +1 @@
1−#define VERSION "Fourth Edition (20090505)"
1+#define VERSION "Fourth Edition (20090521)"
module/vac.m+1−0
@@ -152,6 +152,7 @@ Vac: module { · 151 unmodified lines
152152 Source: adt {
153153 session: ref Venti->Session;
154154 e: ref Entry;
155+ dsize: int; # real dsize
155156
156157 new: fn(s: ref Venti->Session, e: ref Entry): ref Source;
157158 get: fn(s: self ref Source, i: big, d: array of byte): int;