0 | module System.UV.DNS
 1 |
 2 | import Derive.Prelude
 3 | import System.FFI
 4 | import System.UV.Pointer
 5 | import System.UV.Loop
 6 | import System.UV.Util
 7 | import System.UV.Raw.DNS
 8 |
 9 | %language ElabReflection
10 | %default total
11 |
12 | --------------------------------------------------------------------------------
13 | -- API
14 | --------------------------------------------------------------------------------
15 |
16 | public export
17 | record SockInfo where
18 |   constructor SI
19 |   family   : SockFamily
20 |   type     : SockType
21 |   protocol : Protocol
22 |
23 | hints : HasIO io => SockInfo -> io (Ptr AddrInfo)
24 | hints (SI f t p) = do
25 |   hs <- mallocPtr AddrInfo
26 |   uv_set_ai_family   hs (familyCode f)
27 |   uv_set_ai_socktype hs (sockCode t)
28 |   uv_set_ai_protocol hs (protocolCode p)
29 |   pure hs
30 |
31 | export
32 | Resource (Ptr AddrInfo) where
33 |   release = uv_freeaddrinfo
34 |
35 | export
36 | Resource (Ptr GetAddrInfo) where
37 |   release = freePtr
38 |
39 | parameters {auto l   : UVLoop}
40 |            {auto has : Has UVError es}
41 |
42 |   gaCB :
43 |        (Outcome es (Ptr AddrInfo) -> IO ())
44 |     -> Ptr GetAddrInfo
45 |     -> Int32
46 |     -> Ptr AddrInfo
47 |     -> IO ()
48 |   gaCB cb _ st pa = do
49 |     case uvRes st of
50 |       Left err => uv_freeaddrinfo pa >> cb (Error err)
51 |       Right () => cb (Succeeded pa)
52 |
53 |   export
54 |   addrInfo : (node, service : String) -> SockInfo -> Async es (Ptr AddrInfo)
55 |   addrInfo n s h =
56 |     use1 (hints h) $ \hs => do
57 |       uvAsync $ \cb => uv_getaddrinfo l.loop (gaCB cb) n s hs
58 |