vac.m 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. Vac: module {
  2. PATH: con "/dis/lib/vac.dis";
  3. init: fn();
  4. dflag: int;
  5. # mode bits
  6. Modeperm: con 8r777;
  7. Modesticky,
  8. Modesetuid,
  9. Modesetgid,
  10. Modeappend,
  11. Modeexcl,
  12. Modesymlink,
  13. Modedir,
  14. Modehidden,
  15. Modesystem,
  16. Modearchive,
  17. Modetemp,
  18. Modesnapshot,
  19. Modedev,
  20. Modenamedpipe: con 1<<(9+iota);
  21. Metablocksize: con 12;
  22. Metaentrysize: con 4;
  23. Dsize: con 8*1024;
  24. # DirPlan9, DirNT & DirGen not valid in version >= 9
  25. DirPlan9,
  26. DirNT,
  27. DirQidspace,
  28. DirGen: con 1+iota;
  29. Direntry: adt {
  30. version: int;
  31. elem: string;
  32. entry, gen: int;
  33. mentry, mgen: int;
  34. qid: big;
  35. uid, gid, mid: string;
  36. mtime, mcount, ctime, atime, mode, emode: int;
  37. qidspace: int;
  38. qidoff: big;
  39. qidmax: big;
  40. new: fn(): ref Direntry;
  41. mk: fn(d: Sys->Dir): ref Direntry;
  42. mkdir: fn(de: self ref Direntry): ref Sys->Dir;
  43. pack: fn(de: self ref Direntry): array of byte;
  44. unpack: fn(d: array of byte): ref Direntry;
  45. };
  46. Metablock: adt {
  47. size, free, maxindex, nindex: int;
  48. new: fn(): ref Metablock;
  49. pack: fn(mb: self ref Metablock, d: array of byte);
  50. unpack: fn(d: array of byte): ref Metablock;
  51. };
  52. Metaentry: adt {
  53. offset, size: int;
  54. pack: fn(me: self ref Metaentry, d: array of byte);
  55. unpack: fn(d: array of byte, i: int): ref Metaentry;
  56. };
  57. # single block
  58. Page: adt {
  59. d: array of byte;
  60. o: int;
  61. new: fn(dsize: int): ref Page;
  62. add: fn(p: self ref Page, s: Venti->Score);
  63. full: fn(p: self ref Page): int;
  64. data: fn(p: self ref Page): array of byte;
  65. };
  66. # hash tree file
  67. File: adt {
  68. p: array of ref Page;
  69. dtype, dsize: int;
  70. size: big;
  71. s: ref Venti->Session;
  72. new: fn(s: ref Venti->Session, dtype, dsize: int): ref File;
  73. write: fn(f: self ref File, d: array of byte): int;
  74. finish: fn(f: self ref File): ref Venti->Entry;
  75. };
  76. # for writing venti directories
  77. Sink: adt {
  78. f: ref File;
  79. d: array of byte;
  80. nd, ne: int;
  81. new: fn(s: ref Venti->Session, dsize: int): ref Sink;
  82. add: fn(m: self ref Sink, e: ref Venti->Entry): int;
  83. finish: fn(m: self ref Sink): ref Venti->Entry;
  84. };
  85. Mentry: adt {
  86. elem: string;
  87. me: ref Metaentry;
  88. cmp: fn(a, b: ref Mentry): int;
  89. };
  90. # for writing directory entries (meta blocks, meta entries, direntries)
  91. MSink: adt {
  92. f: ref File;
  93. de: array of byte;
  94. nde: int;
  95. l: list of ref Mentry;
  96. new: fn(s: ref Venti->Session, dsize: int): ref MSink;
  97. add: fn(m: self ref MSink, de: ref Direntry): int;
  98. finish: fn(m: self ref MSink): ref Venti->Entry;
  99. };
  100. # for reading pages from a hash tree referenced by an entry
  101. Source: adt {
  102. session: ref Venti->Session;
  103. e: ref Venti->Entry;
  104. dsize: int; # real dsize
  105. new: fn(s: ref Venti->Session, e: ref Venti->Entry): ref Source;
  106. get: fn(s: self ref Source, i: big, d: array of byte): int;
  107. };
  108. # for reading from a hash tree while keeping offset
  109. Vacfile: adt {
  110. s: ref Source;
  111. o: big;
  112. mk: fn(s: ref Source): ref Vacfile;
  113. new: fn(session: ref Venti->Session, e: ref Venti->Entry): ref Vacfile;
  114. read: fn(v: self ref Vacfile, d: array of byte, n: int): int;
  115. seek: fn(v: self ref Vacfile, offset: big): big;
  116. pread: fn(v: self ref Vacfile, d: array of byte, n: int, offset: big): int;
  117. };
  118. # for listing contents of a vac directory and walking to path elements
  119. Vacdir: adt {
  120. vf: ref Vacfile;
  121. ms: ref Source;
  122. p: big;
  123. i: int;
  124. mk: fn(vf: ref Vacfile, ms: ref Source): ref Vacdir;
  125. new: fn(session: ref Venti->Session, e, me: ref Venti->Entry): ref Vacdir;
  126. walk: fn(v: self ref Vacdir, elem: string): ref Direntry;
  127. open: fn(v: self ref Vacdir, de: ref Direntry): (ref Venti->Entry, ref Venti->Entry);
  128. readdir: fn(v: self ref Vacdir): (int, ref Direntry);
  129. rewind: fn(v: self ref Vacdir);
  130. };
  131. vdroot: fn(session: ref Venti->Session, score: Venti->Score): (ref Vacdir, ref Direntry, string);
  132. };