<b>System error</b>: <% Web.html name %>
<% | OS.SysErr (name, SOME syserr) => %>
<b>System error</b>: <% Web.html name %>: <% Web.html (OS.errorName syserr) %>: <% Web.htmlNl (OS.errorMsg syserr) %>
-<% | IO.Io {name, function, ...} => %>
-<b>IO error</b>: <% Web.html name %> for <% Web.html function %>
+<% | IO.Io {name, function, cause, ...} => %>
+<b>IO error</b>: <% Web.html name %> for <% Web.html function %><br>
+<b>Cause</b>: <% Web.html (Init.explain cause) %><br>
+<b>Tokens</b>: <p><% Web.htmlNl (Init.tokens ()) %></p>
<% | Init.C.Sql msg => %>
<b>SQL</b>: <% Web.htmlNl msg %>
<% | Init.Access msg => %>
val listNodes : unit -> node list
val nodeName : int -> string
val nodeDebian : int -> string
+
+ val explain : exn -> string
+ val tokens : unit -> string
+ val tokensForked : unit -> unit
end
[debian] => C.stringFromSql debian
| row => rowError ("nodeDebian", row)
+fun explain e =
+ case e of
+ OS.SysErr (name, sop) =>
+ "System error: " ^ name ^
+ (case sop of
+ NONE => ""
+ | SOME syserr => ": " ^ OS.errorName syserr ^ ": " ^ OS.errorMsg syserr)
+ | _ => "Unknown"
+
+fun tokens () =
+ let
+ val proc = Unix.execute ("/usr/bin/tokens", [])
+ val inf = Unix.textInstreamOf proc
+
+ fun reader acc =
+ case TextIO.inputLine inf of
+ NONE => String.concat (rev acc)
+ | SOME s => reader (s :: acc)
+ in
+ reader []
+ before (TextIO.closeIn inf;
+ ignore (Unix.reap proc))
+ end
+
+fun tokensForked () =
+ case Posix.Process.fork () of
+ NONE => (OS.Process.system "/usr/bin/tokens >/tmp/tokens.child";
+ OS.Process.exit OS.Process.success)
+ | _ => ignore (OS.Process.system "/usr/bin/tokens >/tmp/tokens.parent")
+
end