end
handle ErrorMsg.Error => ()
+fun requestShutdown () =
+ let
+ val (_, bio) = requestBio (fn () => ())
+ in
+ Msg.send (bio, MsgShutdown);
+ case Msg.recv bio of
+ NONE => print "Server closed connection unexpectedly.\n"
+ | SOME m =>
+ case m of
+ MsgOk => print "Shutdown begun.\n"
+ | MsgError s => print ("Shutdown failed: " ^ s ^ "\n")
+ | _ => print "Unexpected server reply.\n";
+ OpenSSL.close bio
+ end
+
fun requestGrant acl =
let
val (user, bio) = requestBio (fn () => ())
| SOME bio =>
let
val user = OpenSSL.peerCN bio
- val () = print ("\nConnection from " ^ user ^ "\n")
+ val () = print ("\nConnection from " ^ user ^ " at " ^ Date.toString (Date.fromTimeUniv (Time.now ())) ^ "\n")
val () = Domain.setUser user
fun doIt f cleanup =
MsgConfig code => doConfig [code]
| MsgMultiConfig codes => doConfig codes
+ | MsgShutdown =>
+ if Acl.query {user = user, class = "priv", value = "shutdown"} then
+ print ("Domtool dispatcher shutting down at " ^ Date.toString (Date.fromTimeUniv (Time.now ())) ^ "\n")
+ else
+ (OpenSSL.close bio
+ handle OpenSSL.OpenSSL _ => ();
+ loop ())
+
| MsgGrant acl =>
doIt (fn () =>
if Acl.query {user = user, class = "priv", value = "all"} then
handle OpenSSL.OpenSSL _ => ();
loop ())
in
+ print ("Domtool dispatcher starting up at " ^ Date.toString (Date.fromTimeUniv (Time.now ())) ^ "\n");
print "Listening for connections....\n";
loop ();
OpenSSL.shutdown sock