ref: 2ab7efc23fd2137ce88d328441900e0a439a3508
dir: /appl/lib/mtptmirror.b/
implement MtptMirror;
include "sys.m";
sys: Sys;
include "hash.m";
hash: Hash;
include "nametree.m"
nametree: Nametree;
init()
{
sys = load Sys Sys->PATH;
hash = load Hash Hash->PATH;
nametree = load Nametree Nametree->PATH;
}
new(mtpts: list of string, lower, upper: big)
{
m: ref MtptMirror;
m.mtpts = mtpts;
m.qidmap = hash->new(HSSZ);
m.lower = lower;
m.upper = upper ;
return m;
}
MtptMirror.refresh(m: self ref MtptMirror): string
{
# find a non-empty mountpoint
mtpt := "";
for(i := 0; i < len m.mtpts; i++) {
fd := sys->open(m.mtpts[i], Sys->OREAD);
if(fd == nil)
continue;
(ec, nil) := sys->dirread(fd);
if(ec > 0) {
mtpt = m.mtpts[i];
break;
}
}
if(mtpt == "")
return Emmnopath;
queue: array of ref Sys->Dir;
visited_nodes: array of string;
qi := 1;
# queue[0] = mtpt;
walkloop:
for(i := 0; i < qi; i++) {
rpath := queue[i];
(content, nil) := readdir->init(rpath, readdir->NAME|readdir->COMPACT);
for(j := 0; j < len content; j++) {
# if(rpath == "nodes")
queue[qi] = content[j];
qi++;
}
}
}
MtptMirror.get_path(m: self ref MtptMirror, path: string): big
{
v := m.qidmap.find(path);
if(v == nil)
return -1;
return v.i;
}
# mountpoint serving functions
mtpt_walk(tree: Tree, mtpt: string, Cnode, Mnodes: int): int
{
}