aboutsummaryrefslogtreecommitdiffstats
path: root/lib/transport.ml
diff options
context:
space:
mode:
authorMarcos Magueta <maguetamarcos@gmail.com>2026-06-23 23:53:26 -0300
committerGitHub <noreply@github.com>2026-06-23 23:53:26 -0300
commitc284fcd570342c31bc21169960579a20a763e32e (patch)
treece7485055116d794c55090ad0978e0b3f5ff4c2a /lib/transport.ml
parentb81586ee4a0543a5f9866586c78dccdd6328934a (diff)
downloadSakura-c284fcd570342c31bc21169960579a20a763e32e.tar.gz
Sakura-c284fcd570342c31bc21169960579a20a763e32e.zip
Format
Diffstat (limited to '')
-rw-r--r--lib/transport.ml47
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