More verbose system error reporting
authoradamch <adamch>
Tue, 11 Sep 2007 10:57:37 +0000 (10:57 +0000)
committeradamch <adamch>
Tue, 11 Sep 2007 10:57:37 +0000 (10:57 +0000)
exn.mlt
init.sig
init.sml

diff --git a/exn.mlt b/exn.mlt
index c36e18a..b28705f 100644 (file)
--- a/exn.mlt
+++ b/exn.mlt
 <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) %>
 <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 => %>
 <% | Init.C.Sql msg => %>
 <b>SQL</b>: <% Web.htmlNl msg %>
 <% | Init.Access msg => %>
index 39fe4ac..5c98e17 100644 (file)
--- a/init.sig
+++ b/init.sig
@@ -54,4 +54,8 @@ signature INIT = sig
     val listNodes : unit -> node list
     val nodeName : int -> string
     val nodeDebian : int -> string
     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
 end
index 4d55c90..22b27f6 100644 (file)
--- a/init.sml
+++ b/init.sml
@@ -203,4 +203,34 @@ fun nodeDebian id =
        [debian] => C.stringFromSql debian
       | row => rowError ("nodeDebian", row)
 
        [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
 end