Skip to content

Commit 92a06fe

Browse files
committed
use extensible types and move to Eio_unix.Net
1 parent 68cea67 commit 92a06fe

File tree

13 files changed

+126
-73
lines changed

13 files changed

+126
-73
lines changed

lib_eio/mock/eio_mock.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ module Flow : sig
9696
on_copy_bytes : int Handler.t;
9797
set_copy_method : copy_method -> unit;
9898
attach_to_switch : Eio.Switch.t -> unit;
99+
getsockopt : 'a . 'a Eio.Net.Sockopt.t -> 'a;
100+
setsockopt : 'a . 'a Eio.Net.Sockopt.t -> 'a -> unit;
99101
>
100102

101103
val make : ?pp:string Fmt.t -> string -> t

lib_eio/mock/flow.ml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ type t = <
1212
on_copy_bytes : int Handler.t;
1313
set_copy_method : copy_method -> unit;
1414
attach_to_switch : Switch.t -> unit;
15+
getsockopt : 'a . 'a Eio.Net.Sockopt.t -> 'a;
16+
setsockopt : 'a . 'a Eio.Net.Sockopt.t -> 'a -> unit;
1517
>
1618

1719
let pp_default f s =
@@ -34,6 +36,7 @@ let rec takev len = function
3436
| x :: _ when Cstruct.length x >= len -> [Cstruct.sub x 0 len]
3537
| x :: xs -> x :: takev (len - Cstruct.length x) xs
3638

39+
3740
let make ?(pp=pp_default) label =
3841
let on_read = Handler.make (`Raise End_of_file) in
3942
let on_copy_bytes = Handler.make (`Return 4096) in
@@ -108,6 +111,12 @@ let make ?(pp=pp_default) label =
108111
Queue.take on_close ()
109112
done;
110113
traceln "%s: closed" label
114+
115+
method getsockopt : 'a . 'a Eio.Net.Sockopt.t -> 'a = fun _ ->
116+
failwith label
117+
118+
method setsockopt : 'a . 'a Eio.Net.Sockopt.t -> 'a -> unit = fun _ ->
119+
failwith "TODO"
111120
end
112121

113122
let on_read (t:t) = Handler.seq t#on_read

lib_eio/mock/net.ml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ let listening_socket label =
9191

9292
method close =
9393
traceln "%s: closed" label
94+
95+
method getsockopt _opt =
96+
traceln "%s: getsockopt" label;
97+
failwith "TODO"
98+
99+
method setsockopt (_: _ Eio.Net.Sockopt.t) _ =
100+
traceln "%s: setsockopt TODO" label
94101
end
95102

96103
let on_accept (l:listening_socket) actions =

lib_eio/net.ml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,19 @@ module Sockaddr = struct
157157
Format.fprintf f "udp:%a:%d" Ipaddr.pp_for_uri addr port
158158
end
159159

160+
module Sockopt = struct
161+
type _ t = ..
162+
end
163+
160164
class virtual socket = object (_ : <Generic.t; Generic.close; ..>)
161165
method probe _ = None
166+
method virtual setsockopt : 'a . 'a Sockopt.t -> 'a -> unit
167+
method virtual getsockopt : 'a . 'a Sockopt.t -> 'a
162168
end
163169

