@@ -83,24 +83,23 @@ let datagram_handler = Eio_unix.Pi.datagram_handler (module Datagram_socket)
8383let datagram_socket fd =
8484 Eio.Resource. T (fd, datagram_handler)
8585
86- (* https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml *)
8786let 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