Skip to content

Commit 681400c

Browse files
authored
Merge pull request #780 from talex5/windows-getaddrinfo
eio_windows: work around problems in Unix.getaddrinfo
2 parents 9b939ab + b41d4d8 commit 681400c

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

lib_eio_windows/net.ml

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -83,24 +83,23 @@ let datagram_handler = Eio_unix.Pi.datagram_handler (module Datagram_socket)
8383
let datagram_socket fd =
8484
Eio.Resource.T (fd, datagram_handler)
8585

86-
(* https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml *)
8786
let getaddrinfo ~service node =
88-
let to_eio_sockaddr_t {Unix.ai_family; ai_addr; ai_socktype; ai_protocol; _ } =
89-
match ai_family, ai_socktype, ai_addr with
90-
| (Unix.PF_INET | PF_INET6),
91-
(Unix.SOCK_STREAM | SOCK_DGRAM),
92-
Unix.ADDR_INET (inet_addr,port) -> (
93-
match ai_protocol with
94-
| 6 -> Some (`Tcp (Eio_unix.Net.Ipaddr.of_unix inet_addr, port))
95-
| 17 -> Some (`Udp (Eio_unix.Net.Ipaddr.of_unix inet_addr, port))
96-
| _ -> None)
97-
| _ -> None
87+
(* OCaml's [Unix.getaddrinfo] on Windows doesn't set [ai_protocol] to
88+
anything useful, so you can't tell which addresses are TCP and which are
89+
UDP. So, do two separate queries. *)
90+
let get ty k =
91+
Unix.getaddrinfo node service [AI_SOCKTYPE ty]
92+
|> List.filter_map (function
93+
| {Unix.ai_addr = ADDR_INET (host, port); _} ->
94+
Some (k (Eio_unix.Net.Ipaddr.of_unix host, port))
95+
| _ -> None
96+
)
9897
in
9998
Err.run (Eio_unix.run_in_systhread ~label:"getaddrinfo") @@ fun () ->
10099
let rec aux () =
101100
try
102-
Unix.getaddrinfo node service []
103-
|> List.filter_map to_eio_sockaddr_t
101+
get SOCK_STREAM (fun x -> `Tcp x) @
102+
get SOCK_DGRAM (fun x -> `Udp x)
104103
with Unix.Unix_error (EINTR, _, _) -> aux ()
105104
in
106105
aux ()

0 commit comments

Comments
 (0)