1 pub type int8_t = i8;
2 pub type int16_t = i16;
3 pub type int32_t = i32;
4 pub type int64_t = i64;
5 pub type uint8_t = u8;
6 pub type uint16_t = u16;
7 pub type uint32_t = u32;
8 pub type uint64_t = u64;
9 
10 pub type c_schar = i8;
11 pub type c_uchar = u8;
12 pub type c_short = i16;
13 pub type c_ushort = u16;
14 pub type c_int = i32;
15 pub type c_uint = u32;
16 pub type c_float = f32;
17 pub type c_double = f64;
18 pub type c_longlong = i64;
19 pub type c_ulonglong = u64;
20 pub type intmax_t = i64;
21 pub type uintmax_t = u64;
22 
23 pub type size_t = usize;
24 pub type ptrdiff_t = isize;
25 pub type intptr_t = isize;
26 pub type uintptr_t = usize;
27 pub type ssize_t = isize;
28 
29 pub type in_addr_t = u32;
30 pub type in_port_t = u16;
31 pub type pthread_key_t = usize;
32 pub type pthread_t = usize;
33 pub type sa_family_t = u8;
34 pub type socklen_t = usize;
35 pub type time_t = i64;
36 
37 s! {
38     pub struct addrinfo {
39         pub ai_flags: ::c_int,
40         pub ai_family: ::c_int,
41         pub ai_socktype: ::c_int,
42         pub ai_protocol: ::c_int,
43         pub ai_addrlen: ::socklen_t,
44         pub ai_addr: *mut ::sockaddr,
45         pub ai_canonname: *mut ::c_char,
46         pub ai_next: *mut addrinfo,
47     }
48 
49     pub struct in_addr {
50         pub s_addr: in_addr_t,
51     }
52 
53     pub struct in6_addr {
54         pub s6_addr: [u8; 16],
55     }
56 
57     pub struct pthread_attr_t {
58         __detachstate: ::c_int,
59         __stacksize: usize,
60     }
61 
62     pub struct sockaddr {
63         pub sa_family: sa_family_t,
64         pub sa_data: [::c_char; 0],
65     }
66 
67     pub struct sockaddr_in {
68         pub sin_family: ::sa_family_t,
69         pub sin_port: ::in_port_t,
70         pub sin_addr: ::in_addr,
71     }
72 
73     pub struct sockaddr_in6 {
74         pub sin6_family: sa_family_t,
75         pub sin6_port: ::in_port_t,
76         pub sin6_flowinfo: u32,
77         pub sin6_addr: ::in6_addr,
78         pub sin6_scope_id: u32,
79     }
80 
81     pub struct sockaddr_storage {
82         pub ss_family: ::sa_family_t,
83         __ss_data: [u8; 32],
84     }
85 }
86 
87 pub const INT_MIN: c_int = -2147483648;
88 pub const INT_MAX: c_int = 2147483647;
89 
90 pub const _SC_NPROCESSORS_ONLN: ::c_int = 52;
91 pub const _SC_PAGESIZE: ::c_int = 54;
92 
93 pub const AF_INET: ::c_int = 1;
94 pub const AF_INET6: ::c_int = 2;
95 
96 pub const EACCES: ::c_int = 2;
97 pub const EADDRINUSE: ::c_int = 3;
98 pub const EADDRNOTAVAIL: ::c_int = 4;
99 pub const EAGAIN: ::c_int = 6;
100 pub const ECONNABORTED: ::c_int = 13;
101 pub const ECONNREFUSED: ::c_int = 14;
102 pub const ECONNRESET: ::c_int = 15;
103 pub const EEXIST: ::c_int = 20;
104 pub const EINTR: ::c_int = 27;
105 pub const EINVAL: ::c_int = 28;
106 pub const ENOENT: ::c_int = 44;
107 pub const ENOTCONN: ::c_int = 53;
108 pub const EPERM: ::c_int = 63;
109 pub const EPIPE: ::c_int = 64;
110 pub const ETIMEDOUT: ::c_int = 73;
111 pub const EWOULDBLOCK: ::c_int = EAGAIN;
112 
113 pub const EAI_SYSTEM: ::c_int = 9;
114 
115 pub const EXIT_FAILURE: ::c_int = 1;
116 pub const EXIT_SUCCESS: ::c_int = 0;
117 
118 pub const PTHREAD_STACK_MIN: ::size_t = 1024;
119 
120 pub const SOCK_DGRAM: ::c_int = 128;
121 pub const SOCK_STREAM: ::c_int = 130;
122 
123 #[cfg_attr(feature = "extra_traits", derive(Debug))]
124 pub enum FILE {}
125 impl ::Copy for FILE {}
126 impl ::Clone for FILE {
clone(&self) -> FILE127     fn clone(&self) -> FILE { *self }
128 }
129 #[cfg_attr(feature = "extra_traits", derive(Debug))]
130 pub enum fpos_t {} // TODO: fill this out with a struct
131 impl ::Copy for fpos_t {}
132 impl ::Clone for fpos_t {
clone(&self) -> fpos_t133     fn clone(&self) -> fpos_t { *self }
134 }
135 
136 extern {
isalnum(c: c_int) -> c_int137     pub fn isalnum(c: c_int) -> c_int;
isalpha(c: c_int) -> c_int138     pub fn isalpha(c: c_int) -> c_int;
iscntrl(c: c_int) -> c_int139     pub fn iscntrl(c: c_int) -> c_int;
isdigit(c: c_int) -> c_int140     pub fn isdigit(c: c_int) -> c_int;
isgraph(c: c_int) -> c_int141     pub fn isgraph(c: c_int) -> c_int;
islower(c: c_int) -> c_int142     pub fn islower(c: c_int) -> c_int;
isprint(c: c_int) -> c_int143     pub fn isprint(c: c_int) -> c_int;
ispunct(c: c_int) -> c_int144     pub fn ispunct(c: c_int) -> c_int;
isspace(c: c_int) -> c_int145     pub fn isspace(c: c_int) -> c_int;
isupper(c: c_int) -> c_int146     pub fn isupper(c: c_int) -> c_int;
isxdigit(c: c_int) -> c_int147     pub fn isxdigit(c: c_int) -> c_int;
tolower(c: c_int) -> c_int148     pub fn tolower(c: c_int) -> c_int;
toupper(c: c_int) -> c_int149     pub fn toupper(c: c_int) -> c_int;
fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE150     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 FILE151     pub fn freopen(filename: *const c_char, mode: *const c_char,
152                    file: *mut FILE) -> *mut FILE;
fflush(file: *mut FILE) -> c_int153     pub fn fflush(file: *mut FILE) -> c_int;
fclose(file: *mut FILE) -> c_int154     pub fn fclose(file: *mut FILE) -> c_int;
remove(filename: *const c_char) -> c_int155     pub fn remove(filename: *const c_char) -> c_int;
rename(oldname: *const c_char, newname: *const c_char) -> c_int156     pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int;
tmpfile() -> *mut FILE157     pub fn tmpfile() -> *mut FILE;
setvbuf(stream: *mut FILE, buffer: *mut c_char, mode: c_int, size: size_t) -> c_int158     pub fn setvbuf(stream: *mut FILE, buffer: *mut c_char, mode: c_int,
159                    size: size_t) -> c_int;
setbuf(stream: *mut FILE, buf: *mut c_char)160     pub fn setbuf(stream: *mut FILE, buf: *mut c_char);
getchar() -> c_int161     pub fn getchar() -> c_int;
putchar(c: c_int) -> c_int162     pub fn putchar(c: c_int) -> c_int;
fgetc(stream: *mut FILE) -> c_int163     pub fn fgetc(stream: *mut FILE) -> c_int;
fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char164     pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char;
fputc(c: c_int, stream: *mut FILE) -> c_int165     pub fn fputc(c: c_int, stream: *mut FILE) -> c_int;
fputs(s: *const c_char, stream: *mut FILE) -> c_int166     pub fn fputs(s: *const c_char, stream: *mut FILE) -> c_int;
puts(s: *const c_char) -> c_int167     pub fn puts(s: *const c_char) -> c_int;
ungetc(c: c_int, stream: *mut FILE) -> c_int168     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_t169     pub fn fread(ptr: *mut c_void, size: size_t, nobj: size_t,
170                  stream: *mut FILE) -> size_t;
fwrite(ptr: *const c_void, size: size_t, nobj: size_t, stream: *mut FILE) -> size_t171     pub fn fwrite(ptr: *const c_void, size: size_t, nobj: size_t,
172                   stream: *mut FILE) -> size_t;
fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int173     pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int;
ftell(stream: *mut FILE) -> c_long174     pub fn ftell(stream: *mut FILE) -> c_long;
rewind(stream: *mut FILE)175     pub fn rewind(stream: *mut FILE);
fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int176     pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int;
fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int177     pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int;
feof(stream: *mut FILE) -> c_int178     pub fn feof(stream: *mut FILE) -> c_int;
ferror(stream: *mut FILE) -> c_int179     pub fn ferror(stream: *mut FILE) -> c_int;
perror(s: *const c_char)180     pub fn perror(s: *const c_char);
atoi(s: *const c_char) -> c_int181     pub fn atoi(s: *const c_char) -> c_int;
strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double182     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_long183     pub fn strtol(s: *const c_char, endp: *mut *mut c_char,
184                   base: c_int) -> c_long;
strtoul(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulong185     pub fn strtoul(s: *const c_char, endp: *mut *mut c_char,
186                    base: c_int) -> c_ulong;
calloc(nobj: size_t, size: size_t) -> *mut c_void187     pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void;
malloc(size: size_t) -> *mut c_void188     pub fn malloc(size: size_t) -> *mut c_void;
realloc(p: *mut c_void, size: size_t) -> *mut c_void189     pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void;
free(p: *mut c_void)190     pub fn free(p: *mut c_void);
abort() -> !191     pub fn abort() -> !;
exit(status: c_int) -> !192     pub fn exit(status: c_int) -> !;
_exit(status: c_int) -> !193     pub fn _exit(status: c_int) -> !;
atexit(cb: extern fn()) -> c_int194     pub fn atexit(cb: extern fn()) -> c_int;
system(s: *const c_char) -> c_int195     pub fn system(s: *const c_char) -> c_int;
getenv(s: *const c_char) -> *mut c_char196     pub fn getenv(s: *const c_char) -> *mut c_char;
getline(lineptr: *mut *mut c_char, n: *mut size_t, stream: *mut FILE) -> ssize_t197     pub fn getline (lineptr: *mut *mut c_char, n: *mut size_t,
198         stream: *mut FILE) -> ssize_t;
199 
strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char200     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_char201     pub fn strncpy(dst: *mut c_char, src: *const c_char,
202                    n: size_t) -> *mut c_char;
strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char203     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_char204     pub fn strncat(s: *mut c_char, ct: *const c_char, n: size_t) -> *mut c_char;
strcmp(cs: *const c_char, ct: *const c_char) -> c_int205     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_int206     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_int207     pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int;
strchr(cs: *const c_char, c: c_int) -> *mut c_char208     pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char;
strrchr(cs: *const c_char, c: c_int) -> *mut c_char209     pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char;
strspn(cs: *const c_char, ct: *const c_char) -> size_t210     pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t;
strcspn(cs: *const c_char, ct: *const c_char) -> size_t211     pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t;
strdup(cs: *const c_char) -> *mut c_char212     pub fn strdup(cs: *const c_char) -> *mut c_char;
strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char213     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_char214     pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char;
strcasecmp(s1: *const c_char, s2: *const c_char) -> c_int215     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_int216     pub fn strncasecmp(s1: *const c_char, s2: *const c_char,
217                        n: size_t) -> c_int;
strlen(cs: *const c_char) -> size_t218     pub fn strlen(cs: *const c_char) -> size_t;
strnlen(cs: *const c_char, maxlen: size_t) -> size_t219     pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t;
strerror(n: c_int) -> *mut c_char220     pub fn strerror(n: c_int) -> *mut c_char;
strtok(s: *mut c_char, t: *const c_char) -> *mut c_char221     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_t222     pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t;
wcslen(buf: *const wchar_t) -> size_t223     pub fn wcslen(buf: *const wchar_t) -> size_t;
wcstombs(dest: *mut c_char, src: *const wchar_t, n: size_t) -> ::size_t224     pub fn wcstombs(dest: *mut c_char, src: *const wchar_t,
225                     n: size_t) -> ::size_t;
226 
memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void227     pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void;
memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int228     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_void229     pub fn memcpy(dest: *mut c_void, src: *const c_void,
230                   n: size_t) -> *mut c_void;
memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void231     pub fn memmove(dest: *mut c_void, src: *const c_void,
232                    n: size_t) -> *mut c_void;
memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void233     pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void;
234 
abs(i: c_int) -> c_int235     pub fn abs(i: c_int) -> c_int;
atof(s: *const c_char) -> c_double236     pub fn atof(s: *const c_char) -> c_double;
labs(i: c_long) -> c_long237     pub fn labs(i: c_long) -> c_long;
rand() -> c_int238     pub fn rand() -> c_int;
srand(seed: c_uint)239     pub fn srand(seed: c_uint);
240 
arc4random_buf(buf: *const ::c_void, len: ::size_t)241     pub fn arc4random_buf(buf: *const ::c_void, len: ::size_t);
freeaddrinfo(res: *mut addrinfo)242     pub fn freeaddrinfo(res: *mut addrinfo);
gai_strerror(errcode: ::c_int) -> *const ::c_char243     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_int244     pub fn getaddrinfo(
245         node: *const c_char,
246         service: *const c_char,
247         hints: *const addrinfo,
248         res: *mut *mut addrinfo,
249     ) -> ::c_int;
getsockopt( sockfd: ::c_int, level: ::c_int, optname: ::c_int, optval: *mut ::c_void, optlen: *mut ::socklen_t, ) -> ::c_int250     pub fn getsockopt(
251         sockfd: ::c_int,
252         level: ::c_int,
253         optname: ::c_int,
254         optval: *mut ::c_void,
255         optlen: *mut ::socklen_t,
256     ) -> ::c_int;
posix_memalign( memptr: *mut *mut ::c_void, align: ::size_t, size: ::size_t, ) -> ::c_int257     pub fn posix_memalign(
258         memptr: *mut *mut ::c_void,
259         align: ::size_t,
260         size: ::size_t,
261     ) -> ::c_int;
pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int262     pub fn pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int;
pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int263     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_int264     pub fn pthread_attr_setstacksize(
265         attr: *mut ::pthread_attr_t,
266         stack_size: ::size_t,
267     ) -> ::c_int;
pthread_create( native: *mut ::pthread_t, attr: *const ::pthread_attr_t, f: extern fn(*mut ::c_void) -> *mut ::c_void, value: *mut ::c_void, ) -> ::c_int268     pub fn pthread_create(
269         native: *mut ::pthread_t,
270         attr: *const ::pthread_attr_t,
271         f: extern fn(*mut ::c_void) -> *mut ::c_void,
272         value: *mut ::c_void,
273     ) -> ::c_int;
pthread_detach(thread: ::pthread_t) -> ::c_int274     pub fn pthread_detach(thread: ::pthread_t) -> ::c_int;
pthread_getspecific(key: pthread_key_t) -> *mut ::c_void275     pub fn pthread_getspecific(key: pthread_key_t) -> *mut ::c_void;
pthread_join( native: ::pthread_t, value: *mut *mut ::c_void, ) -> ::c_int276     pub fn pthread_join(
277         native: ::pthread_t,
278         value: *mut *mut ::c_void,
279     ) -> ::c_int;
pthread_key_create( key: *mut pthread_key_t, dtor: ::Option<unsafe extern fn(*mut ::c_void)>, ) -> ::c_int280     pub fn pthread_key_create(
281         key: *mut pthread_key_t,
282         dtor: ::Option<unsafe extern fn(*mut ::c_void)>,
283     ) -> ::c_int;
pthread_key_delete(key: pthread_key_t) -> ::c_int284     pub fn pthread_key_delete(key: pthread_key_t) -> ::c_int;
pthread_setspecific( key: pthread_key_t, value: *const ::c_void, ) -> ::c_int285     pub fn pthread_setspecific(
286         key: pthread_key_t,
287         value: *const ::c_void,
288     ) -> ::c_int;
send( socket: ::c_int, buf: *const ::c_void, len: ::size_t, flags: ::c_int, ) -> ::ssize_t289     pub fn send(
290         socket: ::c_int,
291         buf: *const ::c_void,
292         len: ::size_t,
293         flags: ::c_int,
294     ) -> ::ssize_t;
sysconf(name: ::c_int) -> ::c_long295     pub fn sysconf(name: ::c_int) -> ::c_long;
296 }
297 
298 cfg_if! {
299     if #[cfg(target_arch = "aarch64")] {
300         mod aarch64;
301         pub use self::aarch64::*;
302     } else if #[cfg(any(target_arch = "arm"))] {
303         mod arm;
304         pub use self::arm::*;
305     } else if #[cfg(any(target_arch = "x86"))] {
306         mod x86;
307         pub use self::x86::*;
308     } else if #[cfg(any(target_arch = "x86_64"))] {
309         mod x86_64;
310         pub use self::x86_64::*;
311     } else {
312         // Unknown target_arch
313     }
314 }
315 
316 cfg_if! {
317     if #[cfg(libc_core_cvoid)] {
318         pub use ::ffi::c_void;
319     } else {
320         // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help
321         // enable more optimization opportunities around it recognizing things
322         // like malloc/free.
323         #[repr(u8)]
324         #[allow(missing_copy_implementations)]
325         #[allow(missing_debug_implementations)]
326         pub enum c_void {
327             // Two dummy variants so the #[repr] attribute can be used.
328             #[doc(hidden)]
329             __variant1,
330             #[doc(hidden)]
331             __variant2,
332         }
333     }
334 }
335