X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/d612d62cd04b713bb1057fd2e666365704aaf3d6..aa56e112996b3650e8ac343831322d2a9ab0de54:/src/main.sml diff --git a/src/main.sml b/src/main.sml index 415d9c2..e0beaf2 100644 --- a/src/main.sml +++ b/src/main.sml @@ -22,24 +22,18 @@ structure Main :> MAIN = struct open Ast Print -val dmy = ErrorMsg.dummyLoc - -val tInit = (TAction ((CRoot, dmy), - StringMap.empty, - StringMap.empty), - dmy) - +structure SM = StringMap +fun init () = Acl.read Config.aclFile fun check' G fname = let - (*val _ = print ("Check " ^ fname ^ "\n")*) val prog = Parse.parse fname in if !ErrorMsg.anyErrors then G else - Tycheck.checkFile G tInit prog + Tycheck.checkFile G (Defaults.tInit ()) prog end fun basis () = @@ -61,12 +55,16 @@ fun basis () = val files = loop [] val files = Order.order files in - foldl (fn (fname, G) => check' G fname) Env.empty files + if !ErrorMsg.anyErrors then + Env.empty + else + foldl (fn (fname, G) => check' G fname) Env.empty files end fun check fname = let val _ = ErrorMsg.reset () + val _ = Env.preTycheck () val b = basis () in @@ -74,13 +72,14 @@ fun check fname = (b, NONE) else let + val _ = ErrorMsg.reset () val prog = Parse.parse fname in if !ErrorMsg.anyErrors then (Env.empty, NONE) else let - val G' = Tycheck.checkFile b tInit prog + val G' = Tycheck.checkFile b (Defaults.tInit ()) prog in (G', #3 prog) end @@ -114,7 +113,81 @@ fun eval fname = if !ErrorMsg.anyErrors then () else - Eval.exec StringMap.empty body' + Eval.exec (Defaults.eInit ()) body' | NONE => () +val dispatcher = + Config.dispatcher ^ ":" ^ Int.toString Config.dispatcherPort + +fun request fname = + let + val uid = Posix.ProcEnv.getuid () + val user = Posix.SysDB.Passwd.name (Posix.SysDB.getpwuid uid) + + val () = Acl.read Config.aclFile + val () = Domain.setUser user + val _ = check fname + + val context = OpenSSL.context (Config.certDir ^ "/" ^ user ^ ".pem", + Config.keyDir ^ "/" ^ user ^ ".pem", + Config.trustStore) + + val bio = OpenSSL.connect (context, dispatcher) + + val inf = TextIO.openIn fname + + fun loop () = + case TextIO.inputLine inf of + NONE => () + | SOME line => (OpenSSL.writeAll (bio, line); + loop ()) + in + loop (); + TextIO.closeIn inf; + OpenSSL.close bio + end + handle ErrorMsg.Error => () + +fun service () = + let + val () = Acl.read Config.aclFile + + val context = OpenSSL.context (Config.serverCert, + Config.serverKey, + Config.trustStore) + + val sock = OpenSSL.listen (context, Config.dispatcherPort) + + fun loop () = + case OpenSSL.accept sock of + NONE => () + | SOME bio => + let + val user = OpenSSL.peerCN bio + val () = print ("\nConnection from " ^ user ^ "\n") + val () = Domain.setUser user + + val outname = OS.FileSys.tmpName () + val outf = TextIO.openOut outname + + fun loop' () = + case OpenSSL.readOne bio of + NONE => () + | SOME line => (TextIO.output (outf, line); + loop' ()) + in + (loop' (); + TextIO.closeOut outf; + eval outname + handle ErrorMsg.Error => (); + OS.FileSys.remove outname; + OpenSSL.close bio) + handle OpenSSL.OpenSSL _ => (); + loop () + end + in + loop (); + OpenSSL.shutdown sock + end + end