summaryrefslogtreecommitdiff
path: root/module/vac.m
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2007-06-14 14:10:50 +0000
committerCharles.Forsyth <devnull@localhost>2007-06-14 14:10:50 +0000
commit150ed664169adc7de05ac8c4fdcf87a0987bc372 (patch)
tree0aff34048f1f67f6e45c9ae0374abbba7f3543fe /module/vac.m
parent36d90ed95f4c8a9bd69f7c664696a5986cbafcc7 (diff)
20070614-1508 initial vac things, man/lib
Diffstat (limited to 'module/vac.m')
-rw-r--r--module/vac.m188
1 files changed, 188 insertions, 0 deletions
diff --git a/module/vac.m b/module/vac.m
new file mode 100644
index 00000000..fd6be340
--- /dev/null
+++ b/module/vac.m
@@ -0,0 +1,188 @@
+Vac: module {
+ PATH: con "/dis/lib/vac.dis";
+ init: fn();
+
+ dflag: int;
+
+ # taken from venti.m, merge back later
+ # some of this needs to be removed from venti.m since it does not belong there
+
+ # mode bits
+ Modeperm: con 8r777;
+ Modesticky,
+ Modesetuid,
+ Modesetgid,
+ Modeappend,
+ Modeexcl,
+ Modesymlink,
+ Modedir,
+ Modehidden,
+ Modesystem,
+ Modearchive,
+ Modetemp,
+ Modesnapshot,
+ Modedev,
+ Modenamedpipe: con 1<<(9+iota);
+
+ Entrysize: con 40;
+ Rootsize: con 300;
+ Metablocksize: con 12;
+ Metaentrysize: con 4;
+
+ Dsize: con 8*1024;
+
+ Entryactive: con (1<<0); # entry is in use
+ Entrydir: con (1<<1); # a directory
+ Entrydepthshift: con 2; # shift for pointer depth
+ Entrydepthmask: con (16r7<<2); # mask for pointer depth
+ Entrylocal: con (1<<5); # used for local storage: should not be set for venti blocks
+
+ Root: adt {
+ version: int;
+ name: string;
+ rtype: string;
+ score: Venti->Score; # to a Dir block
+ blocksize: int; # maximum block size
+ prev: ref Venti->Score; # last root block
+
+ new: fn(name, rtype: string, score: Venti->Score, blocksize: int, prev: ref Venti->Score): ref Root;
+ unpack: fn(d: array of byte): ref Root;
+ pack: fn(r: self ref Root): array of byte;
+ };
+
+ Entry: adt {
+ gen: int; # generation number (XXX should be unsigned)
+ psize: int; # pointer block size
+ dsize: int; # data block size
+ depth: int; # unpacked from flags
+ flags: int;
+ size: big; # (XXX should be unsigned)
+ score: Venti->Score;
+
+ new: fn(psize, dsize, flags: int, size: big, score: Venti->Score): ref Entry;
+ pack: fn(e: self ref Entry): array of byte;
+ unpack: fn(d: array of byte): ref Entry;
+ };
+
+ Direntry: adt {
+ version: int;
+ elem: string;
+ entry, gen: int;
+ mentry, mgen: int;
+ qid: big;
+ uid, gid, mid: string;
+ mtime, mcount, ctime, atime, mode, emode: int;
+
+ new: fn(): ref Direntry;
+ mk: fn(d: Sys->Dir): ref Direntry;
+ mkdir: fn(de: self ref Direntry): ref Sys->Dir;
+ pack: fn(de: self ref Direntry): array of byte;
+ unpack: fn(d: array of byte): ref Direntry;
+ };
+
+ Metablock: adt {
+ size, free, maxindex, nindex: int;
+
+ new: fn(): ref Metablock;
+ pack: fn(mb: self ref Metablock, d: array of byte);
+ unpack: fn(d: array of byte): ref Metablock;
+ };
+
+ Metaentry: adt {
+ offset, size: int;
+
+ pack: fn(me: self ref Metaentry, d: array of byte);
+ unpack: fn(d: array of byte, i: int): ref Metaentry;
+ };
+
+ # single block
+ Page: adt {
+ d: array of byte;
+ o: int;
+
+ new: fn(dsize: int): ref Page;
+ add: fn(p: self ref Page, s: Venti->Score);
+ full: fn(p: self ref Page): int;
+ data: fn(p: self ref Page): array of byte;
+ };
+
+ # hash tree file
+ File: adt {
+ p: array of ref Page;
+ dtype, dsize: int;
+ size: big;
+ s: ref Venti->Session;
+
+ new: fn(s: ref Venti->Session, dtype, dsize: int): ref File;
+ write: fn(f: self ref File, d: array of byte): int;
+ finish: fn(f: self ref File): ref Entry;
+ };
+
+ # for writing venti directories
+ Sink: adt {
+ f: ref File;
+ d: array of byte;
+ nd, ne: int;
+
+ new: fn(s: ref Venti->Session, dsize: int): ref Sink;
+ add: fn(m: self ref Sink, e: ref Entry): int;
+ finish: fn(m: self ref Sink): ref Entry;
+ };
+
+ Mentry: adt {
+ elem: string;
+ me: ref Metaentry;
+
+ cmp: fn(a, b: ref Mentry): int;
+ };
+
+ # for writing directory entries (meta blocks, meta entries, direntries)
+ MSink: adt {
+ f: ref File;
+ de: array of byte;
+ nde: int;
+ l: list of ref Mentry;
+
+ new: fn(s: ref Venti->Session, dsize: int): ref MSink;
+ add: fn(m: self ref MSink, de: ref Direntry): int;
+ finish: fn(m: self ref MSink): ref Entry;
+ };
+
+ # for reading pages from a hash tree referenced by an entry
+ Source: adt {
+ session: ref Venti->Session;
+ e: ref Entry;
+
+ new: fn(s: ref Venti->Session, e: ref Entry): ref Source;
+ get: fn(s: self ref Source, i: big, d: array of byte): int;
+ };
+
+ # for reading from a hash tree while keeping offset
+ Vacfile: adt {
+ s: ref Source;
+ o: big;
+
+ mk: fn(s: ref Source): ref Vacfile;
+ new: fn(session: ref Venti->Session, e: ref Entry): ref Vacfile;
+ read: fn(v: self ref Vacfile, d: array of byte, n: int): int;
+ seek: fn(v: self ref Vacfile, offset: big): big;
+ pread: fn(v: self ref Vacfile, d: array of byte, n: int, offset: big): int;
+ };
+
+ # for listing contents of a vac directory and walking to path elements
+ Vacdir: adt {
+ vf: ref Vacfile;
+ ms: ref Source;
+ p: big;
+ i: int;
+
+ mk: fn(vf: ref Vacfile, ms: ref Source): ref Vacdir;
+ new: fn(session: ref Venti->Session, e, me: ref Entry): ref Vacdir;
+ walk: fn(v: self ref Vacdir, elem: string): ref Direntry;
+ open: fn(v: self ref Vacdir, de: ref Direntry): (ref Entry, ref Entry);
+ readdir: fn(v: self ref Vacdir): (int, ref Direntry);
+ rewind: fn(v: self ref Vacdir);
+ };
+
+ vdroot: fn(session: ref Venti->Session, score: Venti->Score): (ref Vacdir, ref Direntry, string);
+};