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 @@
120090521
2 module/vac.m appl/cmd/vacfs.b appl/lib/vac.b [issue 152] (Mecchiel)
120090505320090505
2 add -h/-t header/trailer options to man2html4 add -h/-t header/trailer options to man2html
320090430520090430
appl/cmd/vacfs.b+10−3
@@ -158,6 +158,8 @@ walk(ed: ref Elem.Dir, name: string): (ref Elem, string) · 157 unmodified lines
158 if(ne == nil) {158 if(ne == nil) {
159 nqid := childput(ed.qid, de.qid);159 nqid := childput(ed.qid, de.qid);
160 ne = Elem.new(nqid, ed.vd, de, ed.qid);160 ne = Elem.new(nqid, ed.vd, de, ed.qid);
161 if(ne == nil)
162 return (nil, sprint("%r"));
161 set(ne);163 set(ne);
162 }164 }
163 return (ne, nil);165 return (ne, nil);
@@ -204,14 +206,15 @@ init(nil: ref Draw->Context, args: list of string) · 40 unmodified lines
204 styx = load Styx Styx->PATH;206 styx = load Styx Styx->PATH;
205 styxservers = load Styxservers Styxservers->PATH;207 styxservers = load Styxservers Styxservers->PATH;
206 vac = load Vac Vac->PATH;208 vac = load Vac Vac->PATH;
207 if(venti == nil || vac == nil)
208 error("loading venti,vac");
209 sys->pctl(sys->NEWPGRP, nil);
210 venti->init();209 venti->init();
211 vac->init();210 vac->init();
212 styx->init();211 styx->init();
213 styxservers->init(styx);212 styxservers->init(styx);
214 213
214 sys->pctl(sys->NEWPGRP, nil);
215 if(venti == nil || vac == nil)
216 error("loading venti,vac");
217
215 arg->init(args);218 arg->init(args);
216 arg->setusage(arg->progname()+" [-Ddp] [-a addr] [[tag:]score]");219 arg->setusage(arg->progname()+" [-Ddp] [-a addr] [[tag:]score]");
217 while((ch := arg->opt()) != 0)220 while((ch := arg->opt()) != 0)
@@ -402,6 +405,10 @@ loop: · 184 unmodified lines
402 if(ne == nil) {405 if(ne == nil) {
403 nqid := childput(ed.qid, de.qid);406 nqid := childput(ed.qid, de.qid);
404 ne = Elem.new(nqid, ed.vd, de, ed.qid);407 ne = Elem.new(nqid, ed.vd, de, ed.qid);
408 if(ne == nil) {
409 n.reply <-= (nil, sprint("%r"));
410 continue loop;
411 }
405 }412 }
406 d := ne.stat();413 d := ne.stat();
407 ed.prev[ed.nprev++] = d;414 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
436 return (0, nil);436 return (0, nil);
437 if(last && f.p[i].o == Scoresize) {437 if(last && f.p[i].o == Scoresize) {
438 flags := Entryactive;438 flags := Entryactive;
439 if(f.dtype & Dirtype)439 if(f.dtype == Dirtype)
440 flags |= Entrydir;440 flags |= Entrydir;
441 flags |= i<<Entrydepthshift;441 flags |= i<<Entrydepthshift;
442 score := Score(f.p[i].data());442 score := Score(f.p[i].data());
@@ -540,7 +540,7 @@ Mentry.cmp(a, b: ref Mentry): int · 97 unmodified lines
540 540
541MSink.new(s: ref Venti->Session, dsize: int): ref MSink541MSink.new(s: ref Venti->Session, dsize: int): ref MSink
542{542{
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);
544}544}
545 545
546l2a[T](l: list of T): array of T546l2a[T](l: list of T): array of T
@@ -620,7 +620,10 @@ MSink.finish(m: self ref MSink): ref Entry · 73 unmodified lines
620 620
621Source.new(s: ref Session, e: ref Entry): ref Source621Source.new(s: ref Session, e: ref Entry): ref Source
622{622{
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);
624}627}
625 628
626power(b, e: int): big629power(b, e: int): big
@@ -640,13 +643,13 @@ blocksize(e: ref Entry): int · 13 unmodified lines
640 643
641Source.get(s: self ref Source, i: big, d: array of byte): int644Source.get(s: self ref Source, i: big, d: array of byte): int
642{645{
643 npages := (s.e.size+big (s.e.dsize-1))/big s.e.dsize;646 npages := (s.e.size+big (s.dsize-1))/big s.dsize;
644 if(i*big s.e.dsize >= s.e.size)647 if(i*big s.dsize >= s.e.size)
645 return 0;648 return 0;
646 649
647 want := s.e.dsize;650 want := s.dsize;
648 if(i == npages-big 1)651 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);
650 last := s.e.score;653 last := s.e.score;
651 bsize := blocksize(s.e);654 bsize := blocksize(s.e);
652 buf: array of byte;655 buf: array of byte;
@@ -710,11 +713,12 @@ Vacfile.read(v: self ref Vacfile, d: array of byte, n: int): int · 57 unmodified lines
710 713
711Vacfile.pread(v: self ref Vacfile, d: array of byte, n: int, offset: big): int714Vacfile.pread(v: self ref Vacfile, d: array of byte, n: int, offset: big): int
712{715{
713 dsize := v.s.e.dsize;716 dsize := v.s.dsize;
717say(sprint("vf.preadn, len d %d, n %d, offset %bd", len d, n, offset));
714 have := v.s.get(big (offset/big dsize), buf := array[dsize] of byte);718 have := v.s.get(big (offset/big dsize), buf := array[dsize] of byte);
715 if(have <= 0)719 if(have <= 0)
716 return have;720 return have;
717say(sprint("vacfile.read: have=%d dsize=%d", have, dsize));721say(sprint("vacfile.pread: have=%d dsize=%d", have, dsize));
718 o := int (offset % big dsize);722 o := int (offset % big dsize);
719 have -= o;723 have -= o;
720 if(have > n)724 if(have > n)
@@ -775,7 +779,7 @@ finddirentry(d: array of byte, elem: string): (int, ref Direntry) · 54 unmodified lines
775 if(c == 0)779 if(c == 0)
776 break;780 break;
777 }781 }
778 de := readdirentry(d, left);782 de := readdirentry(d, left, 0);
779 if(de != nil && de.elem == elem)783 if(de != nil && de.elem == elem)
780 return (1, de);784 return (1, de);
781 return (0, nil);785 return (0, nil);
@@ -809,7 +813,7 @@ say(sprint("vfreadentry: reading entry=%d", entry)); · 27 unmodified lines
809 if(n < 0)813 if(n < 0)
810 return nil;814 return nil;
811 if(n != len ebuf) {815 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));
813 return nil;817 return nil;
814 }818 }
815 e := Entry.unpack(ebuf);819 e := Entry.unpack(ebuf);
@@ -817,7 +821,8 @@ say(sprint("vfreadentry: reading entry=%d", entry)); · 1 unmodified line
817 werrstr("entry not active");821 werrstr("entry not active");
818 return nil;822 return nil;
819 }823 }
820 if(e.flags&Entrylocal) {824 # p9p writes archives with Entrylocal set?
825 if(0 && e.flags&Entrylocal) {
821 werrstr("entry is local");826 werrstr("entry is local");
822 return nil;827 return nil;
823 }828 }
@@ -848,14 +853,14 @@ say(sprint("vacdir.open: have mentry, score=%s size=%bd", me.score.text(), e.siz · 24 unmodified lines
848 return (e, me);853 return (e, me);
849}854}
850 855
851readdirentry(buf: array of byte, i: int): ref Direntry856readdirentry(buf: array of byte, i: int, allowroot: int): ref Direntry
852{857{
853 me := Metaentry.unpack(buf, i);858 me := Metaentry.unpack(buf, i);
854 if(me == nil)859 if(me == nil)
855 return nil;860 return nil;
856 o := me.offset;861 o := me.offset;
857 de := Direntry.unpack(buf[o:o+me.size]);862 de := Direntry.unpack(buf[o:o+me.size]);
858 if(badelem(de.elem)) {863 if(badelem(de.elem) && !(allowroot && de.elem == "/")) {
859 werrstr(sprint("bad direntry: %s", de.elem));864 werrstr(sprint("bad direntry: %s", de.elem));
860 return nil;865 return nil;
861 }866 }
@@ -875,18 +880,18 @@ badelem(elem: string): int · 13 unmodified lines
875 return elem == "" || elem == "." || elem == ".." || has('/', elem) || has(0, elem);880 return elem == "" || elem == "." || elem == ".." || has('/', elem) || has(0, elem);
876}881}
877 882
878Vacdir.readdir(vd: self ref Vacdir): (int, ref Direntry)883vdreaddir(vd: ref Vacdir, allowroot: int): (int, ref Direntry)
879{884{
880say(sprint("vacdir.readdir: ms.e.size=%bd vd.p=%bd vd.i=%d", vd.ms.e.size, vd.p, vd.i));885say(sprint("vdreaddir: ms.e.size=%bd vd.p=%bd vd.i=%d", vd.ms.e.size, vd.p, vd.i));
881 dsize := vd.ms.e.dsize;886 dsize := vd.ms.dsize;
882 n := vd.ms.get(vd.p, buf := array[dsize] of byte);887 n := vd.ms.get(vd.p, buf := array[dsize] of byte);
883 if(n <= 0)888 if(n <= 0)
884 return (n, nil);889 return (n, nil);
885say(sprint("vacdir.readdir: have buf, length=%d e.size=%bd", n, vd.ms.e.size));890say(sprint("vdreaddir: have buf, length=%d e.size=%bd", n, vd.ms.e.size));
886 mb := Metablock.unpack(buf);891 mb := Metablock.unpack(buf);
887 if(mb == nil)892 if(mb == nil)
888 return (-1, nil);893 return (-1, nil);
889 de := readdirentry(buf, vd.i);894 de := readdirentry(buf, vd.i, allowroot);
890 if(de == nil)895 if(de == nil)
891 return (-1, nil);896 return (-1, nil);
892 vd.i++;897 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
894 vd.p++;899 vd.p++;
895 vd.i = 0;900 vd.i = 0;
896 }901 }
897say("vacdir.readdir: have entry");902say("vdreaddir: have entry");
898 return (1, de);903 return (1, de);
899}904}
900 905
906Vacdir.readdir(vd: self ref Vacdir): (int, ref Direntry)
907{
908 return vdreaddir(vd, 0);
909}
910
911
901Vacdir.rewind(vd: self ref Vacdir)912Vacdir.rewind(vd: self ref Vacdir)
902{913{
903 vd.p = big 0;914 vd.p = big 0;
@@ -944,8 +955,8 @@ vdroot(session: ref Session, score: Venti->Score): (ref Vacdir, ref Direntry, st · 40 unmodified lines
944 }955 }
945 say("top entries unpacked");956 say("top entries unpacked");
946 957
947 mroot := Vacdir.new(session, nil, e[2]);958 mroot := Vacdir.mk(nil, Source.new(session, e[2]));
948 (ok, de) := mroot.readdir();959 (ok, de) := vdreaddir(mroot, 1);
949 if(ok <= 0)960 if(ok <= 0)
950 return (nil, nil, sprint("reading root meta entry: %r"));961 return (nil, nil, sprint("reading root meta entry: %r"));
951 962
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
152 Source: adt {152 Source: adt {
153 session: ref Venti->Session;153 session: ref Venti->Session;
154 e: ref Entry;154 e: ref Entry;
155 dsize: int; # real dsize
155 156
156 new: fn(s: ref Venti->Session, e: ref Entry): ref Source;157 new: fn(s: ref Venti->Session, e: ref Entry): ref Source;
157 get: fn(s: self ref Source, i: big, d: array of byte): int;158 get: fn(s: self ref Source, i: big, d: array of byte): int;