1 use crate::os::raw::{c_char, c_uint, c_void};
2 pub use libc::{c_int, c_long, size_t, ssize_t, suseconds_t, time_t, timeval};
3 
4 pub const SOLID_NET_ERR_BASE: c_int = -2000;
5 pub const EINPROGRESS: c_int = SOLID_NET_ERR_BASE - libc::EINPROGRESS;
6 
7 pub const AF_INET6: i32 = 10;
8 pub const AF_INET: i32 = 2;
9 pub const IPPROTO_IP: i32 = 0;
10 pub const IPPROTO_IPV6: i32 = 41;
11 pub const IPPROTO_TCP: i32 = 6;
12 pub const IPV6_ADD_MEMBERSHIP: i32 = 12;
13 pub const IPV6_DROP_MEMBERSHIP: i32 = 13;
14 pub const IPV6_MULTICAST_LOOP: i32 = 19;
15 pub const IPV6_V6ONLY: i32 = 27;
16 pub const IP_TTL: i32 = 2;
17 pub const IP_MULTICAST_TTL: i32 = 5;
18 pub const IP_MULTICAST_LOOP: i32 = 7;
19 pub const IP_ADD_MEMBERSHIP: i32 = 3;
20 pub const IP_DROP_MEMBERSHIP: i32 = 4;
21 pub const SHUT_RD: i32 = 0;
22 pub const SHUT_RDWR: i32 = 2;
23 pub const SHUT_WR: i32 = 1;
24 pub const SOCK_DGRAM: i32 = 2;
25 pub const SOCK_STREAM: i32 = 1;
26 pub const SOL_SOCKET: i32 = 4095;
27 pub const SO_BROADCAST: i32 = 32;
28 pub const SO_ERROR: i32 = 4103;
29 pub const SO_RCVTIMEO: i32 = 4102;
30 pub const SO_REUSEADDR: i32 = 4;
31 pub const SO_SNDTIMEO: i32 = 4101;
32 pub const SO_LINGER: i32 = 128;
33 pub const TCP_NODELAY: i32 = 1;
34 pub const MSG_PEEK: c_int = 1;
35 pub const FIONBIO: c_long = 0x8008667eu32 as c_long;
36 pub const EAI_NONAME: i32 = -2200;
37 pub const EAI_SERVICE: i32 = -2201;
38 pub const EAI_FAIL: i32 = -2202;
39 pub const EAI_MEMORY: i32 = -2203;
40 pub const EAI_FAMILY: i32 = -2204;
41 
42 pub type sa_family_t = u8;
43 pub type socklen_t = u32;
44 pub type in_addr_t = u32;
45 pub type in_port_t = u16;
46 
47 #[repr(C)]
48 #[derive(Debug, Copy, Clone)]
49 pub struct in_addr {
50     pub s_addr: in_addr_t,
51 }
52 
53 #[repr(C)]
54 #[derive(Debug, Copy, Clone)]
55 pub struct in6_addr {
56     pub s6_addr: [u8; 16],
57 }
58 
59 #[repr(C)]
60 #[derive(Debug, Copy, Clone)]
61 pub struct ip_mreq {
62     pub imr_multiaddr: in_addr,
63     pub imr_interface: in_addr,
64 }
65 
66 #[repr(C)]
67 #[derive(Debug, Copy, Clone)]
68 pub struct ipv6_mreq {
69     pub ipv6mr_multiaddr: in6_addr,
70     pub ipv6mr_interface: c_uint,
71 }
72 
73 #[repr(C)]
74 #[derive(Debug, Copy, Clone)]
75 pub struct msghdr {
76     pub msg_name: *mut c_void,
77     pub msg_namelen: socklen_t,
78     pub msg_iov: *mut iovec,
79     pub msg_iovlen: c_int,
80     pub msg_control: *mut c_void,
81     pub msg_controllen: socklen_t,
82     pub msg_flags: c_int,
83 }
84 
85 #[repr(C)]
86 #[derive(Debug, Copy, Clone)]
87 pub struct sockaddr {
88     pub sa_len: u8,
89     pub sa_family: sa_family_t,
90     pub sa_data: [c_char; 14usize],
91 }
92 
93 #[repr(C)]
94 #[derive(Debug, Copy, Clone)]
95 pub struct sockaddr_in {
96     pub sin_len: u8,
97     pub sin_family: sa_family_t,
98     pub sin_port: in_port_t,
99     pub sin_addr: in_addr,
100     pub sin_zero: [c_char; 8usize],
101 }
102 
103 #[repr(C)]
104 #[derive(Copy, Clone)]
105 pub struct sockaddr_in6 {
106     pub sin6_len: u8,
107     pub sin6_family: sa_family_t,
108     pub sin6_port: in_port_t,
109     pub sin6_flowinfo: u32,
110     pub sin6_addr: in6_addr,
111     pub sin6_scope_id: u32,
112 }
113 
114 #[repr(C)]
115 #[derive(Debug, Copy, Clone)]
116 pub struct sockaddr_storage {
117     pub s2_len: u8,
118     pub ss_family: sa_family_t,
119     pub s2_data1: [c_char; 2usize],
120     pub s2_data2: [u32; 3usize],
121 }
122 
123 #[repr(C)]
124 #[derive(Debug, Copy, Clone)]
125 pub struct addrinfo {
126     pub ai_flags: c_int,
127     pub ai_family: c_int,
128     pub ai_socktype: c_int,
129     pub ai_protocol: c_int,
130     pub ai_addrlen: socklen_t,
131     pub ai_addr: *mut sockaddr,
132     pub ai_canonname: *mut c_char,
133     pub ai_next: *mut addrinfo,
134 }
135 
136 #[repr(C)]
137 #[derive(Debug, Copy, Clone)]
138 pub struct linger {
139     pub l_onoff: c_int,
140     pub l_linger: c_int,
141 }
142 
143 #[repr(C)]
144 #[derive(Debug, Copy, Clone)]
145 pub struct iovec {
146     pub iov_base: *mut c_void,
147     pub iov_len: usize,
148 }
149 
150 /// This value can be chosen by an application
151 pub const SOLID_NET_FD_SETSIZE: usize = 1;
152 
153 #[repr(C)]
154 #[derive(Debug, Copy, Clone)]
155 pub struct fd_set {
156     pub num_fds: usize,
157     pub fds: [c_int; SOLID_NET_FD_SETSIZE],
158 }
159 
160 extern "C" {
161     #[link_name = "SOLID_NET_StrError"]
strerror(errnum: c_int) -> *const c_char162     pub fn strerror(errnum: c_int) -> *const c_char;
163 
SOLID_NET_GetLastError() -> c_int164     pub fn SOLID_NET_GetLastError() -> c_int;
165 
166     #[link_name = "SOLID_NET_Accept"]
accept(s: c_int, addr: *mut sockaddr, addrlen: *mut socklen_t) -> c_int167     pub fn accept(s: c_int, addr: *mut sockaddr, addrlen: *mut socklen_t) -> c_int;
168 
169     #[link_name = "SOLID_NET_Bind"]
bind(s: c_int, name: *const sockaddr, namelen: socklen_t) -> c_int170     pub fn bind(s: c_int, name: *const sockaddr, namelen: socklen_t) -> c_int;
171 
172     #[link_name = "SOLID_NET_Connect"]
connect(s: c_int, name: *const sockaddr, namelen: socklen_t) -> c_int173     pub fn connect(s: c_int, name: *const sockaddr, namelen: socklen_t) -> c_int;
174 
175     #[link_name = "SOLID_NET_Close"]
close(s: c_int) -> c_int176     pub fn close(s: c_int) -> c_int;
177 
178     #[link_name = "SOLID_NET_GetPeerName"]
getpeername(s: c_int, name: *mut sockaddr, namelen: *mut socklen_t) -> c_int179     pub fn getpeername(s: c_int, name: *mut sockaddr, namelen: *mut socklen_t) -> c_int;
180 
181     #[link_name = "SOLID_NET_GetSockName"]
getsockname(s: c_int, name: *mut sockaddr, namelen: *mut socklen_t) -> c_int182     pub fn getsockname(s: c_int, name: *mut sockaddr, namelen: *mut socklen_t) -> c_int;
183 
184     #[link_name = "SOLID_NET_GetSockOpt"]
getsockopt( s: c_int, level: c_int, optname: c_int, optval: *mut c_void, optlen: *mut socklen_t, ) -> c_int185     pub fn getsockopt(
186         s: c_int,
187         level: c_int,
188         optname: c_int,
189         optval: *mut c_void,
190         optlen: *mut socklen_t,
191     ) -> c_int;
192 
193     #[link_name = "SOLID_NET_SetSockOpt"]
setsockopt( s: c_int, level: c_int, optname: c_int, optval: *const c_void, optlen: socklen_t, ) -> c_int194     pub fn setsockopt(
195         s: c_int,
196         level: c_int,
197         optname: c_int,
198         optval: *const c_void,
199         optlen: socklen_t,
200     ) -> c_int;
201 
202     #[link_name = "SOLID_NET_Ioctl"]
ioctl(s: c_int, cmd: c_long, argp: *mut c_void) -> c_int203     pub fn ioctl(s: c_int, cmd: c_long, argp: *mut c_void) -> c_int;
204 
205     #[link_name = "SOLID_NET_Listen"]
listen(s: c_int, backlog: c_int) -> c_int206     pub fn listen(s: c_int, backlog: c_int) -> c_int;
207 
208     #[link_name = "SOLID_NET_Recv"]
recv(s: c_int, mem: *mut c_void, len: size_t, flags: c_int) -> ssize_t209     pub fn recv(s: c_int, mem: *mut c_void, len: size_t, flags: c_int) -> ssize_t;
210 
211     #[link_name = "SOLID_NET_Read"]
read(s: c_int, mem: *mut c_void, len: size_t) -> ssize_t212     pub fn read(s: c_int, mem: *mut c_void, len: size_t) -> ssize_t;
213 
214     #[link_name = "SOLID_NET_Readv"]
readv(s: c_int, bufs: *const iovec, bufcnt: c_int) -> ssize_t215     pub fn readv(s: c_int, bufs: *const iovec, bufcnt: c_int) -> ssize_t;
216 
217     #[link_name = "SOLID_NET_RecvFrom"]
recvfrom( s: c_int, mem: *mut c_void, len: size_t, flags: c_int, from: *mut sockaddr, fromlen: *mut socklen_t, ) -> ssize_t218     pub fn recvfrom(
219         s: c_int,
220         mem: *mut c_void,
221         len: size_t,
222         flags: c_int,
223         from: *mut sockaddr,
224         fromlen: *mut socklen_t,
225     ) -> ssize_t;
226 
227     #[link_name = "SOLID_NET_Send"]
send(s: c_int, mem: *const c_void, len: size_t, flags: c_int) -> ssize_t228     pub fn send(s: c_int, mem: *const c_void, len: size_t, flags: c_int) -> ssize_t;
229 
230     #[link_name = "SOLID_NET_SendMsg"]
sendmsg(s: c_int, message: *const msghdr, flags: c_int) -> ssize_t231     pub fn sendmsg(s: c_int, message: *const msghdr, flags: c_int) -> ssize_t;
232 
233     #[link_name = "SOLID_NET_SendTo"]
sendto( s: c_int, mem: *const c_void, len: size_t, flags: c_int, to: *const sockaddr, tolen: socklen_t, ) -> ssize_t234     pub fn sendto(
235         s: c_int,
236         mem: *const c_void,
237         len: size_t,
238         flags: c_int,
239         to: *const sockaddr,
240         tolen: socklen_t,
241     ) -> ssize_t;
242 
243     #[link_name = "SOLID_NET_Shutdown"]
shutdown(s: c_int, how: c_int) -> c_int244     pub fn shutdown(s: c_int, how: c_int) -> c_int;
245 
246     #[link_name = "SOLID_NET_Socket"]
socket(domain: c_int, type_: c_int, protocol: c_int) -> c_int247     pub fn socket(domain: c_int, type_: c_int, protocol: c_int) -> c_int;
248 
249     #[link_name = "SOLID_NET_Write"]
write(s: c_int, mem: *const c_void, len: size_t) -> ssize_t250     pub fn write(s: c_int, mem: *const c_void, len: size_t) -> ssize_t;
251 
252     #[link_name = "SOLID_NET_Writev"]
writev(s: c_int, bufs: *const iovec, bufcnt: c_int) -> ssize_t253     pub fn writev(s: c_int, bufs: *const iovec, bufcnt: c_int) -> ssize_t;
254 
255     #[link_name = "SOLID_NET_FreeAddrInfo"]
freeaddrinfo(ai: *mut addrinfo)256     pub fn freeaddrinfo(ai: *mut addrinfo);
257 
258     #[link_name = "SOLID_NET_GetAddrInfo"]
getaddrinfo( nodename: *const c_char, servname: *const c_char, hints: *const addrinfo, res: *mut *mut addrinfo, ) -> c_int259     pub fn getaddrinfo(
260         nodename: *const c_char,
261         servname: *const c_char,
262         hints: *const addrinfo,
263         res: *mut *mut addrinfo,
264     ) -> c_int;
265 
266     #[link_name = "SOLID_NET_Select"]
select( maxfdp1: c_int, readset: *mut fd_set, writeset: *mut fd_set, exceptset: *mut fd_set, timeout: *mut timeval, ) -> c_int267     pub fn select(
268         maxfdp1: c_int,
269         readset: *mut fd_set,
270         writeset: *mut fd_set,
271         exceptset: *mut fd_set,
272         timeout: *mut timeval,
273     ) -> c_int;
274 }
275