diff options
| author | Marcos Magueta <maguetamarcos@gmail.com> | 2026-06-23 23:53:26 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-06-23 23:53:26 -0300 |
| commit | c284fcd570342c31bc21169960579a20a763e32e (patch) | |
| tree | ce7485055116d794c55090ad0978e0b3f5ff4c2a /lib/transport.ml | |
| parent | b81586ee4a0543a5f9866586c78dccdd6328934a (diff) | |
| download | Sakura-c284fcd570342c31bc21169960579a20a763e32e.tar.gz Sakura-c284fcd570342c31bc21169960579a20a763e32e.zip | |
Format
Diffstat (limited to '')
| -rw-r--r-- | lib/transport.ml | 47 |
1 files changed, 19 insertions, 28 deletions
diff --git a/lib/transport.ml b/lib/transport.ml index 4ed9743..b40f6c5 100644 --- a/lib/transport.ml +++ b/lib/transport.ml @@ -12,16 +12,13 @@ module type TRANSPORT = sig end module TCP : TRANSPORT = struct - type configuration = { - address_family : Unix.socket_domain; - sockaddr : Unix.sockaddr; - } - + type configuration = {address_family: Unix.socket_domain; sockaddr: Unix.sockaddr} type t = Unix.file_descr type connection = Unix.file_descr module Error = struct open Condition + (* TODO: more structure *) let parse_error msg = condition "parse-error" msg empty end @@ -29,30 +26,26 @@ module TCP : TRANSPORT = struct let sockaddr_of_fields = function | `Inet (addr, port) -> Ok - { - address_family = Unix.PF_INET; - sockaddr = Unix.ADDR_INET (Unix.inet_addr_of_string addr, port); - } - | `Unix path -> - Ok { address_family = Unix.PF_UNIX; sockaddr = Unix.ADDR_UNIX path } + { address_family= Unix.PF_INET; + sockaddr= Unix.ADDR_INET (Unix.inet_addr_of_string addr, port) } + | `Unix path -> Ok {address_family= Unix.PF_UNIX; sockaddr= Unix.ADDR_UNIX path} let parse sexp = let open Sexplib.Sexp in let errorf fmt = Printf.ksprintf (fun s -> Error s) fmt in let rec go addr port path = function | [] -> ( - match (addr, port, path) with - | Some a, Some p, None -> sockaddr_of_fields (`Inet (a, p)) - | None, None, Some s -> sockaddr_of_fields (`Unix s) - | None, None, None -> errorf "transport/tcp: no address fields" - | _ -> - errorf "transport/tcp: use (address + port) or (path), not both") - | List [ Atom "address"; Atom a ] :: rest -> go (Some a) port path rest - | List [ Atom "port"; Atom p ] :: rest -> ( - match int_of_string_opt p with - | Some n -> go addr (Some n) path rest - | None -> errorf "transport/tcp: invalid port: %s" p) - | List [ Atom "path"; Atom p ] :: rest -> go addr port (Some p) rest + match addr, port, path with + | Some a, Some p, None -> sockaddr_of_fields (`Inet (a, p)) + | None, None, Some s -> sockaddr_of_fields (`Unix s) + | None, None, None -> errorf "transport/tcp: no address fields" + | _ -> errorf "transport/tcp: use (address + port) or (path), not both" ) + | List [Atom "address"; Atom a] :: rest -> go (Some a) port path rest + | List [Atom "port"; Atom p] :: rest -> ( + match int_of_string_opt p with + | Some n -> go addr (Some n) path rest + | None -> errorf "transport/tcp: invalid port: %s" p ) + | List [Atom "path"; Atom p] :: rest -> go addr port (Some p) rest | bad :: _ -> errorf "transport/tcp: unexpected: %s" (to_string bad) in match sexp with @@ -60,11 +53,10 @@ module TCP : TRANSPORT = struct | _ -> Error (Error.parse_error "transport/tcp: expected a list of fields") let string_of_sockaddr = function - | Unix.ADDR_INET (host, port) -> - Printf.sprintf "%s:%d" (Unix.string_of_inet_addr host) port + | Unix.ADDR_INET (host, port) -> Printf.sprintf "%s:%d" (Unix.string_of_inet_addr host) port | Unix.ADDR_UNIX path -> path - let create { address_family; sockaddr } = + let create {address_family; sockaddr} = let socket = Unix.socket address_family Unix.SOCK_STREAM 0 in Unix.setsockopt socket Unix.SO_REUSEADDR true; Unix.bind socket sockaddr; @@ -72,8 +64,7 @@ module TCP : TRANSPORT = struct let listen fd = Unix.listen fd 5; - Printf.printf "Listening on %s\n%!" - (string_of_sockaddr (Unix.getsockname fd)) + Printf.printf "Listening on %s\n%!" (string_of_sockaddr (Unix.getsockname fd)) let accept fd = let conn, _ = Unix.accept fd in |