170+
let setsockopt (s: #socket) opt v = s#setsockopt opt v
171+
let getsockopt (s: #socket) opt = s#getsockopt opt
172+
164173
class virtual stream_socket = object (_ : #socket)
165174
inherit Flow.two_way
166175
end

lib_eio/net.mli

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,17 @@ module Sockaddr : sig
100100
val pp : Format.formatter -> [< t] -> unit
101101
end
102102

103+
(* Socket options. *)
104+
module Sockopt : sig
105+
type _ t = ..
106+
end
107+
103108
(** {2 Provider Interfaces} *)
104109

105110
class virtual socket : object (<Generic.close; ..>)
106111
inherit Generic.t
112+
method virtual setsockopt : 'a . 'a Sockopt.t -> 'a -> unit
113+
method virtual getsockopt : 'a . 'a Sockopt.t -> 'a
107114
end
108115

109116
class virtual stream_socket : object
@@ -136,6 +143,16 @@ class virtual t : object
136143
method virtual getnameinfo : Sockaddr.t -> (string * string)
137144
end
138145

146+
(** {2 Socket options} *)
147+
148+
val setsockopt : #socket -> 'a Sockopt.t -> 'a -> unit
149+
(** [setsockopt s opt v] sets the [opt] option to value [v] on socket [s].
150+
See {!Eio_unix.Net.Sockopt} for common Unix socket options. *)
151+
152+
val getsockopt : #socket -> 'a Sockopt.t -> 'a
153+
(** [getsockopt s opt] retrieves the [opt] option on socket [fd].
154+
See {!Eio_unix.Net.Sockopt} for common Unix socket options. *)
155+
139156
(** {2 Out-bound Connections} *)
140157

141158
val connect : sw:Switch.t -> #t -> Sockaddr.stream -> stream_socket

lib_eio/unix/eio_unix.ml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
module Fd = Fd
44
module Resource = Resource
55
module Private = Private
6-
module Sockopt = Sockopt
76

87
include Types
98
type socket = Net.stream_socket

lib_eio/unix/eio_unix.mli

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,20 +84,6 @@ module Stdenv : sig
8484
You can use the functions in {!Eio.Stdenv} to access these fields if you prefer. *)
8585
end
8686

87-
module Sockopt : sig
88-
type 'a t = 'a Eio_unix__Sockopt.t =
89-
| SO_KEEPALIVE : bool t
90-
| SO_REUSEADDR : bool t
91-
| SO_REUSEPORT : bool t
92-
| TCP_CORK : int t
93-
| TCP_KEEPCNT : int t
94-
| TCP_KEEPIDLE : int t
95-
| TCP_KEEPINTVL : int t
96-
97-
val set : Fd.t -> 'a t -> 'a -> unit
98-
val get : Fd.t -> 'a t -> 'a
99-
end
100-
10187
(** API for Eio backends only. *)
10288
module Private : sig
10389
type _ Effect.t +=

lib_eio/unix/net.ml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,54 @@ class virtual t = object
4848
method getnameinfo = getnameinfo
4949
end
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

53101
type _ Effect.t +=

lib_eio/unix/net.mli

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,25 @@ val socketpair_datagram :
7676
This creates OS-level resources using [socketpair(2)].
7777
Note that, like all FDs created by Eio, they are both marked as close-on-exec by default. *)
7878

79+
module Sockopt : sig
80+
(** Socket options *)
81+
82+
type _ Eio.Net.Sockopt.t +=
83+
SO_KEEPALIVE : bool Eio.Net.Sockopt.t
84+
| SO_REUSEADDR : bool Eio.Net.Sockopt.t
85+
| SO_REUSEPORT : bool Eio.Net.Sockopt.t
86+
| TCP_CORK : int Eio.Net.Sockopt.t (* TODO These are Linux-only; move to Eio_linux.Net? *)
87+
| TCP_KEEPCNT : int Eio.Net.Sockopt.t
88+
| TCP_KEEPIDLE : int Eio.Net.Sockopt.t
89+
| TCP_KEEPINTVL : int Eio.Net.Sockopt.t
90+
91+
val set : Fd.t -> 'a Eio.Net.Sockopt.t -> 'a -> unit
92+
(** [set fd opt v] sets the [opt] option to value [v] on socket [fd]. *)
93+
94+
val get : Fd.t -> 'a Eio.Net.Sockopt.t -> 'a
95+
(** [get fd opt v] retrieves the [opt] option on socket [fd]. *)
96+
end
97+
7998
(** {2 Private API for backends} *)
8099

81100
val getnameinfo : Eio.Net.Sockaddr.t -> (string * string)

lib_eio/unix/sockopt.ml

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)