Skip to content

Commit bb047ca

Browse files
committed
Add Net.listening_addr.
1 parent 5e014fc commit bb047ca

File tree

8 files changed

+126
-88
lines changed

8 files changed

+126
-88
lines changed

CHANGES.md

Lines changed: 89 additions & 83 deletions
Large diffs are not rendered by default.

lib_eio/mock/eio_mock.mli

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,11 @@ module Net : sig
132132

133133
val on_getnameinfo : t -> (string * string) Handler.actions -> unit
134134

135-
val listening_socket : string -> listening_socket
136-
(** [listening_socket label] can be configured to provide mock connections. *)
135+
val listening_socket :
136+
?listening_addr:Eio.Net.Sockaddr.stream -> string -> listening_socket
137+
(** [listening_socket label] can be configured to provide mock connections.
138+
139+
If [listening_addr] is not provided, a dummy value will be reported. *)
137140

138141
val on_accept :
139142
listening_socket ->

lib_eio/mock/net.ml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,16 @@ type listening_socket = listening_socket_ty r
9797
module Listening_socket = struct
9898
type t = {
9999
label : string;
100+
listening_addr : Eio.Net.Sockaddr.stream;
100101
on_accept : (Flow.t * Eio.Net.Sockaddr.stream) Handler.t;
101102
}
102103

103104
type tag = [`Generic]
104105

105-
let make label =
106+
let make ?(listening_addr = `Tcp (Eio.Net.Ipaddr.V4.any, 0)) label =
106107
{
107108
label;
109+
listening_addr;
108110
on_accept = Handler.make (`Raise (Failure "Mock accept handler not configured"))
109111
}
110112

@@ -119,6 +121,8 @@ module Listening_socket = struct
119121
let close t =
120122
traceln "%s: closed" t.label
121123

124+
let listening_addr { listening_addr; _ } = listening_addr
125+
122126
type (_, _, _) Eio.Resource.pi += Type : ('t, 't -> t, listening_socket_ty) Eio.Resource.pi
123127
let raw (Eio.Resource.T (t, ops)) = Eio.Resource.get ops Type t
124128
end
@@ -129,8 +133,8 @@ let listening_socket_handler =
129133
H (Listening_socket.Type, Fun.id);
130134
]
131135

132-
let listening_socket label : listening_socket =
133-
Eio.Resource.T (Listening_socket.make label, listening_socket_handler)
136+
let listening_socket ?listening_addr label : listening_socket =
137+
Eio.Resource.T (Listening_socket.make ?listening_addr label, listening_socket_handler)
134138

135139
let on_accept l actions =
136140
let r = Listening_socket.raw l in

lib_eio/net.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ module Pi = struct
218218

219219
val accept : t -> sw:Switch.t -> tag stream_socket_ty r * Sockaddr.stream
220220
val close : t -> unit
221+
val listening_addr : t -> Sockaddr.stream
221222
end
222223

223224
type (_, _, _) Resource.pi +=
@@ -277,6 +278,10 @@ let accept_fork ~sw (t : [> 'a listening_socket_ty] r) ~on_error handle =
277278
)
278279
)
279280

281+
let listening_addr (type tag) (Resource.T (t, ops) : [> tag listening_socket_ty] r) =
282+
let module X = (val (Resource.get ops Pi.Listening_socket)) in
283+
X.listening_addr t
284+
280285
let send (Resource.T (t, ops)) ?dst bufs =
281286
let module X = (val (Resource.get ops Pi.Datagram_socket)) in
282287
X.send t ?dst bufs

lib_eio/net.mli

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ val listen :
167167
168168
The new socket will be closed when [sw] finishes, unless closed manually first.
169169
170+
On platforms that support this, passing port [0] will bind to a random port.
171+
170172
For (non-abstract) Unix domain sockets, the path will be removed afterwards.
171173
172174
@param backlog The number of pending connections that can be queued up (see listen(2)).
@@ -205,6 +207,8 @@ val accept_fork :
205207
[on_error] is not called for {!Cancel.Cancelled} exceptions,
206208
which do not need to be reported. *)
207209

210+
val listening_addr : [> 'tag listening_socket_ty] r -> Sockaddr.stream
211+
208212
(** {2 Running Servers} *)
209213

210214
val run_server :
@@ -327,6 +331,7 @@ module Pi : sig
327331

328332
val accept : t -> sw:Switch.t -> tag stream_socket_ty r * Sockaddr.stream
329333
val close : t -> unit
334+
val listening_addr : t -> Sockaddr.stream
330335
end
331336

332337
val listening_socket :

lib_eio_linux/eio_linux.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,11 @@ module Listening_socket = struct
235235
in
236236
let flow = (flow client :> _ Eio.Net.stream_socket) in
237237
flow, client_addr
238+
239+
let listening_addr fd =
240+
Eio_unix.Fd.use fd
241+
(fun fd -> Eio_unix.Net.sockaddr_of_unix_stream (Unix.getsockname fd))
242+
~if_closed:(fun () -> failwith "listening_addr: socket is closed")
238243
end
239244

240245
let listening_handler = Eio_unix.Pi.listening_socket_handler (module Listening_socket)

lib_eio_posix/net.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ module Listening_socket = struct
3636
in
3737
let flow = (Flow.of_fd client :> _ Eio.Net.stream_socket) in
3838
flow, client_addr
39+
40+
let listening_addr { fd; _ } =
41+
Eio_unix.Fd.use fd
42+
(fun fd -> Eio_unix.Net.sockaddr_of_unix_stream (Unix.getsockname fd))
43+
~if_closed:(fun () -> failwith "listening_addr: socket is closed")
3944
end
4045

4146
let listening_handler = Eio_unix.Pi.listening_socket_handler (module Listening_socket)

lib_eio_windows/net.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ module Listening_socket = struct
3636
in
3737
let flow = (Flow.of_fd client :> _ Eio.Net.stream_socket) in
3838
flow, client_addr
39+
40+
let listening_addr fd =
41+
Eio_unix.Fd.use fd
42+
(fun fd -> Eio_unix.Net.sockaddr_of_unix_stream (Unix.getsockname fd))
43+
~if_closed:(fun () -> failwith "listening_addr: socket is closed")
3944
end
4045

4146
let listening_handler = Eio_unix.Pi.listening_socket_handler (module Listening_socket)

0 commit comments

Comments
 (0)