diff --git a/client.ml b/client.ml new file mode 100644 index 0000000..2725fac --- /dev/null +++ b/client.ml @@ -0,0 +1,58 @@ +let ibuf_max = 4096 +let max_outq = 50 +let max_unsent = 4096 + +type client = {outq: Queue.t; + unsent: string ref; + ibuf: String; + ibuf_len: int ref; + out_ready: unit -> unit} + + +let new_client g fd = + let cli = {outq = Queue.create (); + unsent = ref ""; + ibuf = String.create ibuf_max; + ibuf_len = ref 0; + out_ready = fun () -> + Unixqueue.add_resource g (Unixqueue.Wait_out fd, -.1.0)} + in + Unixqueue.add_resource g (Unixqueue.Wait_in fd, -.1.0); + Unixqueue.add_handler g (handle_client_event cli); + cli + + +let handle_client_event cli ues esys e = + match e with + | Input_arrived (g, fd) -> + let size = ibuf_max - !cli.ibuf_len in + let len = Unix.read fd cli.ibuf !cli.ibuf_len size in + if (len > 0) then + begin + cli.ibuf_len := !cli.ibuf_len + len; + try + split_client_input cli ues + with Not_found -> + if (!cli.ibuf_len = ibuf_max) then + (* No newline found, and the buffer is full *) + raise Buffer_overrun; + end + else + begin + + handle_close (); + Unix.close fd; + ues#clear g; + end + | Output_readiness (g, fd) -> + print_endline "Output ready" + | Out_of_band (g, fd) -> + print_endline "Amy is hotttt" + | Timeout (g, op) -> + print_endline "Timeout!!!1!!1 ZOMG!" + | Signal -> + print_endline "Signal" + | Extra exn -> + print_endline "Extra" + +