Skip to content

Commit 7e995c2

Browse files
committed
Mac: handle large DNS result sets
This incorporates mirage/ocaml-osx-dnssd#14 backported to the opam-1.2 branch. Signed-off-by: David Scott <dave.scott@docker.com>
1 parent ee5dd64 commit 7e995c2

9 files changed

Lines changed: 37 additions & 82 deletions

File tree

File renamed without changes.
File renamed without changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
git: "git://github.com/djs55/ocaml-osx-dnssd#big-results-opam-1.2-v2"

repo/darwin/packages/upstream/dnssd.0.5.0/url

Lines changed: 0 additions & 2 deletions
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../darwin/packages/dev/dnssd.0.6.0

repo/win32/packages/upstream/dnssd.0.5.0/descr

Lines changed: 0 additions & 19 deletions
This file was deleted.

repo/win32/packages/upstream/dnssd.0.5.0/opam

Lines changed: 0 additions & 32 deletions
This file was deleted.

repo/win32/packages/upstream/dnssd.0.5.0/url

Lines changed: 0 additions & 2 deletions
This file was deleted.

src/hostnet/host.ml

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)