Skip to content

Commit

Permalink
feat(addrinfo): rename addrinfo to getaddrinfo
Browse files Browse the repository at this point in the history
  • Loading branch information
bikallem committed Aug 11, 2022
1 parent 3baf586 commit a31f1b9
Show file tree
Hide file tree
Showing 9 changed files with 43 additions and 51 deletions.
4 changes: 2 additions & 2 deletions lib_eio/mock/eio_mock.mli
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ module Net : sig
on_listen : Eio.Net.listening_socket Handler.t;
on_connect : <Eio.Net.stream_socket; Eio.Flow.close> Handler.t;
on_datagram_socket : <Eio.Net.datagram_socket; Eio.Flow.close> Handler.t;
on_addrinfo : ([`Tcp | `Udp] * Eio.Net.Ipaddr.v4v6) list Handler.t;
on_getaddrinfo : Eio.Net.Sockaddr.t list Handler.t;
>

type listening_socket = <
Expand All @@ -141,7 +141,7 @@ module Net : sig
val on_datagram_socket : t -> <Eio.Net.datagram_socket; Eio.Flow.close; ..> Handler.actions -> unit
(** [on_datagram_socket t actions] configures how to create datagram sockets. *)

val on_addrinfo : t -> ([`Tcp | `Udp] * Eio.Net.Ipaddr.v4v6) list Handler.actions -> unit
val on_getaddrinfo : t -> Eio.Net.Sockaddr.t list Handler.actions -> unit

val listening_socket : string -> listening_socket
(** [listening_socket label] can be configured to provide mock connections. *)
Expand Down
16 changes: 8 additions & 8 deletions lib_eio/mock/net.ml
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@ type t = <
on_listen : Eio.Net.listening_socket Handler.t;
on_connect : <Eio.Net.stream_socket; Eio.Flow.close> Handler.t;
on_datagram_socket : <Eio.Net.datagram_socket; Eio.Flow.close> Handler.t;
on_addrinfo : ([`Tcp | `Udp] * Eio.Net.Ipaddr.v4v6) list Handler.t;
on_getaddrinfo : Eio.Net.Sockaddr.t list Handler.t;
>

