0 | module System.Posix.Socket.Struct
5 | import Derive.Prelude
6 | import System.Posix.Errno
7 | import System.Posix.File.FileDesc
8 | import System.Posix.Socket.Types
11 | %language ElabReflection
19 | record Socket (d : Domain) where
24 | Cast (Socket d) Fd where cast = MkFd . fd
27 | Cast CInt (Socket d) where cast = S . cast
33 | %foreign "C:li_sockaddr_un, posix-idris"
34 | prim__sockaddr_un: String -> PrimIO AnyPtr
36 | %foreign "C:sockaddr_un_path, posix-idris"
37 | prim__sockaddr_un_path: AnyPtr -> PrimIO String
40 | record SSockaddrUn (s : Type) where
46 | SockaddrUn = SSockaddrUn World
49 | Struct SSockaddrUn where
54 | SizeOf (SSockaddrUn s) where
55 | sizeof_ = sockaddr_un_size
62 | sockaddrUn : (path : String) -> F1 s (SSockaddrUn s)
63 | sockaddrUn path = mapF1 SUN $
ffi $
prim__sockaddr_un path
66 | path : SSockaddrUn s -> F1 s String
67 | path (SUN p) = ffi $
prim__sockaddr_un_path p
73 | %foreign "C:li_sockaddr_in, posix-idris"
74 | prim__sockaddr_in: Bits32 -> Bits16 -> PrimIO AnyPtr
76 | %foreign "C:sockaddr_in_port, posix-idris"
77 | prim__sockaddr_in_port: AnyPtr -> PrimIO Bits16
79 | %foreign "C:sockaddr_in_addr, posix-idris"
80 | prim__sockaddr_in_addr: AnyPtr -> PrimIO Bits32
82 | %foreign "C:sockaddr_in_addr_str, posix-idris"
83 | prim__sockaddr_in_addr_str: AnyPtr -> PrimIO String
86 | record IP4Addr where
91 | %runElab derive "IP4Addr" [Show,Eq]
94 | ip4addr : Vect 4 Bits8 -> Bits32
96 | shiftL (cast w) 24 .|. shiftL (cast x) 16 .|. shiftL (cast y) 8 .|. cast z
99 | splitIp4Addr : Bits32 -> Vect 4 Bits8
101 | [cast (shiftR x 24), cast (shiftR x 16), cast (shiftR x 8), cast x]
104 | record SSockaddrIn (s : Type) where
109 | 0 SockaddrIn : Type
110 | SockaddrIn = SSockaddrIn World
113 | Struct SSockaddrIn where
118 | SizeOf (SSockaddrIn s) where
119 | sizeof_ = sockaddr_in_size
121 | namespace SockaddrIn
123 | port : SSockaddrIn s -> F1 s Bits16
124 | port (SIN p) = ffi $
prim__sockaddr_in_port p
127 | addr : SSockaddrIn s -> F1 s Bits32
128 | addr (SIN p) = ffi $
prim__sockaddr_in_addr p
131 | addrIP4Addr : SSockaddrIn s -> F1 s IP4Addr
133 | let p # t := SockaddrIn.port a t
134 | ad # t := SockaddrIn.addr a t
135 | in IP4 (splitIp4Addr ad) p # t
138 | addrStr : SSockaddrIn s -> F1 s String
139 | addrStr (SIN p) = ffi $
prim__sockaddr_in_addr_str p
145 | sockaddrIn : IP4Addr -> F1 s (SSockaddrIn s)
146 | sockaddrIn (IP4 a p) = mapF1 SIN $
ffi $
prim__sockaddr_in (ip4addr a) p
152 | %foreign "C:li_sockaddr_in6, posix-idris"
153 | prim__sockaddr_in6: Bits16 -> PrimIO AnyPtr
155 | %foreign "C:sockaddr_in6_port, posix-idris"
156 | prim__sockaddr_in6_port: AnyPtr -> PrimIO Bits16
158 | %foreign "C:sockaddr_in6_addr, posix-idris"
159 | prim__sockaddr_in6_addr: AnyPtr -> AnyPtr
161 | %foreign "C:sockaddr_in6_addr_str, posix-idris"
162 | prim__sockaddr_in6_addr_str: AnyPtr -> PrimIO String
165 | record IP6Addr where
167 | addr : Vect 16 Bits8
170 | %runElab derive "IP6Addr" [Show,Eq]
173 | record SSockaddrIn6 (s : Type) where
178 | Struct SSockaddrIn6 where
183 | 0 SockaddrIn6 : Type
184 | SockaddrIn6 = SSockaddrIn6 World
187 | SizeOf (SSockaddrIn6 s) where
188 | sizeof_ = sockaddr_in6_size
190 | namespace SockaddrIn6
192 | port : SSockaddrIn6 s -> F1 s Bits16
193 | port (SIN6 p) = ffi $
prim__sockaddr_in6_port p
196 | addr6 : SSockaddrIn6 s -> CArray s 16 Bits8
197 | addr6 (SIN6 p) = unsafeWrap (prim__sockaddr_in6_addr p)
200 | addrIP6Addr : SSockaddrIn6 s -> F1 s IP6Addr
202 | let p # t := SockaddrIn6.port a t
203 | bs # t := values [] (addr6 a) (#) 16 t
204 | Just ad := toVect 16 bs | Nothing => IP6 (replicate 16 0) p # t
208 | addrStr : SSockaddrIn6 s -> F1 s String
209 | addrStr (SIN6 p) = ffi $
prim__sockaddr_in6_addr_str p
215 | sockaddrIn6 : IP6Addr -> F1 s (SSockaddrIn6 s)
216 | sockaddrIn6 (IP6 addr pr) t =
217 | let res # t := ffi (prim__sockaddr_in6 pr) t
218 | _ # t := writeVect (addr6 $
SIN6 res) addr t
226 | 0 Sockaddr : Domain -> Type
227 | Sockaddr AF_UNIX = SockaddrUn
228 | Sockaddr AF_INET = SockaddrIn
229 | Sockaddr AF_INET6 = SockaddrIn6
232 | 0 Addr : Domain -> Type
233 | Addr AF_UNIX = String
234 | Addr AF_INET = IP4Addr
235 | Addr AF_INET6 = IP6Addr
238 | ptr : (d : _) -> Sockaddr d -> AnyPtr
239 | ptr AF_UNIX x = x.ptr
240 | ptr AF_INET x = x.ptr
241 | ptr AF_INET6 x = x.ptr
244 | addrSize : (d : Domain) -> Bits32
245 | addrSize AF_UNIX = sizeof SockaddrUn
246 | addrSize AF_INET = sizeof SockaddrIn
247 | addrSize AF_INET6 = sizeof SockaddrIn6
250 | sockaddr : (d : _) -> Addr d -> F1 World (Sockaddr d)
251 | sockaddr AF_UNIX a = sockaddrUn a
252 | sockaddr AF_INET a = sockaddrIn a
253 | sockaddr AF_INET6 a = sockaddrIn6 a