Domain alias support for Exim
[hcoop/domtool2.git] / src / plugins / exim.sml
index bb2743a..461fab1 100644 (file)
@@ -31,6 +31,7 @@ val _ = Defaults.registerDefault ("MailNodes",
 val aliasesChanged = ref false
 val aliasesDefaultChanged = ref false
 val hostsChanged = ref false
+val relayHostsChanged = ref false
 
 val () = Slave.registerPreHandler
             (fn () => (aliasesChanged := false;
@@ -47,6 +48,8 @@ val () = Slave.registerFileHandler (fn fs =>
                                               aliasesDefaultChanged := true
                                           else if #file spl = "mail" then
                                               hostsChanged := true
+                                          else if #file spl = "mail.relay" then
+                                              relayHostsChanged := true
                                           else
                                               ()
                                       end)
@@ -65,8 +68,12 @@ val () = Slave.registerPostHandler
                  Slave.enumerateTo (fn s => s = "mail") ":" Config.Exim.handleDomains
              else
                  ();
+             if !relayHostsChanged then
+                 Slave.enumerateTo (fn s => s = "mail.relay") ":" Config.Exim.relayDomains
+             else
+                 ();
              if !aliasesChanged orelse !aliasesDefaultChanged
-                orelse !hostsChanged then
+                orelse !hostsChanged orelse !relayHostsChanged then
                  Slave.shellF ([Config.Exim.reload],
                                fn cl => "Error reloading exim with " ^ cl)
              else
@@ -78,9 +85,19 @@ val () = Env.actionV_none "handleMail"
             let
                 val nodes = Env.env (Env.list Env.string) (env, "MailNodes")
             in
-                app (fn node => TextIO.closeOut
-                                    (Domain.domainFile {node = node,
-                                                        name = "mail"})) nodes
+                app (fn node => #close
+                                    (Domain.domainsFile {node = node,
+                                                         name = "mail"}) ()) nodes
+            end)
+
+val () = Env.actionV_none "relayMail"
+        (fn env =>
+            let
+                val nodes = Env.env (Env.list Env.string) (env, "MailNodes")
+            in
+                app (fn node => #close
+                                    (Domain.domainsFile {node = node,
+                                                         name = "mail.relay"}) ()) nodes
             end)
 
 end