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