structure Exim :> EXIM = struct
+open Ast
+
+val dl = ErrorMsg.dummyLoc
+
+val _ = Defaults.registerDefault ("MailNodes",
+ (TList (TBase "node", dl), dl),
+ (fn () => (EList (map (fn s => (EString s, dl)) Config.Exim.aliasTo), dl)))
+
val aliasesChanged = ref false
val aliasesDefaultChanged = ref false
+val hostsChanged = ref false
val () = Slave.registerPreHandler
(fn () => (aliasesChanged := false;
- aliasesDefaultChanged := false))
+ aliasesDefaultChanged := false;
+ hostsChanged := false))
val () = Slave.registerFileHandler (fn fs =>
let
aliasesChanged := true
else if #file spl = "aliases.default" then
aliasesDefaultChanged := true
+ else if #file spl = "mail" then
+ hostsChanged := true
else
()
end)
Slave.concatTo (fn s => s = "aliases.default") Config.Exim.aliasesDefault
else
();
- if !aliasesChanged orelse !aliasesDefaultChanged then
+ if !hostsChanged then
+ Slave.enumerateTo (fn s => s = "mail") ":" Config.Exim.handleDomains
+ else
+ ();
+ if !aliasesChanged orelse !aliasesDefaultChanged
+ orelse !hostsChanged then
Slave.shellF ([Config.Exim.reload],
fn cl => "Error reloading exim with " ^ cl)
else
()))
+
+val () = Env.actionV_none "handleMail"
+ (fn env =>
+ let
+ val nodes = Env.env (Env.list Env.string) (env, "MailNodes")
+ in
+ app (fn node => TextIO.closeOut
+ (Domain.domainFile {node = node,
+ name = "mail"})) nodes
+ end)
+
end