let make label =
let on_listen = Handler.make (`Raise (Failure "Mock listen handler not configured")) in
let on_connect = Handler.make (`Raise (Failure "Mock connect handler not configured")) in
let on_datagram_socket = Handler.make (`Raise (Failure "Mock datagram_socket handler not configured")) in
let on_addrinfo = Handler.make (`Raise (Failure "Mock addrinfo handler not configured")) in
let on_getaddrinfo = Handler.make (`Raise (Failure "Mock addrinfo handler not configured")) in
object
inherit Eio.Net.t

method on_listen = on_listen
method on_connect = on_connect
method on_datagram_socket = on_datagram_socket
method on_addrinfo = on_addrinfo
method on_getaddrinfo = on_getaddrinfo

method listen ~reuse_addr:_ ~reuse_port:_ ~backlog:_ ~sw addr =
traceln "%s: listen on %a" label Eio.Net.Sockaddr.pp addr;
Expand All @@ -39,9 +39,9 @@ let make label =
Switch.on_release sw (fun () -> Eio.Flow.close socket);
socket

method addrinfo hostname =
traceln "%s: addrinfo %s" label hostname;
Handler.run on_addrinfo
method getaddrinfo hostname =
traceln "%s: getaddrinfo %s" label hostname;
Handler.run on_getaddrinfo
end

let on_connect (t:t) actions =
Expand All @@ -56,8 +56,8 @@ let on_datagram_socket (t:t) actions =
let as_socket x = (x :> <Eio.Net.datagram_socket; Eio.Flow.close>) in
Handler.seq t#on_datagram_socket (List.map (Action.map as_socket) actions)

let on_addrinfo (t:t) actions =
Handler.seq t#on_addrinfo (List.map (Action.map Fun.id) actions)
let on_getaddrinfo (t:t) actions =
Handler.seq t#on_getaddrinfo (List.map (Action.map Fun.id) actions)

type listening_socket = <
Eio.Net.listening_socket;
Expand Down
4 changes: 2 additions & 2 deletions lib_eio/net.ml
Original file line number Diff line number Diff line change
Expand Up @@ -180,14 +180,14 @@ class virtual t = object
method virtual listen : reuse_addr:bool -> reuse_port:bool -> backlog:int -> sw:Switch.t -> Sockaddr.stream -> listening_socket
method virtual connect : sw:Switch.t -> Sockaddr.stream -> <stream_socket; Flow.close>
method virtual datagram_socket : sw:Switch.t -> Sockaddr.datagram -> <datagram_socket; Flow.close>
method virtual addrinfo : string -> ([`Tcp | `Udp] * Ipaddr.v4v6) list
method virtual getaddrinfo : string -> Sockaddr.t list
end

let listen ?(reuse_addr=false) ?(reuse_port=false) ~backlog ~sw (t:#t) = t#listen ~reuse_addr ~reuse_port ~backlog ~sw
let connect ~sw (t:#t) = t#connect ~sw

let datagram_socket ~sw (t:#t) = t#datagram_socket ~sw

let addrinfo (t:#t) hostname = t#addrinfo hostname
let getaddrinfo (t:#t) hostname = t#getaddrinfo hostname

let close = Flow.close
8 changes: 4 additions & 4 deletions lib_eio/net.mli
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ class virtual t : object
method virtual listen : reuse_addr:bool -> reuse_port:bool -> backlog:int -> sw:Switch.t -> Sockaddr.stream -> listening_socket
method virtual connect : sw:Switch.t -> Sockaddr.stream -> <stream_socket; Flow.close>
method virtual datagram_socket : sw:Switch.t -> Sockaddr.datagram -> <datagram_socket; Flow.close>
method virtual addrinfo : string -> ([`Tcp | `Udp] * Ipaddr.v4v6) list
method virtual getaddrinfo : string -> Sockaddr.t list
end

(** {2 Out-bound Connections} *)
Expand Down Expand Up @@ -174,9 +174,9 @@ val recv : #datagram_socket -> Cstruct.t -> Sockaddr.datagram * int

(** {2 DNS queries} *)

val addrinfo: #t -> string -> ([`Tcp | `Udp] * Ipaddr.v4v6) list
(** [addrinfo t hostname] is (socket_type, IP address list) from a DNS. [hostname] is a domain name of a given
host. *)
val getaddrinfo: #t -> string -> Sockaddr.t list
(** [getaddrinfo host] returns a list of IP addresses for [host]. [host] is either a domain name or
an ipaddress. *)

(** {2 Closing} *)
val close : <close: unit; ..> -> unit
Expand Down
10 changes: 5 additions & 5 deletions lib_eio_linux/eio_linux.ml
Original file line number Diff line number Diff line change
Expand Up @@ -893,15 +893,15 @@ module Low_level = struct
in
Eio_unix.run_in_systhread (fun () -> read_all [] fd)

let addrinfo hostname =
let getaddrinfo hostname =
let convert_addrinfo {Unix.ai_family; ai_addr; ai_socktype; _ } =
match ai_family, ai_socktype, ai_addr with
| (Unix.PF_INET | PF_INET6),
(Unix.SOCK_STREAM | SOCK_DGRAM as socktype),
Unix.ADDR_INET (inet_addr,_) -> (
Unix.ADDR_INET (inet_addr,port) -> (
match socktype with
| Unix.SOCK_STREAM -> Some (`Tcp, Eio_unix.Ipaddr.of_unix inet_addr)
| Unix.SOCK_DGRAM -> Some (`Udp, Eio_unix.Ipaddr.of_unix inet_addr)
| Unix.SOCK_STREAM -> Some (`Tcp (Eio_unix.Ipaddr.of_unix inet_addr, port))
| Unix.SOCK_DGRAM -> Some (`Udp (Eio_unix.Ipaddr.of_unix inet_addr, port))
| _ -> None)
| _ -> None
in
Expand Down Expand Up @@ -1138,7 +1138,7 @@ let net = object
Unix.bind sock_unix addr;
udp_socket sock

method addrinfo = Low_level.addrinfo
method getaddrinfo = Low_level.getaddrinfo
end

type stdenv = <
Expand Down
5 changes: 3 additions & 2 deletions lib_eio_linux/eio_linux.mli
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,8 @@ module Low_level : sig

(** {1 DNS functions} *)

val addrinfo : string -> ([`Tcp | `Udp] * Eio.Net.Ipaddr.v4v6) list
(** [addrinfo hostname] returns a list of IP address for [hostname]. *)
val getaddrinfo : string -> Eio.Net.Sockaddr.t list
(** [getaddrinfo host] returns a list of IP addresses for [host]. [host] is either a domain name or
an ipaddress. *)

end
22 changes: 12 additions & 10 deletions lib_eio_luv/eio_luv.ml
Original file line number Diff line number Diff line change
Expand Up @@ -408,22 +408,24 @@ module Low_level = struct
if Fiber_context.clear_cancel_fn k.fiber then enqueue_thread st k ()
) |> or_raise

let addrinfo hostname =
let getaddrinfo hostname =
let ( let* ) o f = Option.bind o f in
let ( let+ ) o f = Option.map f o in
let convert_addrinfo {Luv.DNS.Addr_info.family; addr; socktype;_ } =
match family, socktype with
| (`INET | `INET6), (`STREAM | `DGRAM as socktype') ->
Luv.Sockaddr.to_string addr
|> Option.map (fun host ->
let st = match socktype' with `STREAM -> `Tcp | `DGRAM -> `Udp in
let ipaddr = Eio_unix.Ipaddr.of_unix (Unix.inet_addr_of_string host) in
(st, ipaddr)
)
| (`INET | `INET6), (`STREAM | `DGRAM as socktype') -> (
let* host = Luv.Sockaddr.to_string addr in
let+ port = Luv.Sockaddr.port addr in
let ipaddr = Unix.inet_addr_of_string host |> Eio_unix.Ipaddr.of_unix in
match socktype' with
| `STREAM -> `Tcp (ipaddr, port)
| `DGRAM -> `Udp (ipaddr, port))
| _ -> None
in
let request = Luv.DNS.Addr_info.Request.make () in
await_with_cancel ~request (fun loop -> Luv.DNS.getaddrinfo ~loop ~request ~node:hostname ())
|> Result.map (List.filter_map convert_addrinfo)
|> or_raise
|> List.filter_map convert_addrinfo

end

Expand Down Expand Up @@ -666,7 +668,7 @@ let net = object
Luv.UDP.bind sock addr |> or_raise;
udp_socket dg_sock

method addrinfo = Low_level.addrinfo
method getaddrinfo = Low_level.getaddrinfo
end

let secure_random =
Expand Down
5 changes: 3 additions & 2 deletions lib_eio_luv/eio_luv.mli
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ module Low_level : sig

(** {DNS functions} *)

val addrinfo : string -> ([`Tcp | `Udp] * Eio.Net.Ipaddr.v4v6) list
(** [addrinfo hostname] returns a list of IP address for [hostname]. *)
val getaddrinfo : string -> Eio.Net.Sockaddr.t list
(** [getaddrinfo host] returns a list of IP addresses for [host]. [host] is either a domain name or
an ipaddress. *)

(** {1 Low-level wrappers for Luv functions} *)

Expand Down
20 changes: 4 additions & 16 deletions tests/network.md
Original file line number Diff line number Diff line change
Expand Up @@ -486,23 +486,11 @@ EPIPE:
- : unit = ()
```

## Addrinfo (Linx and Libuv)
## Addrinfo

```ocaml
# Eio_main.run @@ fun env ->
Eio.Net.addrinfo env#net "localhost";;
- : ([ `Tcp | `Udp ] * Eio.Net.Ipaddr.v4v6) list =
[(`Tcp, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001");
(`Udp, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001");
(`Tcp, "\127\000\000\001"); (`Udp, "\127\000\000\001")]
```

<!-- $MDX set-EIO_BACKEND=luv -->
```ocaml
# Eio_main.run @@ fun env ->
Eio.Net.addrinfo env#net "localhost";;
- : ([ `Tcp | `Udp ] * Eio.Net.Ipaddr.v4v6) list =
[(`Tcp, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001");
(`Udp, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001");
(`Tcp, "\127\000\000\001"); (`Udp, "\127\000\000\001")]
Eio.Net.getaddrinfo env#net "127.0.0.1";;
- : Eio.Net.Sockaddr.t list =
[`Tcp ("\127\000\000\001", 0); `Udp ("\127\000\000\001", 0)]
```

0 comments on commit a31f1b9

Please sign in to comment.