fun parsePorts ports =
List.mapPartial Int.fromString (String.fields (fn ch => ch = #",") ports)
(* Just drop bad ports for now *)
-
+
+ fun parseNodes nodes = String.fields (fn ch => ch = #",") nodes
+
fun loop parsedRules =
case TextIO.inputLine inf of
NONE => parsedRules
| SOME line =>
case String.tokens Char.isSpace line of
- node :: uname :: rest =>
- (case rest of
- "Client" :: ports :: hosts => loop ((User uname, FirewallNode node, Client (parsePorts ports, hosts)) :: parsedRules)
- | "Server" :: ports :: hosts => loop ((User uname, FirewallNode node, Server (parsePorts ports, hosts)) :: parsedRules)
- | ["ProxiedServer", ports] => loop ((User uname, FirewallNode node, ProxiedServer (parsePorts ports)) :: parsedRules)
- | ["LocalServer", ports] => loop ((User uname, FirewallNode node, LocalServer (parsePorts ports)) :: parsedRules)
- | _ => (print "Invalid config line\n"; loop parsedRules))
+ nodes :: uname :: rest =>
+ let
+ val nodes = parseNodes nodes
+ in
+ case rest of
+ "Client" :: ports :: hosts => loop (map (fn node => (User uname, FirewallNode node, Client (parsePorts ports, hosts))) nodes) @ parsedRules
+ | "Server" :: ports :: hosts => loop (map (fn node => (User uname, FirewallNode node, Server (parsePorts ports, hosts))) nodes) @ parsedRules
+ | ["ProxiedServer", ports] => loop (map (fn node => (User uname, FirewallNode node, ProxiedServer (parsePorts ports))) nodes) @ parsedRules
+ | ["LocalServer", ports] => loop (map (fn node => (User uname, FirewallNode node, LocalServer (parsePorts ports))) nodes) @ parsedRules
+ | _ => (print "Invalid config line\n"; loop parsedRules)
+ end
| _ => loop parsedRules
in
loop []