+open Ast
+
+val () = Env.type_one "mailman_node"
+ Env.string
+ (fn node => Apache.webNode node orelse node = Config.Mailman.node)
+
+val dl = ErrorMsg.dummyLoc
+
+val () = Env.registerFunction ("mailman_node",
+ fn [] => SOME (EString Config.Mailman.node, dl)
+ | _ => NONE)
+
+val () = Env.registerFunction ("mailman_node_to_node",
+ fn [e] => SOME e
+ | _ => NONE)
+
+fun mailmanPlace (EApp ((EVar "mailman_place_default", _), (EString node, _)), _) =
+ SOME (node, Domain.nodeIp node)
+ | mailmanPlace (EApp ((EApp ((EVar "mailman_place", _), (EString node, _)), _), (EString ip, _)), _) =
+ SOME (node, ip)
+ | mailmanPlace _ = NONE
+
+val _ = Env.registerFunction ("mailman_place_to_web_node",
+ fn [e] => Option.map (fn (node, _) => (EString node, dl)) (mailmanPlace e)
+ | _ => NONE)
+
+val _ = Env.registerFunction ("mailman_place_to_node",
+ fn [e] => Option.map (fn (node, _) => (EString node, dl)) (mailmanPlace e)
+ | _ => NONE)
+
+val _ = Env.registerFunction ("mailman_place_to_ip",
+ fn [e] => Option.map (fn (_, ip) => (EString ip, dl)) (mailmanPlace e)
+ | _ => NONE)
+