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