2 | import public FS.Posix
3 | import public IO.Async.Socket
4 | import IO.Async.Loop.Posix
9 | record RFD (a : Type) where
12 | {auto isf : FileDesc a}
15 | Resource (Async e) (RFD a) where
16 | cleanup (R f) = stdoutLn "Closing \{show $ fileDesc f}" >> close' f
18 | parameters {0 es : List Type}
20 | {auto has : Has Errno es}
23 | acceptOn : (d : Domain) -> SockType -> Addr d -> AsyncStream e es (Socket d)
24 | acceptOn d tpe addr =
25 | resource ((\x => Socket.R x) <$> socketnb d tpe) $
\(R sock) => do
28 | repeat $
eval (acceptnb sock)
30 | acceptMany : Nat -> Socket d -> Async e es (List $
Socket d)
31 | acceptMany n sock = do
36 | go : SnocList (Socket d) -> Nat -> Async e es (List $
Socket d)
37 | go ss 0 = pure (ss <>> [])
39 | attempt (accept {es = [Errno]} sock) >>= \case
40 | Right peer => go (ss :< peer) k
42 | if x == EINPROGRESS || x == EAGAIN
43 | then pure (ss <>> [])
47 | acceptN : Nat -> (d : Domain) -> SockType -> Addr d -> AsyncStream e es (List $
Socket d)
48 | acceptN n d tpe addr =
49 | resource ((\x => Socket.R x) <$> socketnb d tpe) $
\(R sock) => do
52 | repeat $
eval (acceptMany n sock)