@@ -48,6 +48,54 @@ class virtual t = object
48
48
method getnameinfo = getnameinfo
49
49
end
50
50
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
+
51
99
[@@@ alert " -unstable" ]
52
100
53
101
type _ Effect.t + =
0 commit comments