Skip to content

Commit

Permalink
Add Net.listening_addr.
Browse files Browse the repository at this point in the history
  • Loading branch information
mefyl committed Dec 29, 2023
1 parent 5e014fc commit bb047ca
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 88 deletions.
172 changes: 89 additions & 83 deletions CHANGES.md

Large diffs are not rendered by default.

7 changes: 5 additions & 2 deletions lib_eio/mock/eio_mock.mli
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,11 @@ module Net : sig

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

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

val on_accept :
listening_socket ->
Expand Down
10 changes: 7 additions & 3 deletions lib_eio/mock/net.ml
Original file line number Diff line number Diff line change
Expand Up @@ -97,14 +97,16 @@ type listening_socket = listening_socket_ty r
module Listening_socket = struct
type t = {
label : string;
listening_addr : Eio.Net.Sockaddr.stream;
on_accept : (Flow.t * Eio.Net.Sockaddr.stream) Handler.t;
}

type tag = [`Generic]

let make label =
let make ?(listening_addr = `Tcp (Eio.Net.Ipaddr.V4.any, 0)) label =
{
label;
listening_addr;
on_accept = Handler.make (`Raise (Failure "Mock accept handler not configured"))
}

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

let listening_addr { listening_addr; _ } = listening_addr

type (_, _, _) Eio.Resource.pi += Type : ('t, 't -> t, listening_socket_ty) Eio.Resource.pi
let raw (Eio.Resource.T (t, ops)) = Eio.Resource.get ops Type t
end
Expand All @@ -129,8 +133,8 @@ let listening_socket_handler =
H (Listening_socket.Type, Fun.id);
]

let listening_socket label : listening_socket =
Eio.Resource.T (Listening_socket.make label, listening_socket_handler)
let listening_socket ?listening_addr label : listening_socket =
Eio.Resource.T (Listening_socket.make ?listening_addr label, listening_socket_handler)

let on_accept l actions =
let r = Listening_socket.raw l in
Expand Down
5 changes: 5 additions & 0 deletions lib_eio/net.ml
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,7 @@ module Pi = struct

val accept : t -> sw:Switch.t -> tag stream_socket_ty r * Sockaddr.stream
val close : t -> unit
val listening_addr : t -> Sockaddr.stream
end

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

let listening_addr (type tag) (Resource.T (t, ops) : [> tag listening_socket_ty] r) =
let module X = (val (Resource.get ops Pi.Listening_socket)) in
X.listening_addr t

let send (Resource.T (t, ops)) ?dst bufs =
let module X = (val (Resource.get ops Pi.Datagram_socket)) in
X.send t ?dst bufs
Expand Down
5 changes: 5 additions & 0 deletions lib_eio/net.mli
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,8 @@ val listen :
The new socket will be closed when [sw] finishes, unless closed manually first.
On platforms that support this, passing port [0] will bind to a random port.
For (non-abstract) Unix domain sockets, the path will be removed afterwards.
@param backlog The number of pending connections that can be queued up (see listen(2)).
Expand Down Expand Up @@ -205,6 +207,8 @@ val accept_fork :
[on_error] is not called for {!Cancel.Cancelled} exceptions,
which do not need to be reported. *)

val listening_addr : [> 'tag listening_socket_ty] r -> Sockaddr.stream

(** {2 Running Servers} *)

val run_server :
Expand Down Expand Up @@ -327,6 +331,7 @@ module Pi : sig

val accept : t -> sw:Switch.t -> tag stream_socket_ty r * Sockaddr.stream
val close : t -> unit
val listening_addr : t -> Sockaddr.stream
end

val listening_socket :
Expand Down
5 changes: 5 additions & 0 deletions lib_eio_linux/eio_linux.ml
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,11 @@ module Listening_socket = struct
in
let flow = (flow client :> _ Eio.Net.stream_socket) in
flow, client_addr

let listening_addr fd =
Eio_unix.Fd.use fd
(fun fd -> Eio_unix.Net.sockaddr_of_unix_stream (Unix.getsockname fd))
~if_closed:(fun () -> failwith "listening_addr: socket is closed")
end

let listening_handler = Eio_unix.Pi.listening_socket_handler (module Listening_socket)
Expand Down
5 changes: 5 additions & 0 deletions lib_eio_posix/net.ml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ module Listening_socket = struct
in
let flow = (Flow.of_fd client :> _ Eio.Net.stream_socket) in
flow, client_addr

let listening_addr { fd; _ } =
Eio_unix.Fd.use fd
(fun fd -> Eio_unix.Net.sockaddr_of_unix_stream (Unix.getsockname fd))
~if_closed:(fun () -> failwith "listening_addr: socket is closed")
end

let listening_handler = Eio_unix.Pi.listening_socket_handler (module Listening_socket)
Expand Down
5 changes: 5 additions & 0 deletions lib_eio_windows/net.ml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ module Listening_socket = struct
in
let flow = (Flow.of_fd client :> _ Eio.Net.stream_socket) in
flow, client_addr

let listening_addr fd =
Eio_unix.Fd.use fd
(fun fd -> Eio_unix.Net.sockaddr_of_unix_stream (Unix.getsockname fd))
~if_closed:(fun () -> failwith "listening_addr: socket is closed")
end

let listening_handler = Eio_unix.Pi.listening_socket_handler (module Listening_socket)
Expand Down

0 comments on commit bb047ca

Please sign in to comment.