Basic client/server thing going on with unencrypted OpenSSL
authorAdam Chlipala <adamc@hcoop.net>
Sat, 2 Sep 2006 19:52:07 +0000 (19:52 +0000)
committerAdam Chlipala <adamc@hcoop.net>
Sat, 2 Sep 2006 19:52:07 +0000 (19:52 +0000)
configDefault/domtool.cfg
configDefault/domtool.cfs
openssl/openssl_sml.c
openssl/openssl_sml.h
src/main.sig
src/main.sml

index 0246f2a..55e6afd 100644 (file)
@@ -23,4 +23,7 @@ val testUser = "adamc"
 
 val defaultDomain = "hcoop.net"
 
-val dispatcher = "localhost:1234"
+val dispatcher = "localhost"
+val dispatcherPort = 1234
+
+val bufSize = 1024
index db536e3..43f9f06 100644 (file)
@@ -33,3 +33,7 @@ val testUser : string
 val defaultDomain : string
 
 val dispatcher : string
+val dispatcherPort : int
+
+val bufSize : int
+
index b35262b..b2fbb89 100644 (file)
@@ -30,6 +30,10 @@ const char *OpenSSL_SML_reason_error_string(int err) {
   return ERR_reason_error_string(err);
 }
 
+int OpenSSL_SML_read(BIO *b, void *data, int len) {
+  return BIO_read(b, data, len);
+}
+
 int OpenSSL_SML_write(BIO *b, const void *data, int len) {
   return BIO_write(b, data, len);
 }
@@ -38,6 +42,10 @@ BIO *OpenSSL_SML_new_connect(char *addr) {
   return BIO_new_connect(addr);
 }
 
+BIO *OpenSSL_SML_new_accept(char *addr) {
+  return BIO_new_accept(addr);
+}
+
 void OpenSSL_SML_free_all(BIO *b) {
   BIO_free_all(b);
 }
@@ -45,3 +53,7 @@ void OpenSSL_SML_free_all(BIO *b) {
 int OpenSSL_SML_do_connect(BIO *b) {
   return BIO_do_connect(b);
 }
+
+int OpenSSL_SML_do_accept(BIO *b) {
+  return BIO_do_accept(b);
+}
index f461c43..5317021 100644 (file)
@@ -5,11 +5,20 @@
 void OpenSSL_SML_add_all_algorithms(void);
 void OpenSSL_SML_load_error_strings(void);
 void OpenSSL_SML_load_BIO_strings(void);
+
 int OpenSSL_SML_get_error(void);
 const char *OpenSSL_SML_lib_error_string(int err);
 const char *OpenSSL_SML_func_error_string(int err);
 const char *OpenSSL_SML_reason_error_string(int err);
+
+int OpenSSL_SML_read(BIO *b, void *data, int len);
 int OpenSSL_SML_write(BIO *b, const void *data, int len);
+
 BIO *OpenSSL_SML_new_connect(char *addr);
-void OpenSSL_SML_free_all(BIO *b);
 int OpenSSL_SML_do_connect(BIO *b);
+
+BIO *OpenSSL_SML_new_accept(char *addr);
+int OpenSSL_SML_do_accept(BIO *b);
+
+void OpenSSL_SML_free_all(BIO *b);
+
index e1d5015..1d084b8 100644 (file)
@@ -32,5 +32,6 @@ signature MAIN = sig
     val eval : string -> unit
 
     val request : string -> unit
+    val serviceOne : unit -> unit
 
 end
index 14eaa4a..bcadb63 100644 (file)
@@ -139,7 +139,11 @@ fun eval fname =
            Eval.exec (SM.map (fn f => f ()) (!defaultV)) body'
       | NONE => ()
 
-val dispatcher : C.rw ZString.zstring' = ZString.dupML' Config.dispatcher
+val dispatcher : C.rw ZString.zstring' =
+    ZString.dupML' (Config.dispatcher ^ ":" ^ Int.toString Config.dispatcherPort)
+
+val listenOn : C.rw ZString.zstring' =
+    ZString.dupML' ("localhost:" ^ Int.toString Config.dispatcherPort)
 
 fun ssl_err s =
     let
@@ -157,6 +161,23 @@ fun ssl_err s =
 
 exception OpenSSL of string
 
+val readBuf : (C.uchar, C.rw) C.obj C.ptr' = C.alloc' C.S.uchar (Word.fromInt Config.bufSize)
+val bufSize = Int32.fromInt Config.bufSize
+
+fun readOne bio =
+    let
+       val r = F_OpenSSL_SML_read.f' (bio, C.Ptr.inject' readBuf, bufSize)
+    in
+       if r = 0 then
+           NONE
+       else if r < 0 then
+           raise OpenSSL "BIO_read failed"
+       else
+           SOME (CharVector.tabulate (Int32.toInt r,
+                                   fn i => chr (Word32.toInt (C.Get.uchar'
+                                                                  (C.Ptr.sub' C.S.uchar (readBuf, i))))))
+    end
+
 fun writeAll (bio, s) =
     let
        val buf = ZString.dupML' s
@@ -203,4 +224,26 @@ fun request fname =
            end
     end
 
+fun serviceOne () =
+    let
+       val bio = F_OpenSSL_SML_new_accept.f' listenOn
+    in
+       if C.Ptr.isNull' bio then
+           (ssl_err "Error initializating listener";
+            F_OpenSSL_SML_free_all.f' bio)
+       else if F_OpenSSL_SML_do_accept.f' bio <= 0 then
+           (ssl_err "Error accepting connection";
+            F_OpenSSL_SML_free_all.f' bio)
+       else let
+               fun loop () =
+                   case readOne bio of
+                       NONE => ()
+                     | SOME line => (print line;
+                                     loop ())
+           in
+               loop ();
+               F_OpenSSL_SML_free_all.f' bio
+           end
+    end
+
 end