@@ -1136,33 +1136,41 @@ module Dns = struct
11361136 let query_one name ty =
11371137 let query = Dnssd.LowLevel. query (Dns.Name. to_string name) ty in
11381138 let socket = Dnssd.LowLevel. socket query in
1139- let t, u = Lwt. task () in
1140- match Uwt.Poll. start socket [ Uwt.Poll. Readable ]
1141- ~cb: (fun _poll events ->
1142- match events with
1143- | Error error ->
1144- Log. err (fun f -> f " Uwt.Poll callback failed with %s" (Uwt. strerror error))
1145- | Ok events ->
1146- List. iter (fun event ->
1147- if event = Uwt.Poll. Readable then Lwt. wakeup_later u ()
1148- ) events
1149- ) with
1150- | Error error ->
1151- Log. err (fun f -> f " Uwt.Poll.start failed with %s" (Uwt. strerror error));
1152- Lwt. return (Ok [] )
1153- | Ok poll ->
1154- t >> = fun () ->
1155- let result = Uwt.Poll. close poll in
1156- if not (Uwt.Int_result. is_ok result) then begin
1157- let error = Uwt.Int_result. to_error result in
1158- Log. err (fun f -> f " Uwt.Poll.close failed with %s" (Uwt. strerror error));
1159- Lwt. return (Ok [] )
1160- end else begin
1161- Uwt_preemptive. detach
1162- (fun () ->
1163- Dnssd.LowLevel. response query
1164- ) ()
1165- end in
1139+ let one () =
1140+ let t, u = Lwt. task () in
1141+ match Uwt.Poll. start socket [ Uwt.Poll. Readable ]
1142+ ~cb: (fun _poll events ->
1143+ match events with
1144+ | Error error ->
1145+ Log. err (fun f -> f " Uwt.Poll callback failed with %s" (Uwt. strerror error))
1146+ | Ok events ->
1147+ List. iter (fun event ->
1148+ if event = Uwt.Poll. Readable then Lwt. wakeup_later u ()
1149+ ) events
1150+ ) with
1151+ | Error error ->
1152+ Log. err (fun f -> f " Uwt.Poll.start failed with %s" (Uwt. strerror error));
1153+ Lwt. return (Ok ([] , false ))
1154+ | Ok poll ->
1155+ t >> = fun () ->
1156+ let result = Uwt.Poll. close poll in
1157+ if not (Uwt.Int_result. is_ok result) then begin
1158+ let error = Uwt.Int_result. to_error result in
1159+ Log. err (fun f -> f " Uwt.Poll.close failed with %s" (Uwt. strerror error));
1160+ Lwt. return (Ok ([] , false ))
1161+ end else begin
1162+ Uwt_preemptive. detach
1163+ (fun () ->
1164+ Dnssd.LowLevel. response query
1165+ ) ()
1166+ end in
1167+ let rec loop acc =
1168+ one ()
1169+ >> = function
1170+ | Error e -> Lwt. return (Error e)
1171+ | Ok (rrs , true ) -> loop (acc @ rrs)
1172+ | Ok (rrs , false ) -> Lwt. return (Ok (acc @ rrs)) in
1173+ loop [] in
11661174
11671175 let query requested_name ty =
11681176 (* The DNSServiceRef API will return CNAMEs first, without resolving to
0 commit comments