5 | module Network.Socket.Data
25 | ProtocolNumber : Type
26 | ProtocolNumber = Int
35 | SocketDescriptor : Type
36 | SocketDescriptor = Int
50 | %foreign "C:idrnet_geteagain, libidris2_support, idris_net.h"
51 | prim__idrnet_geteagain : PrimIO Int
58 | unsafePerformIO $
primIO $
prim__idrnet_geteagain
63 | %foreign "C:idrnet_errno, libidris2_support, idris_net.h"
64 | prim__idrnet_errno : PrimIO Int
66 | %foreign "C:isNull, libidris2_support, idris_support.h"
67 | prim__idrnet_isNull : (ptr : AnyPtr) -> PrimIO Int
71 | getErrno : HasIO io => io SocketError
72 | getErrno = primIO $
prim__idrnet_errno
75 | nullPtr : HasIO io => AnyPtr -> io Bool
76 | nullPtr p = do 0 <- primIO $
prim__idrnet_isNull p
83 | interface ToCode a where
93 | data SocketFamily : Type where
95 | AF_UNSPEC : SocketFamily
98 | AF_UNIX : SocketFamily
101 | AF_INET : SocketFamily
104 | AF_INET6 : SocketFamily
106 | Show SocketFamily where
107 | show AF_UNSPEC = "AF_UNSPEC"
108 | show AF_UNIX = "AF_UNIX"
109 | show AF_INET = "AF_INET"
110 | show AF_INET6 = "AF_INET6"
115 | %foreign "C:idrnet_af_unspec, libidris2_support, idris_net.h"
116 | prim__idrnet_af_unspec : PrimIO Int
118 | %foreign "C:idrnet_af_unix, libidris2_support, idris_net.h"
119 | prim__idrnet_af_unix : PrimIO Int
121 | %foreign "C:idrnet_af_inet, libidris2_support, idris_net.h"
122 | prim__idrnet_af_inet : PrimIO Int
124 | %foreign "C:idrnet_af_inet6, libidris2_support, idris_net.h"
125 | prim__idrnet_af_inet6 : PrimIO Int
128 | ToCode SocketFamily where
129 | toCode AF_UNSPEC = unsafePerformIO $
primIO $
prim__idrnet_af_unspec
130 | toCode AF_UNIX = unsafePerformIO $
primIO $
prim__idrnet_af_unix
131 | toCode AF_INET = unsafePerformIO $
primIO $
prim__idrnet_af_inet
132 | toCode AF_INET6 = unsafePerformIO $
primIO $
prim__idrnet_af_inet6
135 | getSocketFamily : Int -> Maybe SocketFamily
136 | getSocketFamily i =
137 | lookup i [ (toCode AF_UNSPEC, AF_UNSPEC)
138 | , (toCode AF_UNIX, AF_UNIX)
139 | , (toCode AF_INET, AF_INET)
140 | , (toCode AF_INET6, AF_INET6)
147 | data SocketType : Type where
149 | NotASocket : SocketType
152 | Stream : SocketType
155 | Datagram : SocketType
158 | RawSocket : SocketType
161 | Show SocketType where
162 | show NotASocket = "Not a socket"
163 | show Stream = "Stream"
164 | show Datagram = "Datagram"
165 | show RawSocket = "Raw"
168 | ToCode SocketType where
169 | toCode NotASocket = 0
171 | toCode Datagram = 2
172 | toCode RawSocket = 3
178 | data SocketAddress : Type where
179 | IPv4Addr : Int -> Int -> Int -> Int -> SocketAddress
182 | IPv6Addr : SocketAddress
184 | Hostname : String -> SocketAddress
187 | InvalidAddress : SocketAddress
190 | Show SocketAddress where
191 | show (IPv4Addr i1 i2 i3 i4) = concat $
intersperse "." (map show [i1, i2, i3, i4])
192 | show IPv6Addr = "NOT IMPLEMENTED YET"
193 | show (Hostname host) = host
194 | show InvalidAddress = "Invalid"
198 | parseIPv4 : String -> SocketAddress
201 | (i1 ::: i2 :: i3 :: i4 :: _) => IPv4Addr i1 i2 i3 i4
202 | _ => InvalidAddress
204 | toInt' : String -> Integer
207 | toInt : String -> Int
208 | toInt s = fromInteger $
toInt' s
210 | splitted : List1 Int
211 | splitted = map toInt (split (\c => c == '.') str)
217 | record UDPRecvData where
218 | constructor MkUDPRecvData
219 | remote_addr : SocketAddress
225 | record UDPAddrInfo where
226 | constructor MkUDPAddrInfo
227 | remote_addr : SocketAddress
233 | record Socket where
234 | constructor MkSocket
235 | descriptor : SocketDescriptor
236 | family : SocketFamily
237 | socketType : SocketType
238 | protocolNumber : ProtocolNumber