* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*)
+ *)
(* Domain-related primitive actions *)
structure Domain :> DOMAIN = struct
+fun isIdent ch = Char.isLower ch orelse Char.isDigit ch
+
+fun validHost s =
+ size s > 0 andalso size s < 20
+ andalso CharVector.all (fn ch => isIdent ch orelse ch = #"-") s
+
+fun validDomain s =
+ size s > 0 andalso size s < 100
+ andalso List.all validHost (String.fields (fn ch => ch = #".") s)
+
+val _ = Env.type_one "host"
+ Env.string
+ validHost
+
+val _ = Env.type_one "domain"
+ Env.string
+ validDomain
+
open Ast
val befores = ref (fn (_ : string) => ())
end
val current = ref ""
+val currentPath = ref ""
+
+fun currentDomain () = !current
+
+fun domainFile name = TextIO.openOut (!currentPath ^ name)
+
+fun getPath domain =
+ let
+ val toks = String.fields (fn ch => ch = #".") domain
+
+ val elems = foldr (fn (piece, elems) =>
+ let
+ val elems = piece :: elems
+ val path = String.concatWith "/" (Config.configRoot :: rev elems)
+ in
+ (if Posix.FileSys.ST.isDir
+ (Posix.FileSys.stat path) then
+ ()
+ else
+ (OS.FileSys.remove path;
+ OS.FileSys.mkDir path))
+ handle OS.SysErr _ => OS.FileSys.mkDir path;
+ elems
+ end) [] toks
+ in
+ String.concatWith "/" (Config.configRoot :: rev ("" :: elems))
+ end
-val _ = Env.registerContainer ("domain",
- fn (_, [(EString dom, _)]) => (current := dom;
- !befores dom;
- StringMap.empty)
- | _ => Env.badArgs "domain",
- fn () => !afters (!current))
+val _ = Env.container_one "domain"
+ ("domain", Env.string)
+ (fn dom => (current := dom;
+ currentPath := getPath dom;
+ !befores dom),
+ fn () => !afters (!current))
end