@@ -48,6 +48,54 @@ class virtual t = object
4848 method getnameinfo = getnameinfo
4949end
5050
51+ type socket_int_option =
52+ EIO_TCP_CORK
53+ | EIO_TCP_KEEPCNT
54+ | EIO_TCP_KEEPIDLE
55+ | EIO_TCP_KEEPINTVL
56+
57+ external setsockopt_int : Unix .file_descr -> socket_int_option -> int -> unit =
58+ " eio_unix_setsockopt_int"
59+ external getsockopt_int : Unix .file_descr -> socket_int_option -> int =
60+ " eio_unix_getsockopt_int"
61+
62+ module Sockopt = struct
63+ type _ Eio.Net.Sockopt.t + =
64+ | SO_KEEPALIVE : bool Eio.Net.Sockopt .t
65+ | SO_REUSEADDR : bool Eio.Net.Sockopt .t
66+ | SO_REUSEPORT : bool Eio.Net.Sockopt .t
67+ | TCP_CORK : int Eio.Net.Sockopt .t
68+ | TCP_KEEPCNT : int Eio.Net.Sockopt .t
69+ | TCP_KEEPIDLE : int Eio.Net.Sockopt .t
70+ | TCP_KEEPINTVL : int Eio.Net.Sockopt .t
71+
72+ let set : type a . Fd.t -> a Eio.Net.Sockopt.t -> a -> unit = fun sock k v ->
73+ Fd. use_exn " Sockopt.set" sock @@ fun fd ->
74+ match k with
75+ | TCP_CORK -> setsockopt_int fd EIO_TCP_CORK v
76+ | TCP_KEEPCNT -> setsockopt_int fd EIO_TCP_KEEPCNT v
77+ | TCP_KEEPIDLE -> setsockopt_int fd EIO_TCP_KEEPIDLE v
78+ | TCP_KEEPINTVL -> setsockopt_int fd EIO_TCP_KEEPINTVL v
79+ | SO_KEEPALIVE -> Unix. (setsockopt fd SO_KEEPALIVE v)
80+ | SO_REUSEADDR -> Unix. (setsockopt fd SO_REUSEADDR v)
81+ | SO_REUSEPORT -> Unix. (setsockopt fd SO_REUSEPORT v)
82+ | _ -> raise (Invalid_argument " TODO pp value" )
83+
84+ let get_descr : type a . Unix.file_descr -> a Eio.Net.Sockopt.t -> a = fun fd k ->
85+ match k with
86+ | TCP_CORK -> getsockopt_int fd EIO_TCP_CORK
87+ | TCP_KEEPCNT -> getsockopt_int fd EIO_TCP_KEEPCNT
88+ | TCP_KEEPIDLE -> getsockopt_int fd EIO_TCP_KEEPIDLE
89+ | TCP_KEEPINTVL -> getsockopt_int fd EIO_TCP_KEEPINTVL
90+ | SO_KEEPALIVE -> Unix. (getsockopt fd SO_KEEPALIVE )
91+ | SO_REUSEADDR -> Unix. (getsockopt fd SO_REUSEADDR )
92+ | SO_REUSEPORT -> Unix. (getsockopt fd SO_REUSEPORT )
93+ | _ -> raise (Invalid_argument " TODO pp value" )
94+
95+ let get : type a . Fd.t -> a Eio.Net.Sockopt.t -> a = fun sock k ->
96+ Fd. use_exn " Sockopt.get" sock (fun fd -> get_descr fd k)
97+ end
98+
5199[@@@ alert " -unstable" ]
52100
53101type _ Effect.t + =
0 commit comments