1 pub type c_schar = i8; 2 pub type c_uchar = u8; 3 pub type c_short = i16; 4 pub type c_ushort = u16; 5 pub type c_int = i32; 6 pub type c_uint = u32; 7 pub type c_float = f32; 8 pub type c_double = f64; 9 pub type c_longlong = i64; 10 pub type c_ulonglong = u64; 11 pub type intmax_t = i64; 12 pub type uintmax_t = u64; 13 14 pub type size_t = usize; 15 pub type ptrdiff_t = isize; 16 pub type intptr_t = isize; 17 pub type uintptr_t = usize; 18 pub type ssize_t = isize; 19 20 pub type in_addr_t = u32; 21 pub type in_port_t = u16; 22 pub type pthread_key_t = usize; 23 pub type pthread_t = usize; 24 pub type sa_family_t = u8; 25 pub type socklen_t = usize; 26 pub type time_t = i64; 27 28 s! { 29 pub struct addrinfo { 30 pub ai_flags: ::c_int, 31 pub ai_family: ::c_int, 32 pub ai_socktype: ::c_int, 33 pub ai_protocol: ::c_int, 34 pub ai_addrlen: ::socklen_t, 35 pub ai_addr: *mut ::sockaddr, 36 pub ai_canonname: *mut ::c_char, 37 pub ai_next: *mut addrinfo, 38 } 39 40 pub struct in_addr { 41 pub s_addr: in_addr_t, 42 } 43 44 pub struct in6_addr { 45 pub s6_addr: [u8; 16], 46 } 47 48 pub struct pthread_attr_t { 49 __detachstate: ::c_int, 50 __stacksize: usize, 51 } 52 53 pub struct sockaddr { 54 pub sa_family: sa_family_t, 55 pub sa_data: [::c_char; 0], 56 } 57 58 pub struct sockaddr_in { 59 pub sin_family: ::sa_family_t, 60 pub sin_port: ::in_port_t, 61 pub sin_addr: ::in_addr, 62 } 63 64 pub struct sockaddr_in6 { 65 pub sin6_family: sa_family_t, 66 pub sin6_port: ::in_port_t, 67 pub sin6_flowinfo: u32, 68 pub sin6_addr: ::in6_addr, 69 pub sin6_scope_id: u32, 70 } 71 72 pub struct sockaddr_storage { 73 pub ss_family: ::sa_family_t, 74 __ss_data: [u8; 32], 75 } 76 } 77 78 pub const INT_MIN: c_int = -2147483648; 79 pub const INT_MAX: c_int = 2147483647; 80 81 pub const _SC_NPROCESSORS_ONLN: ::c_int = 52; 82 pub const _SC_PAGESIZE: ::c_int = 54; 83 84 pub const AF_INET: ::c_int = 1; 85 pub const AF_INET6: ::c_int = 2; 86 87 pub const EACCES: ::c_int = 2; 88 pub const EADDRINUSE: ::c_int = 3; 89 pub const EADDRNOTAVAIL: ::c_int = 4; 90 pub const EAGAIN: ::c_int = 6; 91 pub const ECONNABORTED: ::c_int = 13; 92 pub const ECONNREFUSED: ::c_int = 14; 93 pub const ECONNRESET: ::c_int = 15; 94 pub const EEXIST: ::c_int = 20; 95 pub const EINTR: ::c_int = 27; 96 pub const EINVAL: ::c_int = 28; 97 pub const ENOENT: ::c_int = 44; 98 pub const ENOTCONN: ::c_int = 53; 99 pub const EPERM: ::c_int = 63; 100 pub const EPIPE: ::c_int = 64; 101 pub const ETIMEDOUT: ::c_int = 73; 102 pub const EWOULDBLOCK: ::c_int = EAGAIN; 103 104 pub const EAI_SYSTEM: ::c_int = 9; 105 106 pub const EXIT_FAILURE: ::c_int = 1; 107 pub const EXIT_SUCCESS: ::c_int = 0; 108 109 pub const PTHREAD_STACK_MIN: ::size_t = 1024; 110 111 pub const SOCK_DGRAM: ::c_int = 128; 112 pub const SOCK_STREAM: ::c_int = 130; 113 114 #[cfg_attr(feature = "extra_traits", derive(Debug))] 115 pub enum FILE {} 116 impl ::Copy for FILE {} 117 impl ::Clone for FILE { clone(&self) -> FILE118 fn clone(&self) -> FILE { 119 *self 120 } 121 } 122 #[cfg_attr(feature = "extra_traits", derive(Debug))] 123 pub enum fpos_t {} // FIXME: fill this out with a struct 124 impl ::Copy for fpos_t {} 125 impl ::Clone for fpos_t { clone(&self) -> fpos_t126 fn clone(&self) -> fpos_t { 127 *self 128 } 129 } 130 131 extern "C" { isalnum(c: c_int) -> c_int132 pub fn isalnum(c: c_int) -> c_int; isalpha(c: c_int) -> c_int133 pub fn isalpha(c: c_int) -> c_int; iscntrl(c: c_int) -> c_int134 pub fn iscntrl(c: c_int) -> c_int; isdigit(c: c_int) -> c_int135 pub fn isdigit(c: c_int) -> c_int; isgraph(c: c_int) -> c_int136 pub fn isgraph(c: c_int) -> c_int; islower(c: c_int) -> c_int137 pub fn islower(c: c_int) -> c_int; isprint(c: c_int) -> c_int138 pub fn isprint(c: c_int) -> c_int; ispunct(c: c_int) -> c_int139 pub fn ispunct(c: c_int) -> c_int; isspace(c: c_int) -> c_int140 pub fn isspace(c: c_int) -> c_int; isupper(c: c_int) -> c_int141 pub fn isupper(c: c_int) -> c_int; isxdigit(c: c_int) -> c_int142 pub fn isxdigit(c: c_int) -> c_int; isblank(c: c_int) -> c_int143 pub fn isblank(c: c_int) -> c_int; tolower(c: c_int) -> c_int144 pub fn tolower(c: c_int) -> c_int; toupper(c: c_int) -> c_int145 pub fn toupper(c: c_int) -> c_int; fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE146 pub fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE; freopen( filename: *const c_char, mode: *const c_char, file: *mut FILE, ) -> *mut FILE147 pub fn freopen( 148 filename: *const c_char, 149 mode: *const c_char, 150 file: *mut FILE, 151 ) -> *mut FILE; fflush(file: *mut FILE) -> c_int152 pub fn fflush(file: *mut FILE) -> c_int; fclose(file: *mut FILE) -> c_int153 pub fn fclose(file: *mut FILE) -> c_int; remove(filename: *const c_char) -> c_int154 pub fn remove(filename: *const c_char) -> c_int; rename(oldname: *const c_char, newname: *const c_char) -> c_int155 pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int; tmpfile() -> *mut FILE156 pub fn tmpfile() -> *mut FILE; setvbuf( stream: *mut FILE, buffer: *mut c_char, mode: c_int, size: size_t, ) -> c_int157 pub fn setvbuf( 158 stream: *mut FILE, 159 buffer: *mut c_char, 160 mode: c_int, 161 size: size_t, 162 ) -> c_int; setbuf(stream: *mut FILE, buf: *mut c_char)163 pub fn setbuf(stream: *mut FILE, buf: *mut c_char); getchar() -> c_int164 pub fn getchar() -> c_int; putchar(c: c_int) -> c_int165 pub fn putchar(c: c_int) -> c_int; fgetc(stream: *mut FILE) -> c_int166 pub fn fgetc(stream: *mut FILE) -> c_int; fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char167 pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) 168 -> *mut c_char; fputc(c: c_int, stream: *mut FILE) -> c_int169 pub fn fputc(c: c_int, stream: *mut FILE) -> c_int; fputs(s: *const c_char, stream: *mut FILE) -> c_int170 pub fn fputs(s: *const c_char, stream: *mut FILE) -> c_int; puts(s: *const c_char) -> c_int171 pub fn puts(s: *const c_char) -> c_int; ungetc(c: c_int, stream: *mut FILE) -> c_int172 pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int; fread( ptr: *mut c_void, size: size_t, nobj: size_t, stream: *mut FILE, ) -> size_t173 pub fn fread( 174 ptr: *mut c_void, 175 size: size_t, 176 nobj: size_t, 177 stream: *mut FILE, 178 ) -> size_t; fwrite( ptr: *const c_void, size: size_t, nobj: size_t, stream: *mut FILE, ) -> size_t179 pub fn fwrite( 180 ptr: *const c_void, 181 size: size_t, 182 nobj: size_t, 183 stream: *mut FILE, 184 ) -> size_t; fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int185 pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int; ftell(stream: *mut FILE) -> c_long186 pub fn ftell(stream: *mut FILE) -> c_long; rewind(stream: *mut FILE)187 pub fn rewind(stream: *mut FILE); fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int188 pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int; fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int189 pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int; feof(stream: *mut FILE) -> c_int190 pub fn feof(stream: *mut FILE) -> c_int; ferror(stream: *mut FILE) -> c_int191 pub fn ferror(stream: *mut FILE) -> c_int; perror(s: *const c_char)192 pub fn perror(s: *const c_char); atoi(s: *const c_char) -> c_int193 pub fn atoi(s: *const c_char) -> c_int; strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double194 pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double; strtol( s: *const c_char, endp: *mut *mut c_char, base: c_int, ) -> c_long195 pub fn strtol( 196 s: *const c_char, 197 endp: *mut *mut c_char, 198 base: c_int, 199 ) -> c_long; strtoul( s: *const c_char, endp: *mut *mut c_char, base: c_int, ) -> c_ulong200 pub fn strtoul( 201 s: *const c_char, 202 endp: *mut *mut c_char, 203 base: c_int, 204 ) -> c_ulong; calloc(nobj: size_t, size: size_t) -> *mut c_void205 pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; malloc(size: size_t) -> *mut c_void206 pub fn malloc(size: size_t) -> *mut c_void; realloc(p: *mut c_void, size: size_t) -> *mut c_void207 pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; free(p: *mut c_void)208 pub fn free(p: *mut c_void); abort() -> !209 pub fn abort() -> !; exit(status: c_int) -> !210 pub fn exit(status: c_int) -> !; _exit(status: c_int) -> !211 pub fn _exit(status: c_int) -> !; atexit(cb: extern "C" fn()) -> c_int212 pub fn atexit(cb: extern "C" fn()) -> c_int; system(s: *const c_char) -> c_int213 pub fn system(s: *const c_char) -> c_int; getenv(s: *const c_char) -> *mut c_char214 pub fn getenv(s: *const c_char) -> *mut c_char; getline( lineptr: *mut *mut c_char, n: *mut size_t, stream: *mut FILE, ) -> ssize_t215 pub fn getline( 216 lineptr: *mut *mut c_char, 217 n: *mut size_t, 218 stream: *mut FILE, 219 ) -> ssize_t; 220 strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char221 pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char; strncpy( dst: *mut c_char, src: *const c_char, n: size_t, ) -> *mut c_char222 pub fn strncpy( 223 dst: *mut c_char, 224 src: *const c_char, 225 n: size_t, 226 ) -> *mut c_char; strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char227 pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char; strncat( s: *mut c_char, ct: *const c_char, n: size_t, ) -> *mut c_char228 pub fn strncat( 229 s: *mut c_char, 230 ct: *const c_char, 231 n: size_t, 232 ) -> *mut c_char; strcmp(cs: *const c_char, ct: *const c_char) -> c_int233 pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int; strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int234 pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int; strcoll(cs: *const c_char, ct: *const c_char) -> c_int235 pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int; strchr(cs: *const c_char, c: c_int) -> *mut c_char236 pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char; strrchr(cs: *const c_char, c: c_int) -> *mut c_char237 pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char; strspn(cs: *const c_char, ct: *const c_char) -> size_t238 pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t; strcspn(cs: *const c_char, ct: *const c_char) -> size_t239 pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t; strdup(cs: *const c_char) -> *mut c_char240 pub fn strdup(cs: *const c_char) -> *mut c_char; strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char241 pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char; strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char242 pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char; strcasecmp(s1: *const c_char, s2: *const c_char) -> c_int243 pub fn strcasecmp(s1: *const c_char, s2: *const c_char) -> c_int; strncasecmp( s1: *const c_char, s2: *const c_char, n: size_t, ) -> c_int244 pub fn strncasecmp( 245 s1: *const c_char, 246 s2: *const c_char, 247 n: size_t, 248 ) -> c_int; strlen(cs: *const c_char) -> size_t249 pub fn strlen(cs: *const c_char) -> size_t; strnlen(cs: *const c_char, maxlen: size_t) -> size_t250 pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t; strerror(n: c_int) -> *mut c_char251 pub fn strerror(n: c_int) -> *mut c_char; strtok(s: *mut c_char, t: *const c_char) -> *mut c_char252 pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char; strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t253 pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t; wcslen(buf: *const wchar_t) -> size_t254 pub fn wcslen(buf: *const wchar_t) -> size_t; wcstombs( dest: *mut c_char, src: *const wchar_t, n: size_t, ) -> ::size_t255 pub fn wcstombs( 256 dest: *mut c_char, 257 src: *const wchar_t, 258 n: size_t, 259 ) -> ::size_t; 260 memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void261 pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; wmemchr(cx: *const wchar_t, c: wchar_t, n: size_t) -> *mut wchar_t262 pub fn wmemchr(cx: *const wchar_t, c: wchar_t, n: size_t) -> *mut wchar_t; memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int263 pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int; memcpy( dest: *mut c_void, src: *const c_void, n: size_t, ) -> *mut c_void264 pub fn memcpy( 265 dest: *mut c_void, 266 src: *const c_void, 267 n: size_t, 268 ) -> *mut c_void; memmove( dest: *mut c_void, src: *const c_void, n: size_t, ) -> *mut c_void269 pub fn memmove( 270 dest: *mut c_void, 271 src: *const c_void, 272 n: size_t, 273 ) -> *mut c_void; memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void274 pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void; 275 abs(i: c_int) -> c_int276 pub fn abs(i: c_int) -> c_int; atof(s: *const c_char) -> c_double277 pub fn atof(s: *const c_char) -> c_double; labs(i: c_long) -> c_long278 pub fn labs(i: c_long) -> c_long; rand() -> c_int279 pub fn rand() -> c_int; srand(seed: c_uint)280 pub fn srand(seed: c_uint); 281 arc4random_buf(buf: *const ::c_void, len: ::size_t)282 pub fn arc4random_buf(buf: *const ::c_void, len: ::size_t); freeaddrinfo(res: *mut addrinfo)283 pub fn freeaddrinfo(res: *mut addrinfo); gai_strerror(errcode: ::c_int) -> *const ::c_char284 pub fn gai_strerror(errcode: ::c_int) -> *const ::c_char; getaddrinfo( node: *const c_char, service: *const c_char, hints: *const addrinfo, res: *mut *mut addrinfo, ) -> ::c_int285 pub fn getaddrinfo( 286 node: *const c_char, 287 service: *const c_char, 288 hints: *const addrinfo, 289 res: *mut *mut addrinfo, 290 ) -> ::c_int; getsockopt( sockfd: ::c_int, level: ::c_int, optname: ::c_int, optval: *mut ::c_void, optlen: *mut ::socklen_t, ) -> ::c_int291 pub fn getsockopt( 292 sockfd: ::c_int, 293 level: ::c_int, 294 optname: ::c_int, 295 optval: *mut ::c_void, 296 optlen: *mut ::socklen_t, 297 ) -> ::c_int; posix_memalign( memptr: *mut *mut ::c_void, align: ::size_t, size: ::size_t, ) -> ::c_int298 pub fn posix_memalign( 299 memptr: *mut *mut ::c_void, 300 align: ::size_t, 301 size: ::size_t, 302 ) -> ::c_int; pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int303 pub fn pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int; pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int304 pub fn pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int; pthread_attr_setstacksize( attr: *mut ::pthread_attr_t, stack_size: ::size_t, ) -> ::c_int305 pub fn pthread_attr_setstacksize( 306 attr: *mut ::pthread_attr_t, 307 stack_size: ::size_t, 308 ) -> ::c_int; pthread_create( native: *mut ::pthread_t, attr: *const ::pthread_attr_t, f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, value: *mut ::c_void, ) -> ::c_int309 pub fn pthread_create( 310 native: *mut ::pthread_t, 311 attr: *const ::pthread_attr_t, 312 f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, 313 value: *mut ::c_void, 314 ) -> ::c_int; pthread_detach(thread: ::pthread_t) -> ::c_int315 pub fn pthread_detach(thread: ::pthread_t) -> ::c_int; pthread_getspecific(key: pthread_key_t) -> *mut ::c_void316 pub fn pthread_getspecific(key: pthread_key_t) -> *mut ::c_void; pthread_join( native: ::pthread_t, value: *mut *mut ::c_void, ) -> ::c_int317 pub fn pthread_join( 318 native: ::pthread_t, 319 value: *mut *mut ::c_void, 320 ) -> ::c_int; pthread_key_create( key: *mut pthread_key_t, dtor: ::Option<unsafe extern "C" fn(*mut ::c_void)>, ) -> ::c_int321 pub fn pthread_key_create( 322 key: *mut pthread_key_t, 323 dtor: ::Option<unsafe extern "C" fn(*mut ::c_void)>, 324 ) -> ::c_int; pthread_key_delete(key: pthread_key_t) -> ::c_int325 pub fn pthread_key_delete(key: pthread_key_t) -> ::c_int; pthread_setspecific( key: pthread_key_t, value: *const ::c_void, ) -> ::c_int326 pub fn pthread_setspecific( 327 key: pthread_key_t, 328 value: *const ::c_void, 329 ) -> ::c_int; send( socket: ::c_int, buf: *const ::c_void, len: ::size_t, flags: ::c_int, ) -> ::ssize_t330 pub fn send( 331 socket: ::c_int, 332 buf: *const ::c_void, 333 len: ::size_t, 334 flags: ::c_int, 335 ) -> ::ssize_t; sysconf(name: ::c_int) -> ::c_long336 pub fn sysconf(name: ::c_int) -> ::c_long; 337 } 338 339 cfg_if! { 340 if #[cfg(target_arch = "aarch64")] { 341 mod aarch64; 342 pub use self::aarch64::*; 343 } else if #[cfg(any(target_arch = "arm"))] { 344 mod arm; 345 pub use self::arm::*; 346 } else if #[cfg(any(target_arch = "x86"))] { 347 mod x86; 348 pub use self::x86::*; 349 } else if #[cfg(any(target_arch = "x86_64"))] { 350 mod x86_64; 351 pub use self::x86_64::*; 352 } else { 353 // Unknown target_arch 354 } 355 } 356 357 cfg_if! { 358 if #[cfg(libc_core_cvoid)] { 359 pub use ::ffi::c_void; 360 } else { 361 // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help 362 // enable more optimization opportunities around it recognizing things 363 // like malloc/free. 364 #[repr(u8)] 365 #[allow(missing_copy_implementations)] 366 #[allow(missing_debug_implementations)] 367 pub enum c_void { 368 // Two dummy variants so the #[repr] attribute can be used. 369 #[doc(hidden)] 370 __variant1, 371 #[doc(hidden)] 372 __variant2, 373 } 374 } 375 } 376