Fix file paths for recursive rmdom
[hcoop/domtool2.git] / src / domain.sml
index 9913dfc..ca2f993 100644 (file)
@@ -97,6 +97,8 @@ fun yourDomainHost s =
                                (Substring.slice (suf, 1, NONE)))
     end
 
+val yourDomain = yourDomainHost
+
 fun validUser s = size s > 0 andalso size s < 20
                  andalso CharVector.all Char.isAlphaNum s
 
@@ -662,20 +664,35 @@ fun rmdom dom =
                                                 file = node}
                val dname = OS.Path.concat (dname, domPath)
 
-               val dir = Posix.FileSys.opendir dname
-
-               fun loop actions =
-                   case Posix.FileSys.readdir dir of
-                       NONE => actions
-                     | SOME fname => loop ({action = Slave.Delete,
-                                            domain = dom,
-                                            dir = dname,
-                                            file = OS.Path.joinDirFile {dir = dname,
-                                                                        file = fname}} :: actions)
-
-               val actions = loop []
+               fun visitDom (dom, dname, actions) =
+                   let
+                       val dir = Posix.FileSys.opendir dname
+
+                       fun loop actions =
+                           case Posix.FileSys.readdir dir of
+                               NONE => actions
+                             | SOME fname =>
+                               let
+                                   val fnameFull = OS.Path.joinDirFile {dir = dname,
+                                                                        file = fname}
+                               in
+                                   if Posix.FileSys.ST.isDir (Posix.FileSys.stat fnameFull) then
+                                       loop (visitDom (fname ^ "." ^ dom,
+                                                       fnameFull,
+                                                       actions))
+                                   else                                                        
+                                       loop ({action = Slave.Delete,
+                                              domain = dom,
+                                              dir = dname,
+                                              file = fnameFull} :: actions)
+                               end
+                   in
+                       loop actions
+                       before Posix.FileSys.closedir dir
+                   end
+
+               val actions = visitDom (dom, dname, [])
            in
-               Posix.FileSys.closedir dir;
                handleSite (node, actions)
            end
                handle IO.Io _ => print ("Warning: IO error deleting domain " ^ dom ^ " on " ^ node ^ ".\n")