+fun findAllDiffs () =
+ let
+ val dir = Posix.FileSys.opendir Config.tmpDir
+ val len = length (String.fields (fn ch => ch = #"/") Config.tmpDir) + 1
+
+ fun exploreSites diffs =
+ case Posix.FileSys.readdir dir of
+ NONE => diffs
+ | SOME site =>
+ let
+ fun explore (dname, diffs) =
+ let
+ val dir = Posix.FileSys.opendir dname
+
+ fun loop diffs =
+ case Posix.FileSys.readdir dir of
+ NONE => diffs
+ | SOME name =>
+ let
+ val fname = OS.Path.joinDirFile {dir = dname,
+ file = name}
+ in
+ loop (if Posix.FileSys.ST.isDir (Posix.FileSys.stat fname) then
+ let
+ val dom = String.fields (fn ch => ch = #"/") fname
+ val dom = List.drop (dom, len)
+ val dom = String.concatWith "." (rev dom)
+
+ val dname' = OS.Path.joinDirFile {dir = dname,
+ file = name}
+ in
+ explore (dname',
+ findDiffs (site, dom, diffs))
+ end
+ else
+ diffs)
+ end
+ in
+ loop diffs
+ before Posix.FileSys.closedir dir
+ end
+ in
+ explore (OS.Path.joinDirFile {dir = Config.tmpDir,
+ file = site}, diffs)
+ end
+ in
+ exploreSites []
+ before Posix.FileSys.closedir dir
+ end
+
+val masterNode : string option ref = ref NONE
+fun dnsMaster () = !masterNode
+