5 | module Network.Socket.Raw
7 | import public Network.Socket.Data
15 | data RecvStructPtr = RSPtr AnyPtr
18 | data RecvfromStructPtr = RFPtr AnyPtr
21 | data BufPtr = BPtr AnyPtr
24 | data SockaddrPtr = SAPtr AnyPtr
30 | sock_poke : HasIO io => BufPtr -> Int -> Int -> io ()
31 | sock_poke (BPtr ptr) offset val = primIO $
prim__idrnet_poke ptr offset val
35 | sock_peek : HasIO io => BufPtr -> Int -> io Int
36 | sock_peek (BPtr ptr) offset = primIO $
prim__idrnet_peek ptr offset
40 | sock_free : HasIO io => BufPtr -> io ()
41 | sock_free (BPtr ptr) = free ptr
44 | sockaddr_free : HasIO io => SockaddrPtr -> io ()
45 | sockaddr_free (SAPtr ptr) = free ptr
51 | sock_alloc : HasIO io => ByteLength -> io BufPtr
52 | sock_alloc bl = map BPtr $
malloc bl
56 | getSockPort : HasIO io => Socket -> io Port
57 | getSockPort sock = primIO $
prim__idrnet_sockaddr_port $
descriptor sock
62 | getSockAddr : HasIO io => SockaddrPtr -> io SocketAddress
63 | getSockAddr (SAPtr ptr) = do
64 | addr_family_int <- primIO $
prim__idrnet_sockaddr_family ptr
67 | assert_total (case getSocketFamily addr_family_int of
69 | ipv4_addr <- primIO $
prim__idrnet_sockaddr_ipv4 ptr
71 | pure $
parseIPv4 ipv4_addr
72 | Just AF_INET6 => pure IPv6Addr
73 | Just AF_UNIX => map Hostname $
primIO (prim__idrnet_sockaddr_unix ptr)
74 | Just AF_UNSPEC => pure InvalidAddress)
77 | freeRecvStruct : HasIO io => RecvStructPtr -> io ()
78 | freeRecvStruct (RSPtr p) = primIO $
prim__idrnet_free_recv_struct p
82 | freeRecvfromStruct : HasIO io => RecvfromStructPtr -> io ()
83 | freeRecvfromStruct (RFPtr p) = primIO $
prim__idrnet_free_recvfrom_struct p
97 | -> (len : ByteLength)
98 | -> io (Either SocketError ResultCode)
99 | sendBuf sock (BPtr ptr) len = do
100 | send_res <- primIO $
prim__idrnet_send_buf (descriptor sock) ptr len
102 | if send_res == (-
1)
103 | then map Left getErrno
104 | else pure $
Right send_res
118 | -> (len : ByteLength)
119 | -> io (Either SocketError ResultCode)
120 | recvBuf sock (BPtr ptr) len = do
121 | recv_res <- primIO $
prim__idrnet_recv_buf (descriptor sock) ptr len
123 | if (recv_res == (-
1))
124 | then map Left getErrno
125 | else pure $
Right recv_res
138 | sendToBuf : HasIO io
140 | -> (addr : SocketAddress)
143 | -> (len : ByteLength)
144 | -> io (Either SocketError ResultCode)
145 | sendToBuf sock addr p (BPtr dat) len = do
146 | sendto_res <- primIO $
prim__idrnet_sendto_buf
147 | (descriptor sock) dat len (show addr) p (toCode $
family sock)
149 | if sendto_res == (-
1)
150 | then map Left getErrno
151 | else pure $
Right sendto_res
155 | foreignGetRecvfromPayload : HasIO io => RecvfromStructPtr -> io String
156 | foreignGetRecvfromPayload (RFPtr p) = primIO $
prim__idrnet_get_recvfrom_payload p
160 | foreignGetRecvfromAddr : HasIO io => RecvfromStructPtr -> io SocketAddress
161 | foreignGetRecvfromAddr (RFPtr p) = do
162 | sockaddr_ptr <- map SAPtr $
primIO $
prim__idrnet_get_recvfrom_sockaddr p
163 | getSockAddr sockaddr_ptr
167 | foreignGetRecvfromPort : HasIO io => RecvfromStructPtr -> io Port
168 | foreignGetRecvfromPort (RFPtr p) = do
169 | sockaddr_ptr <- primIO $
prim__idrnet_get_recvfrom_sockaddr p
170 | port <- primIO $
prim__idrnet_sockaddr_ipv4_port sockaddr_ptr
185 | recvFromBuf : HasIO io
188 | -> (len : ByteLength)
189 | -> io (Either SocketError (UDPAddrInfo, ResultCode))
190 | recvFromBuf sock (BPtr ptr) bl = do
191 | recv_ptr <- primIO $
prim__idrnet_recvfrom_buf (descriptor sock) ptr bl
193 | let recv_ptr' = RFPtr recv_ptr
195 | isnull <- nullPtr recv_ptr
198 | then map Left getErrno
200 | result <- primIO $
prim__idrnet_get_recvfrom_res recv_ptr
203 | freeRecvfromStruct recv_ptr'
206 | port <- foreignGetRecvfromPort recv_ptr'
207 | addr <- foreignGetRecvfromAddr recv_ptr'
208 | freeRecvfromStruct recv_ptr'
209 | pure $
Right (MkUDPAddrInfo addr port, result + 1)