1 pub type c_char = i8;
2 pub type wchar_t = i32;
3 
4 cfg_if! {
5     if #[cfg(target_pointer_width = "32")] {
6         pub type c_long = i32;
7         pub type c_ulong = u32;
8     }
9 }
10 
11 cfg_if! {
12     if #[cfg(target_pointer_width = "64")] {
13         pub type c_long = i64;
14         pub type c_ulong = u64;
15     }
16 }
17 
18 pub type blkcnt_t = ::c_ulong;
19 pub type blksize_t = ::c_long;
20 pub type clock_t = ::c_long;
21 pub type clockid_t = ::c_int;
22 pub type dev_t = ::c_long;
23 pub type fsblkcnt_t = ::c_ulong;
24 pub type fsfilcnt_t = ::c_ulong;
25 pub type ino_t = ::c_ulonglong;
26 pub type mode_t = ::c_int;
27 pub type nfds_t = ::c_ulong;
28 pub type nlink_t = ::c_ulong;
29 pub type off_t = ::c_longlong;
30 pub type pthread_t = *mut ::c_void;
31 // Must be usize due to library/std/sys_common/thread_local.rs,
32 // should technically be *mut ::c_void
33 pub type pthread_key_t = usize;
34 pub type rlim_t = ::c_ulonglong;
35 pub type sa_family_t = u16;
36 pub type sem_t = *mut ::c_void;
37 pub type sigset_t = ::c_ulonglong;
38 pub type socklen_t = u32;
39 pub type speed_t = u32;
40 pub type suseconds_t = ::c_int;
41 pub type tcflag_t = u32;
42 pub type time_t = ::c_longlong;
43 pub type id_t = ::c_uint;
44 pub type pid_t = usize;
45 pub type uid_t = u32;
46 pub type gid_t = u32;
47 
48 #[cfg_attr(feature = "extra_traits", derive(Debug))]
49 pub enum timezone {}
50 impl ::Copy for timezone {}
51 impl ::Clone for timezone {
clone(&self) -> timezone52     fn clone(&self) -> timezone {
53         *self
54     }
55 }
56 
57 s_no_extra_traits! {
58     #[repr(C)]
59     pub struct utsname {
60         pub sysname: [::c_char; UTSLENGTH],
61         pub nodename: [::c_char; UTSLENGTH],
62         pub release: [::c_char; UTSLENGTH],
63         pub version: [::c_char; UTSLENGTH],
64         pub machine: [::c_char; UTSLENGTH],
65         pub domainname: [::c_char; UTSLENGTH],
66     }
67 
68     pub struct dirent {
69         pub d_ino: ::ino_t,
70         pub d_off: ::off_t,
71         pub d_reclen: ::c_ushort,
72         pub d_type: ::c_uchar,
73         pub d_name: [::c_char; 256],
74     }
75 
76     pub struct sockaddr_un {
77         pub sun_family: ::sa_family_t,
78         pub sun_path: [::c_char; 108]
79     }
80 
81     pub struct sockaddr_storage {
82         pub ss_family: ::sa_family_t,
83         __ss_padding: [
84             u8;
85             128 -
86             ::core::mem::size_of::<sa_family_t>() -
87             ::core::mem::size_of::<c_ulong>()
88         ],
89         __ss_align: ::c_ulong,
90     }
91 }
92 
93 s! {
94     pub struct addrinfo {
95         pub ai_flags: ::c_int,
96         pub ai_family: ::c_int,
97         pub ai_socktype: ::c_int,
98         pub ai_protocol: ::c_int,
99         pub ai_addrlen: ::size_t,
100         pub ai_canonname: *mut ::c_char,
101         pub ai_addr: *mut ::sockaddr,
102         pub ai_next: *mut ::addrinfo,
103     }
104 
105     pub struct Dl_info {
106         pub dli_fname: *const ::c_char,
107         pub dli_fbase: *mut ::c_void,
108         pub dli_sname: *const ::c_char,
109         pub dli_saddr: *mut ::c_void,
110     }
111 
112     pub struct epoll_event {
113         pub events: u32,
114         pub u64: u64,
115         pub _pad: u64,
116     }
117 
118     pub struct fd_set {
119         fds_bits: [::c_ulong; ::FD_SETSIZE / ULONG_SIZE],
120     }
121 
122     pub struct in_addr {
123         pub s_addr: ::in_addr_t,
124     }
125 
126     pub struct ip_mreq {
127         pub imr_multiaddr: ::in_addr,
128         pub imr_interface: ::in_addr,
129     }
130 
131     pub struct lconv {
132         pub currency_symbol: *const ::c_char,
133         pub decimal_point: *const ::c_char,
134         pub frac_digits: ::c_char,
135         pub grouping: *const ::c_char,
136         pub int_curr_symbol: *const ::c_char,
137         pub int_frac_digits: ::c_char,
138         pub mon_decimal_point: *const ::c_char,
139         pub mon_grouping: *const ::c_char,
140         pub mon_thousands_sep: *const ::c_char,
141         pub negative_sign: *const ::c_char,
142         pub n_cs_precedes: ::c_char,
143         pub n_sep_by_space: ::c_char,
144         pub n_sign_posn: ::c_char,
145         pub positive_sign: *const ::c_char,
146         pub p_cs_precedes: ::c_char,
147         pub p_sep_by_space: ::c_char,
148         pub p_sign_posn: ::c_char,
149         pub thousands_sep: *const ::c_char,
150     }
151 
152     pub struct passwd {
153         pub pw_name: *mut ::c_char,
154         pub pw_passwd: *mut ::c_char,
155         pub pw_uid: ::uid_t,
156         pub pw_gid: ::gid_t,
157         pub pw_gecos: *mut ::c_char,
158         pub pw_dir: *mut ::c_char,
159         pub pw_shell: *mut ::c_char,
160     }
161 
162     pub struct sigaction {
163         pub sa_sigaction: ::sighandler_t,
164         pub sa_flags: ::c_ulong,
165         pub sa_restorer: ::Option<extern fn()>,
166         pub sa_mask: ::sigset_t,
167     }
168 
169     pub struct siginfo_t {
170         pub si_signo: ::c_int,
171         pub si_errno: ::c_int,
172         pub si_code: ::c_int,
173         _pad: [::c_int; 29],
174         _align: [usize; 0],
175     }
176 
177     pub struct sockaddr {
178         pub sa_family: ::sa_family_t,
179         pub sa_data: [::c_char; 14],
180     }
181 
182     pub struct sockaddr_in {
183         pub sin_family: ::sa_family_t,
184         pub sin_port: ::in_port_t,
185         pub sin_addr: ::in_addr,
186         pub sin_zero: [::c_char; 8],
187     }
188 
189     pub struct sockaddr_in6 {
190         pub sin6_family: ::sa_family_t,
191         pub sin6_port: ::in_port_t,
192         pub sin6_flowinfo: u32,
193         pub sin6_addr: ::in6_addr,
194         pub sin6_scope_id: u32,
195     }
196 
197     pub struct stat {
198         pub st_dev: ::dev_t,
199         pub st_ino: ::ino_t,
200         pub st_nlink: ::nlink_t,
201         pub st_mode: ::mode_t,
202         pub st_uid: ::uid_t,
203         pub st_gid: ::gid_t,
204         pub st_rdev: ::dev_t,
205         pub st_size: ::off_t,
206         pub st_blksize: ::blksize_t,
207         pub st_blocks: ::blkcnt_t,
208         pub st_atime: ::time_t,
209         pub st_atime_nsec: ::c_long,
210         pub st_mtime: ::time_t,
211         pub st_mtime_nsec: ::c_long,
212         pub st_ctime: ::time_t,
213         pub st_ctime_nsec: ::c_long,
214         _pad: [::c_char; 24],
215     }
216 
217     pub struct statvfs {
218         pub f_bsize: ::c_ulong,
219         pub f_frsize: ::c_ulong,
220         pub f_blocks: ::fsblkcnt_t,
221         pub f_bfree: ::fsblkcnt_t,
222         pub f_bavail: ::fsblkcnt_t,
223         pub f_files: ::fsfilcnt_t,
224         pub f_ffree: ::fsfilcnt_t,
225         pub f_favail: ::fsfilcnt_t,
226         pub f_fsid: ::c_ulong,
227         pub f_flag: ::c_ulong,
228         pub f_namemax: ::c_ulong,
229     }
230 
231     pub struct termios {
232         pub c_iflag: ::tcflag_t,
233         pub c_oflag: ::tcflag_t,
234         pub c_cflag: ::tcflag_t,
235         pub c_lflag: ::tcflag_t,
236         pub c_line: ::cc_t,
237         pub c_cc: [::cc_t; ::NCCS],
238         pub c_ispeed: ::speed_t,
239         pub c_ospeed: ::speed_t,
240     }
241 
242     pub struct tm {
243         pub tm_sec: ::c_int,
244         pub tm_min: ::c_int,
245         pub tm_hour: ::c_int,
246         pub tm_mday: ::c_int,
247         pub tm_mon: ::c_int,
248         pub tm_year: ::c_int,
249         pub tm_wday: ::c_int,
250         pub tm_yday: ::c_int,
251         pub tm_isdst: ::c_int,
252         pub tm_gmtoff: ::c_long,
253         pub tm_zone: *const ::c_char,
254     }
255 
256     pub struct ucred {
257         pub pid: pid_t,
258         pub uid: uid_t,
259         pub gid: gid_t,
260     }
261 
262     #[cfg_attr(target_pointer_width = "32", repr(C, align(4)))]
263     #[cfg_attr(target_pointer_width = "64", repr(C, align(8)))]
264     pub struct pthread_attr_t {
265         bytes: [u8; _PTHREAD_ATTR_SIZE],
266     }
267     #[repr(C)]
268     #[repr(align(4))]
269     pub struct pthread_barrier_t {
270         bytes: [u8; _PTHREAD_BARRIER_SIZE],
271     }
272     #[repr(C)]
273     #[repr(align(4))]
274     pub struct pthread_barrierattr_t {
275         bytes: [u8; _PTHREAD_BARRIERATTR_SIZE],
276     }
277     #[repr(C)]
278     #[repr(align(4))]
279     pub struct pthread_mutex_t {
280         bytes: [u8; _PTHREAD_MUTEX_SIZE],
281     }
282     #[repr(C)]
283     #[repr(align(4))]
284     pub struct pthread_rwlock_t {
285         bytes: [u8; _PTHREAD_RWLOCK_SIZE],
286     }
287     #[repr(C)]
288     #[repr(align(4))]
289     pub struct pthread_mutexattr_t {
290         bytes: [u8; _PTHREAD_MUTEXATTR_SIZE],
291     }
292     #[repr(C)]
293     #[repr(align(1))]
294     pub struct pthread_rwlockattr_t {
295         bytes: [u8; _PTHREAD_RWLOCKATTR_SIZE],
296     }
297     #[repr(C)]
298     #[repr(align(4))]
299     pub struct pthread_cond_t {
300         bytes: [u8; _PTHREAD_COND_SIZE],
301     }
302     #[repr(C)]
303     #[repr(align(4))]
304     pub struct pthread_condattr_t {
305         bytes: [u8; _PTHREAD_CONDATTR_SIZE],
306     }
307     #[repr(C)]
308     #[repr(align(4))]
309     pub struct pthread_once_t {
310         bytes: [u8; _PTHREAD_ONCE_SIZE],
311     }
312     #[repr(C)]
313     #[repr(align(4))]
314     pub struct pthread_spinlock_t {
315         bytes: [u8; _PTHREAD_SPINLOCK_SIZE],
316     }
317 }
318 const _PTHREAD_ATTR_SIZE: usize = 32;
319 const _PTHREAD_RWLOCKATTR_SIZE: usize = 1;
320 const _PTHREAD_RWLOCK_SIZE: usize = 4;
321 const _PTHREAD_BARRIER_SIZE: usize = 24;
322 const _PTHREAD_BARRIERATTR_SIZE: usize = 4;
323 const _PTHREAD_CONDATTR_SIZE: usize = 8;
324 const _PTHREAD_COND_SIZE: usize = 8;
325 const _PTHREAD_MUTEX_SIZE: usize = 12;
326 const _PTHREAD_MUTEXATTR_SIZE: usize = 20;
327 const _PTHREAD_ONCE_SIZE: usize = 4;
328 const _PTHREAD_SPINLOCK_SIZE: usize = 4;
329 
330 pub const UTSLENGTH: usize = 65;
331 
332 // intentionally not public, only used for fd_set
333 cfg_if! {
334     if #[cfg(target_pointer_width = "32")] {
335         const ULONG_SIZE: usize = 32;
336     } else if #[cfg(target_pointer_width = "64")] {
337         const ULONG_SIZE: usize = 64;
338     } else {
339         // Unknown target_pointer_width
340     }
341 }
342 
343 // limits.h
344 pub const PATH_MAX: ::c_int = 4096;
345 
346 // fcntl.h
347 pub const F_GETLK: ::c_int = 5;
348 pub const F_SETLK: ::c_int = 6;
349 pub const F_SETLKW: ::c_int = 7;
350 pub const F_ULOCK: ::c_int = 0;
351 pub const F_LOCK: ::c_int = 1;
352 pub const F_TLOCK: ::c_int = 2;
353 pub const F_TEST: ::c_int = 3;
354 
355 // FIXME: relibc {
356 pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void;
357 // }
358 
359 // dlfcn.h
360 pub const RTLD_LAZY: ::c_int = 0x0001;
361 pub const RTLD_NOW: ::c_int = 0x0002;
362 pub const RTLD_GLOBAL: ::c_int = 0x0100;
363 pub const RTLD_LOCAL: ::c_int = 0x0000;
364 
365 // errno.h
366 pub const EPERM: ::c_int = 1; /* Operation not permitted */
367 pub const ENOENT: ::c_int = 2; /* No such file or directory */
368 pub const ESRCH: ::c_int = 3; /* No such process */
369 pub const EINTR: ::c_int = 4; /* Interrupted system call */
370 pub const EIO: ::c_int = 5; /* I/O error */
371 pub const ENXIO: ::c_int = 6; /* No such device or address */
372 pub const E2BIG: ::c_int = 7; /* Argument list too long */
373 pub const ENOEXEC: ::c_int = 8; /* Exec format error */
374 pub const EBADF: ::c_int = 9; /* Bad file number */
375 pub const ECHILD: ::c_int = 10; /* No child processes */
376 pub const EAGAIN: ::c_int = 11; /* Try again */
377 pub const ENOMEM: ::c_int = 12; /* Out of memory */
378 pub const EACCES: ::c_int = 13; /* Permission denied */
379 pub const EFAULT: ::c_int = 14; /* Bad address */
380 pub const ENOTBLK: ::c_int = 15; /* Block device required */
381 pub const EBUSY: ::c_int = 16; /* Device or resource busy */
382 pub const EEXIST: ::c_int = 17; /* File exists */
383 pub const EXDEV: ::c_int = 18; /* Cross-device link */
384 pub const ENODEV: ::c_int = 19; /* No such device */
385 pub const ENOTDIR: ::c_int = 20; /* Not a directory */
386 pub const EISDIR: ::c_int = 21; /* Is a directory */
387 pub const EINVAL: ::c_int = 22; /* Invalid argument */
388 pub const ENFILE: ::c_int = 23; /* File table overflow */
389 pub const EMFILE: ::c_int = 24; /* Too many open files */
390 pub const ENOTTY: ::c_int = 25; /* Not a typewriter */
391 pub const ETXTBSY: ::c_int = 26; /* Text file busy */
392 pub const EFBIG: ::c_int = 27; /* File too large */
393 pub const ENOSPC: ::c_int = 28; /* No space left on device */
394 pub const ESPIPE: ::c_int = 29; /* Illegal seek */
395 pub const EROFS: ::c_int = 30; /* Read-only file system */
396 pub const EMLINK: ::c_int = 31; /* Too many links */
397 pub const EPIPE: ::c_int = 32; /* Broken pipe */
398 pub const EDOM: ::c_int = 33; /* Math argument out of domain of func */
399 pub const ERANGE: ::c_int = 34; /* Math result not representable */
400 pub const EDEADLK: ::c_int = 35; /* Resource deadlock would occur */
401 pub const ENAMETOOLONG: ::c_int = 36; /* File name too long */
402 pub const ENOLCK: ::c_int = 37; /* No record locks available */
403 pub const ENOSYS: ::c_int = 38; /* Function not implemented */
404 pub const ENOTEMPTY: ::c_int = 39; /* Directory not empty */
405 pub const ELOOP: ::c_int = 40; /* Too many symbolic links encountered */
406 pub const EWOULDBLOCK: ::c_int = 41; /* Operation would block */
407 pub const ENOMSG: ::c_int = 42; /* No message of desired type */
408 pub const EIDRM: ::c_int = 43; /* Identifier removed */
409 pub const ECHRNG: ::c_int = 44; /* Channel number out of range */
410 pub const EL2NSYNC: ::c_int = 45; /* Level 2 not synchronized */
411 pub const EL3HLT: ::c_int = 46; /* Level 3 halted */
412 pub const EL3RST: ::c_int = 47; /* Level 3 reset */
413 pub const ELNRNG: ::c_int = 48; /* Link number out of range */
414 pub const EUNATCH: ::c_int = 49; /* Protocol driver not attached */
415 pub const ENOCSI: ::c_int = 50; /* No CSI structure available */
416 pub const EL2HLT: ::c_int = 51; /* Level 2 halted */
417 pub const EBADE: ::c_int = 52; /* Invalid exchange */
418 pub const EBADR: ::c_int = 53; /* Invalid request descriptor */
419 pub const EXFULL: ::c_int = 54; /* Exchange full */
420 pub const ENOANO: ::c_int = 55; /* No anode */
421 pub const EBADRQC: ::c_int = 56; /* Invalid request code */
422 pub const EBADSLT: ::c_int = 57; /* Invalid slot */
423 pub const EDEADLOCK: ::c_int = 58; /* Resource deadlock would occur */
424 pub const EBFONT: ::c_int = 59; /* Bad font file format */
425 pub const ENOSTR: ::c_int = 60; /* Device not a stream */
426 pub const ENODATA: ::c_int = 61; /* No data available */
427 pub const ETIME: ::c_int = 62; /* Timer expired */
428 pub const ENOSR: ::c_int = 63; /* Out of streams resources */
429 pub const ENONET: ::c_int = 64; /* Machine is not on the network */
430 pub const ENOPKG: ::c_int = 65; /* Package not installed */
431 pub const EREMOTE: ::c_int = 66; /* Object is remote */
432 pub const ENOLINK: ::c_int = 67; /* Link has been severed */
433 pub const EADV: ::c_int = 68; /* Advertise error */
434 pub const ESRMNT: ::c_int = 69; /* Srmount error */
435 pub const ECOMM: ::c_int = 70; /* Communication error on send */
436 pub const EPROTO: ::c_int = 71; /* Protocol error */
437 pub const EMULTIHOP: ::c_int = 72; /* Multihop attempted */
438 pub const EDOTDOT: ::c_int = 73; /* RFS specific error */
439 pub const EBADMSG: ::c_int = 74; /* Not a data message */
440 pub const EOVERFLOW: ::c_int = 75; /* Value too large for defined data type */
441 pub const ENOTUNIQ: ::c_int = 76; /* Name not unique on network */
442 pub const EBADFD: ::c_int = 77; /* File descriptor in bad state */
443 pub const EREMCHG: ::c_int = 78; /* Remote address changed */
444 pub const ELIBACC: ::c_int = 79; /* Can not access a needed shared library */
445 pub const ELIBBAD: ::c_int = 80; /* Accessing a corrupted shared library */
446 pub const ELIBSCN: ::c_int = 81; /* .lib section in a.out corrupted */
447 /* Attempting to link in too many shared libraries */
448 pub const ELIBMAX: ::c_int = 82;
449 pub const ELIBEXEC: ::c_int = 83; /* Cannot exec a shared library directly */
450 pub const EILSEQ: ::c_int = 84; /* Illegal byte sequence */
451 /* Interrupted system call should be restarted */
452 pub const ERESTART: ::c_int = 85;
453 pub const ESTRPIPE: ::c_int = 86; /* Streams pipe error */
454 pub const EUSERS: ::c_int = 87; /* Too many users */
455 pub const ENOTSOCK: ::c_int = 88; /* Socket operation on non-socket */
456 pub const EDESTADDRREQ: ::c_int = 89; /* Destination address required */
457 pub const EMSGSIZE: ::c_int = 90; /* Message too long */
458 pub const EPROTOTYPE: ::c_int = 91; /* Protocol wrong type for socket */
459 pub const ENOPROTOOPT: ::c_int = 92; /* Protocol not available */
460 pub const EPROTONOSUPPORT: ::c_int = 93; /* Protocol not supported */
461 pub const ESOCKTNOSUPPORT: ::c_int = 94; /* Socket type not supported */
462 /* Operation not supported on transport endpoint */
463 pub const EOPNOTSUPP: ::c_int = 95;
464 pub const ENOTSUP: ::c_int = EOPNOTSUPP;
465 pub const EPFNOSUPPORT: ::c_int = 96; /* Protocol family not supported */
466 /* Address family not supported by protocol */
467 pub const EAFNOSUPPORT: ::c_int = 97;
468 pub const EADDRINUSE: ::c_int = 98; /* Address already in use */
469 pub const EADDRNOTAVAIL: ::c_int = 99; /* Cannot assign requested address */
470 pub const ENETDOWN: ::c_int = 100; /* Network is down */
471 pub const ENETUNREACH: ::c_int = 101; /* Network is unreachable */
472 /* Network dropped connection because of reset */
473 pub const ENETRESET: ::c_int = 102;
474 pub const ECONNABORTED: ::c_int = 103; /* Software caused connection abort */
475 pub const ECONNRESET: ::c_int = 104; /* Connection reset by peer */
476 pub const ENOBUFS: ::c_int = 105; /* No buffer space available */
477 pub const EISCONN: ::c_int = 106; /* Transport endpoint is already connected */
478 pub const ENOTCONN: ::c_int = 107; /* Transport endpoint is not connected */
479 /* Cannot send after transport endpoint shutdown */
480 pub const ESHUTDOWN: ::c_int = 108;
481 pub const ETOOMANYREFS: ::c_int = 109; /* Too many references: cannot splice */
482 pub const ETIMEDOUT: ::c_int = 110; /* Connection timed out */
483 pub const ECONNREFUSED: ::c_int = 111; /* Connection refused */
484 pub const EHOSTDOWN: ::c_int = 112; /* Host is down */
485 pub const EHOSTUNREACH: ::c_int = 113; /* No route to host */
486 pub const EALREADY: ::c_int = 114; /* Operation already in progress */
487 pub const EINPROGRESS: ::c_int = 115; /* Operation now in progress */
488 pub const ESTALE: ::c_int = 116; /* Stale NFS file handle */
489 pub const EUCLEAN: ::c_int = 117; /* Structure needs cleaning */
490 pub const ENOTNAM: ::c_int = 118; /* Not a XENIX named type file */
491 pub const ENAVAIL: ::c_int = 119; /* No XENIX semaphores available */
492 pub const EISNAM: ::c_int = 120; /* Is a named type file */
493 pub const EREMOTEIO: ::c_int = 121; /* Remote I/O error */
494 pub const EDQUOT: ::c_int = 122; /* Quota exceeded */
495 pub const ENOMEDIUM: ::c_int = 123; /* No medium found */
496 pub const EMEDIUMTYPE: ::c_int = 124; /* Wrong medium type */
497 pub const ECANCELED: ::c_int = 125; /* Operation Canceled */
498 pub const ENOKEY: ::c_int = 126; /* Required key not available */
499 pub const EKEYEXPIRED: ::c_int = 127; /* Key has expired */
500 pub const EKEYREVOKED: ::c_int = 128; /* Key has been revoked */
501 pub const EKEYREJECTED: ::c_int = 129; /* Key was rejected by service */
502 pub const EOWNERDEAD: ::c_int = 130; /* Owner died */
503 pub const ENOTRECOVERABLE: ::c_int = 131; /* State not recoverable */
504 
505 // fcntl.h
506 pub const F_DUPFD: ::c_int = 0;
507 pub const F_GETFD: ::c_int = 1;
508 pub const F_SETFD: ::c_int = 2;
509 pub const F_GETFL: ::c_int = 3;
510 pub const F_SETFL: ::c_int = 4;
511 // FIXME: relibc {
512 pub const F_DUPFD_CLOEXEC: ::c_int = ::F_DUPFD;
513 // }
514 pub const FD_CLOEXEC: ::c_int = 0x0100_0000;
515 pub const O_RDONLY: ::c_int = 0x0001_0000;
516 pub const O_WRONLY: ::c_int = 0x0002_0000;
517 pub const O_RDWR: ::c_int = 0x0003_0000;
518 pub const O_ACCMODE: ::c_int = 0x0003_0000;
519 pub const O_NONBLOCK: ::c_int = 0x0004_0000;
520 pub const O_APPEND: ::c_int = 0x0008_0000;
521 pub const O_SHLOCK: ::c_int = 0x0010_0000;
522 pub const O_EXLOCK: ::c_int = 0x0020_0000;
523 pub const O_ASYNC: ::c_int = 0x0040_0000;
524 pub const O_FSYNC: ::c_int = 0x0080_0000;
525 pub const O_CLOEXEC: ::c_int = 0x0100_0000;
526 pub const O_CREAT: ::c_int = 0x0200_0000;
527 pub const O_TRUNC: ::c_int = 0x0400_0000;
528 pub const O_EXCL: ::c_int = 0x0800_0000;
529 pub const O_DIRECTORY: ::c_int = 0x1000_0000;
530 pub const O_PATH: ::c_int = 0x2000_0000;
531 pub const O_SYMLINK: ::c_int = 0x4000_0000;
532 // Negative to allow it to be used as int
533 // FIXME: Fix negative values missing from includes
534 pub const O_NOFOLLOW: ::c_int = -0x8000_0000;
535 
536 // locale.h
537 pub const LC_ALL: ::c_int = 0;
538 pub const LC_COLLATE: ::c_int = 1;
539 pub const LC_CTYPE: ::c_int = 2;
540 pub const LC_MESSAGES: ::c_int = 3;
541 pub const LC_MONETARY: ::c_int = 4;
542 pub const LC_NUMERIC: ::c_int = 5;
543 pub const LC_TIME: ::c_int = 6;
544 
545 // netdb.h
546 pub const AI_PASSIVE: ::c_int = 0x0001;
547 pub const AI_CANONNAME: ::c_int = 0x0002;
548 pub const AI_NUMERICHOST: ::c_int = 0x0004;
549 pub const AI_V4MAPPED: ::c_int = 0x0008;
550 pub const AI_ALL: ::c_int = 0x0010;
551 pub const AI_ADDRCONFIG: ::c_int = 0x0020;
552 pub const AI_NUMERICSERV: ::c_int = 0x0400;
553 pub const EAI_BADFLAGS: ::c_int = -1;
554 pub const EAI_NONAME: ::c_int = -2;
555 pub const EAI_AGAIN: ::c_int = -3;
556 pub const EAI_FAIL: ::c_int = -4;
557 pub const EAI_NODATA: ::c_int = -5;
558 pub const EAI_FAMILY: ::c_int = -6;
559 pub const EAI_SOCKTYPE: ::c_int = -7;
560 pub const EAI_SERVICE: ::c_int = -8;
561 pub const EAI_ADDRFAMILY: ::c_int = -9;
562 pub const EAI_MEMORY: ::c_int = -10;
563 pub const EAI_SYSTEM: ::c_int = -11;
564 pub const EAI_OVERFLOW: ::c_int = -12;
565 pub const NI_MAXHOST: ::c_int = 1025;
566 pub const NI_MAXSERV: ::c_int = 32;
567 pub const NI_NUMERICHOST: ::c_int = 0x0001;
568 pub const NI_NUMERICSERV: ::c_int = 0x0002;
569 pub const NI_NOFQDN: ::c_int = 0x0004;
570 pub const NI_NAMEREQD: ::c_int = 0x0008;
571 pub const NI_DGRAM: ::c_int = 0x0010;
572 
573 // netinet/in.h
574 // FIXME: relibc {
575 pub const IP_TTL: ::c_int = 2;
576 pub const IPV6_UNICAST_HOPS: ::c_int = 16;
577 pub const IPV6_MULTICAST_IF: ::c_int = 17;
578 pub const IPV6_MULTICAST_HOPS: ::c_int = 18;
579 pub const IPV6_MULTICAST_LOOP: ::c_int = 19;
580 pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20;
581 pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21;
582 pub const IPV6_V6ONLY: ::c_int = 26;
583 pub const IP_MULTICAST_IF: ::c_int = 32;
584 pub const IP_MULTICAST_TTL: ::c_int = 33;
585 pub const IP_MULTICAST_LOOP: ::c_int = 34;
586 pub const IP_ADD_MEMBERSHIP: ::c_int = 35;
587 pub const IP_DROP_MEMBERSHIP: ::c_int = 36;
588 pub const IPPROTO_RAW: ::c_int = 255;
589 // }
590 
591 // netinet/tcp.h
592 pub const TCP_NODELAY: ::c_int = 1;
593 // FIXME: relibc {
594 pub const TCP_KEEPIDLE: ::c_int = 1;
595 // }
596 
597 // poll.h
598 pub const POLLIN: ::c_short = 0x001;
599 pub const POLLPRI: ::c_short = 0x002;
600 pub const POLLOUT: ::c_short = 0x004;
601 pub const POLLERR: ::c_short = 0x008;
602 pub const POLLHUP: ::c_short = 0x010;
603 pub const POLLNVAL: ::c_short = 0x020;
604 pub const POLLRDNORM: ::c_short = 0x040;
605 pub const POLLRDBAND: ::c_short = 0x080;
606 pub const POLLWRNORM: ::c_short = 0x100;
607 pub const POLLWRBAND: ::c_short = 0x200;
608 
609 // pthread.h
610 pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0;
611 pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1;
612 pub const PTHREAD_MUTEX_INITIALIZER: ::pthread_mutex_t = ::pthread_mutex_t {
613     bytes: [0; _PTHREAD_MUTEX_SIZE],
614 };
615 pub const PTHREAD_COND_INITIALIZER: ::pthread_cond_t = ::pthread_cond_t {
616     bytes: [0; _PTHREAD_COND_SIZE],
617 };
618 pub const PTHREAD_RWLOCK_INITIALIZER: ::pthread_rwlock_t = ::pthread_rwlock_t {
619     bytes: [0; _PTHREAD_RWLOCK_SIZE],
620 };
621 pub const PTHREAD_STACK_MIN: ::size_t = 4096;
622 
623 // signal.h
624 pub const SIG_BLOCK: ::c_int = 0;
625 pub const SIG_UNBLOCK: ::c_int = 1;
626 pub const SIG_SETMASK: ::c_int = 2;
627 pub const SIGHUP: ::c_int = 1;
628 pub const SIGINT: ::c_int = 2;
629 pub const SIGQUIT: ::c_int = 3;
630 pub const SIGILL: ::c_int = 4;
631 pub const SIGTRAP: ::c_int = 5;
632 pub const SIGABRT: ::c_int = 6;
633 pub const SIGBUS: ::c_int = 7;
634 pub const SIGFPE: ::c_int = 8;
635 pub const SIGKILL: ::c_int = 9;
636 pub const SIGUSR1: ::c_int = 10;
637 pub const SIGSEGV: ::c_int = 11;
638 pub const SIGUSR2: ::c_int = 12;
639 pub const SIGPIPE: ::c_int = 13;
640 pub const SIGALRM: ::c_int = 14;
641 pub const SIGTERM: ::c_int = 15;
642 pub const SIGSTKFLT: ::c_int = 16;
643 pub const SIGCHLD: ::c_int = 17;
644 pub const SIGCONT: ::c_int = 18;
645 pub const SIGSTOP: ::c_int = 19;
646 pub const SIGTSTP: ::c_int = 20;
647 pub const SIGTTIN: ::c_int = 21;
648 pub const SIGTTOU: ::c_int = 22;
649 pub const SIGURG: ::c_int = 23;
650 pub const SIGXCPU: ::c_int = 24;
651 pub const SIGXFSZ: ::c_int = 25;
652 pub const SIGVTALRM: ::c_int = 26;
653 pub const SIGPROF: ::c_int = 27;
654 pub const SIGWINCH: ::c_int = 28;
655 pub const SIGIO: ::c_int = 29;
656 pub const SIGPWR: ::c_int = 30;
657 pub const SIGSYS: ::c_int = 31;
658 pub const NSIG: ::c_int = 32;
659 
660 pub const SA_NOCLDSTOP: ::c_ulong = 0x00000001;
661 pub const SA_NOCLDWAIT: ::c_ulong = 0x00000002;
662 pub const SA_SIGINFO: ::c_ulong = 0x00000004;
663 pub const SA_RESTORER: ::c_ulong = 0x04000000;
664 pub const SA_ONSTACK: ::c_ulong = 0x08000000;
665 pub const SA_RESTART: ::c_ulong = 0x10000000;
666 pub const SA_NODEFER: ::c_ulong = 0x40000000;
667 pub const SA_RESETHAND: ::c_ulong = 0x80000000;
668 
669 // sys/file.h
670 pub const LOCK_SH: ::c_int = 1;
671 pub const LOCK_EX: ::c_int = 2;
672 pub const LOCK_NB: ::c_int = 4;
673 pub const LOCK_UN: ::c_int = 8;
674 
675 // sys/epoll.h
676 pub const EPOLL_CLOEXEC: ::c_int = 0x0100_0000;
677 pub const EPOLL_CTL_ADD: ::c_int = 1;
678 pub const EPOLL_CTL_DEL: ::c_int = 2;
679 pub const EPOLL_CTL_MOD: ::c_int = 3;
680 pub const EPOLLIN: ::c_int = 0x001;
681 pub const EPOLLPRI: ::c_int = 0x002;
682 pub const EPOLLOUT: ::c_int = 0x004;
683 pub const EPOLLERR: ::c_int = 0x008;
684 pub const EPOLLHUP: ::c_int = 0x010;
685 pub const EPOLLNVAL: ::c_int = 0x020;
686 pub const EPOLLRDNORM: ::c_int = 0x040;
687 pub const EPOLLRDBAND: ::c_int = 0x080;
688 pub const EPOLLWRNORM: ::c_int = 0x100;
689 pub const EPOLLWRBAND: ::c_int = 0x200;
690 pub const EPOLLMSG: ::c_int = 0x400;
691 pub const EPOLLRDHUP: ::c_int = 0x2000;
692 pub const EPOLLEXCLUSIVE: ::c_int = 1 << 28;
693 pub const EPOLLWAKEUP: ::c_int = 1 << 29;
694 pub const EPOLLONESHOT: ::c_int = 1 << 30;
695 pub const EPOLLET: ::c_int = 1 << 31;
696 
697 // sys/stat.h
698 pub const S_IFMT: ::c_int = 0o0_170_000;
699 pub const S_IFDIR: ::c_int = 0o040_000;
700 pub const S_IFCHR: ::c_int = 0o020_000;
701 pub const S_IFBLK: ::c_int = 0o060_000;
702 pub const S_IFREG: ::c_int = 0o100_000;
703 pub const S_IFIFO: ::c_int = 0o010_000;
704 pub const S_IFLNK: ::c_int = 0o120_000;
705 pub const S_IFSOCK: ::c_int = 0o140_000;
706 pub const S_IRWXU: ::c_int = 0o0_700;
707 pub const S_IRUSR: ::c_int = 0o0_400;
708 pub const S_IWUSR: ::c_int = 0o0_200;
709 pub const S_IXUSR: ::c_int = 0o0_100;
710 pub const S_IRWXG: ::c_int = 0o0_070;
711 pub const S_IRGRP: ::c_int = 0o0_040;
712 pub const S_IWGRP: ::c_int = 0o0_020;
713 pub const S_IXGRP: ::c_int = 0o0_010;
714 pub const S_IRWXO: ::c_int = 0o0_007;
715 pub const S_IROTH: ::c_int = 0o0_004;
716 pub const S_IWOTH: ::c_int = 0o0_002;
717 pub const S_IXOTH: ::c_int = 0o0_001;
718 
719 // stdlib.h
720 pub const EXIT_SUCCESS: ::c_int = 0;
721 pub const EXIT_FAILURE: ::c_int = 1;
722 
723 // sys/ioctl.h
724 // FIXME: relibc {
725 pub const FIONREAD: ::c_ulong = 0x541B;
726 pub const FIONBIO: ::c_ulong = 0x5421;
727 pub const FIOCLEX: ::c_ulong = 0x5451;
728 // }
729 pub const TCGETS: ::c_ulong = 0x5401;
730 pub const TCSETS: ::c_ulong = 0x5402;
731 pub const TCFLSH: ::c_ulong = 0x540B;
732 pub const TIOCSCTTY: ::c_ulong = 0x540E;
733 pub const TIOCGPGRP: ::c_ulong = 0x540F;
734 pub const TIOCSPGRP: ::c_ulong = 0x5410;
735 pub const TIOCGWINSZ: ::c_ulong = 0x5413;
736 pub const TIOCSWINSZ: ::c_ulong = 0x5414;
737 
738 // sys/mman.h
739 pub const PROT_NONE: ::c_int = 0x0000;
740 pub const PROT_READ: ::c_int = 0x0004;
741 pub const PROT_WRITE: ::c_int = 0x0002;
742 pub const PROT_EXEC: ::c_int = 0x0001;
743 
744 pub const MADV_NORMAL: ::c_int = 0;
745 pub const MADV_RANDOM: ::c_int = 1;
746 pub const MADV_SEQUENTIAL: ::c_int = 2;
747 pub const MADV_WILLNEED: ::c_int = 3;
748 pub const MADV_DONTNEED: ::c_int = 4;
749 
750 pub const MAP_SHARED: ::c_int = 0x0001;
751 pub const MAP_PRIVATE: ::c_int = 0x0002;
752 pub const MAP_ANON: ::c_int = 0x0020;
753 pub const MAP_ANONYMOUS: ::c_int = MAP_ANON;
754 pub const MAP_FIXED: ::c_int = 0x0010;
755 pub const MAP_FAILED: *mut ::c_void = !0 as _;
756 
757 pub const MS_ASYNC: ::c_int = 0x0001;
758 pub const MS_INVALIDATE: ::c_int = 0x0002;
759 pub const MS_SYNC: ::c_int = 0x0004;
760 
761 // sys/select.h
762 pub const FD_SETSIZE: usize = 1024;
763 
764 // sys/socket.h
765 pub const AF_INET: ::c_int = 2;
766 pub const AF_INET6: ::c_int = 10;
767 pub const AF_UNIX: ::c_int = 1;
768 pub const AF_UNSPEC: ::c_int = 0;
769 pub const PF_INET: ::c_int = 2;
770 pub const PF_INET6: ::c_int = 10;
771 pub const PF_UNIX: ::c_int = 1;
772 pub const PF_UNSPEC: ::c_int = 0;
773 pub const MSG_CTRUNC: ::c_int = 8;
774 pub const MSG_DONTROUTE: ::c_int = 4;
775 pub const MSG_EOR: ::c_int = 128;
776 pub const MSG_OOB: ::c_int = 1;
777 pub const MSG_PEEK: ::c_int = 2;
778 pub const MSG_TRUNC: ::c_int = 32;
779 pub const MSG_DONTWAIT: ::c_int = 64;
780 pub const MSG_WAITALL: ::c_int = 256;
781 pub const SHUT_RD: ::c_int = 0;
782 pub const SHUT_WR: ::c_int = 1;
783 pub const SHUT_RDWR: ::c_int = 2;
784 pub const SO_DEBUG: ::c_int = 1;
785 pub const SO_REUSEADDR: ::c_int = 2;
786 pub const SO_TYPE: ::c_int = 3;
787 pub const SO_ERROR: ::c_int = 4;
788 pub const SO_DONTROUTE: ::c_int = 5;
789 pub const SO_BROADCAST: ::c_int = 6;
790 pub const SO_SNDBUF: ::c_int = 7;
791 pub const SO_RCVBUF: ::c_int = 8;
792 pub const SO_KEEPALIVE: ::c_int = 9;
793 pub const SO_OOBINLINE: ::c_int = 10;
794 pub const SO_NO_CHECK: ::c_int = 11;
795 pub const SO_PRIORITY: ::c_int = 12;
796 pub const SO_LINGER: ::c_int = 13;
797 pub const SO_BSDCOMPAT: ::c_int = 14;
798 pub const SO_REUSEPORT: ::c_int = 15;
799 pub const SO_PASSCRED: ::c_int = 16;
800 pub const SO_PEERCRED: ::c_int = 17;
801 pub const SO_RCVLOWAT: ::c_int = 18;
802 pub const SO_SNDLOWAT: ::c_int = 19;
803 pub const SO_RCVTIMEO: ::c_int = 20;
804 pub const SO_SNDTIMEO: ::c_int = 21;
805 pub const SO_ACCEPTCONN: ::c_int = 30;
806 pub const SO_PEERSEC: ::c_int = 31;
807 pub const SO_SNDBUFFORCE: ::c_int = 32;
808 pub const SO_RCVBUFFORCE: ::c_int = 33;
809 pub const SO_PROTOCOL: ::c_int = 38;
810 pub const SO_DOMAIN: ::c_int = 39;
811 pub const SOCK_STREAM: ::c_int = 1;
812 pub const SOCK_DGRAM: ::c_int = 2;
813 pub const SOCK_NONBLOCK: ::c_int = 0o4_000;
814 pub const SOCK_CLOEXEC: ::c_int = 0o2_000_000;
815 pub const SOCK_SEQPACKET: ::c_int = 5;
816 pub const SOL_SOCKET: ::c_int = 1;
817 pub const SOMAXCONN: ::c_int = 128;
818 
819 // sys/termios.h
820 pub const VEOF: usize = 0;
821 pub const VEOL: usize = 1;
822 pub const VEOL2: usize = 2;
823 pub const VERASE: usize = 3;
824 pub const VWERASE: usize = 4;
825 pub const VKILL: usize = 5;
826 pub const VREPRINT: usize = 6;
827 pub const VSWTC: usize = 7;
828 pub const VINTR: usize = 8;
829 pub const VQUIT: usize = 9;
830 pub const VSUSP: usize = 10;
831 pub const VSTART: usize = 12;
832 pub const VSTOP: usize = 13;
833 pub const VLNEXT: usize = 14;
834 pub const VDISCARD: usize = 15;
835 pub const VMIN: usize = 16;
836 pub const VTIME: usize = 17;
837 pub const NCCS: usize = 32;
838 
839 pub const IGNBRK: ::tcflag_t = 0o000_001;
840 pub const BRKINT: ::tcflag_t = 0o000_002;
841 pub const IGNPAR: ::tcflag_t = 0o000_004;
842 pub const PARMRK: ::tcflag_t = 0o000_010;
843 pub const INPCK: ::tcflag_t = 0o000_020;
844 pub const ISTRIP: ::tcflag_t = 0o000_040;
845 pub const INLCR: ::tcflag_t = 0o000_100;
846 pub const IGNCR: ::tcflag_t = 0o000_200;
847 pub const ICRNL: ::tcflag_t = 0o000_400;
848 pub const IXON: ::tcflag_t = 0o001_000;
849 pub const IXOFF: ::tcflag_t = 0o002_000;
850 
851 pub const OPOST: ::tcflag_t = 0o000_001;
852 pub const ONLCR: ::tcflag_t = 0o000_002;
853 pub const OLCUC: ::tcflag_t = 0o000_004;
854 pub const OCRNL: ::tcflag_t = 0o000_010;
855 pub const ONOCR: ::tcflag_t = 0o000_020;
856 pub const ONLRET: ::tcflag_t = 0o000_040;
857 pub const OFILL: ::tcflag_t = 0o0000_100;
858 pub const OFDEL: ::tcflag_t = 0o0000_200;
859 
860 pub const B0: speed_t = 0o000_000;
861 pub const B50: speed_t = 0o000_001;
862 pub const B75: speed_t = 0o000_002;
863 pub const B110: speed_t = 0o000_003;
864 pub const B134: speed_t = 0o000_004;
865 pub const B150: speed_t = 0o000_005;
866 pub const B200: speed_t = 0o000_006;
867 pub const B300: speed_t = 0o000_007;
868 pub const B600: speed_t = 0o000_010;
869 pub const B1200: speed_t = 0o000_011;
870 pub const B1800: speed_t = 0o000_012;
871 pub const B2400: speed_t = 0o000_013;
872 pub const B4800: speed_t = 0o000_014;
873 pub const B9600: speed_t = 0o000_015;
874 pub const B19200: speed_t = 0o000_016;
875 pub const B38400: speed_t = 0o000_017;
876 
877 pub const B57600: speed_t = 0o0_020;
878 pub const B115200: speed_t = 0o0_021;
879 pub const B230400: speed_t = 0o0_022;
880 pub const B460800: speed_t = 0o0_023;
881 pub const B500000: speed_t = 0o0_024;
882 pub const B576000: speed_t = 0o0_025;
883 pub const B921600: speed_t = 0o0_026;
884 pub const B1000000: speed_t = 0o0_027;
885 pub const B1152000: speed_t = 0o0_030;
886 pub const B1500000: speed_t = 0o0_031;
887 pub const B2000000: speed_t = 0o0_032;
888 pub const B2500000: speed_t = 0o0_033;
889 pub const B3000000: speed_t = 0o0_034;
890 pub const B3500000: speed_t = 0o0_035;
891 pub const B4000000: speed_t = 0o0_036;
892 
893 pub const CSIZE: ::tcflag_t = 0o001_400;
894 pub const CS5: ::tcflag_t = 0o000_000;
895 pub const CS6: ::tcflag_t = 0o000_400;
896 pub const CS7: ::tcflag_t = 0o001_000;
897 pub const CS8: ::tcflag_t = 0o001_400;
898 
899 pub const CSTOPB: ::tcflag_t = 0o002_000;
900 pub const CREAD: ::tcflag_t = 0o004_000;
901 pub const PARENB: ::tcflag_t = 0o010_000;
902 pub const PARODD: ::tcflag_t = 0o020_000;
903 pub const HUPCL: ::tcflag_t = 0o040_000;
904 
905 pub const CLOCAL: ::tcflag_t = 0o0100000;
906 
907 pub const ISIG: ::tcflag_t = 0x0000_0080;
908 pub const ICANON: ::tcflag_t = 0x0000_0100;
909 pub const ECHO: ::tcflag_t = 0x0000_0008;
910 pub const ECHOE: ::tcflag_t = 0x0000_0002;
911 pub const ECHOK: ::tcflag_t = 0x0000_0004;
912 pub const ECHONL: ::tcflag_t = 0x0000_0010;
913 pub const NOFLSH: ::tcflag_t = 0x8000_0000;
914 pub const TOSTOP: ::tcflag_t = 0x0040_0000;
915 pub const IEXTEN: ::tcflag_t = 0x0000_0400;
916 
917 pub const TCOOFF: ::c_int = 0;
918 pub const TCOON: ::c_int = 1;
919 pub const TCIOFF: ::c_int = 2;
920 pub const TCION: ::c_int = 3;
921 
922 pub const TCIFLUSH: ::c_int = 0;
923 pub const TCOFLUSH: ::c_int = 1;
924 pub const TCIOFLUSH: ::c_int = 2;
925 
926 pub const TCSANOW: ::c_int = 0;
927 pub const TCSADRAIN: ::c_int = 1;
928 pub const TCSAFLUSH: ::c_int = 2;
929 
930 // sys/wait.h
931 pub const WNOHANG: ::c_int = 1;
932 pub const WUNTRACED: ::c_int = 2;
933 
934 pub const WSTOPPED: ::c_int = 2;
935 pub const WEXITED: ::c_int = 4;
936 pub const WCONTINUED: ::c_int = 8;
937 pub const WNOWAIT: ::c_int = 0x0100_0000;
938 
939 pub const __WNOTHREAD: ::c_int = 0x2000_0000;
940 pub const __WALL: ::c_int = 0x4000_0000;
941 #[allow(overflowing_literals)]
942 pub const __WCLONE: ::c_int = 0x8000_0000;
943 
944 // time.h
945 pub const CLOCK_REALTIME: ::c_int = 1;
946 pub const CLOCK_MONOTONIC: ::c_int = 4;
947 pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 2;
948 pub const CLOCKS_PER_SEC: ::clock_t = 1_000_000;
949 
950 // unistd.h
951 // POSIX.1 {
952 pub const _SC_ARG_MAX: ::c_int = 0;
953 pub const _SC_CHILD_MAX: ::c_int = 1;
954 pub const _SC_CLK_TCK: ::c_int = 2;
955 pub const _SC_NGROUPS_MAX: ::c_int = 3;
956 pub const _SC_OPEN_MAX: ::c_int = 4;
957 pub const _SC_STREAM_MAX: ::c_int = 5;
958 pub const _SC_TZNAME_MAX: ::c_int = 6;
959 // ...
960 pub const _SC_VERSION: ::c_int = 29;
961 pub const _SC_PAGESIZE: ::c_int = 30;
962 pub const _SC_PAGE_SIZE: ::c_int = 30;
963 // ...
964 pub const _SC_RE_DUP_MAX: ::c_int = 44;
965 // ...
966 pub const _SC_LOGIN_NAME_MAX: ::c_int = 71;
967 pub const _SC_TTY_NAME_MAX: ::c_int = 72;
968 // ...
969 pub const _SC_SYMLOOP_MAX: ::c_int = 173;
970 // ...
971 pub const _SC_HOST_NAME_MAX: ::c_int = 180;
972 // } POSIX.1
973 
974 pub const F_OK: ::c_int = 0;
975 pub const R_OK: ::c_int = 4;
976 pub const W_OK: ::c_int = 2;
977 pub const X_OK: ::c_int = 1;
978 
979 pub const SEEK_SET: ::c_int = 0;
980 pub const SEEK_CUR: ::c_int = 1;
981 pub const SEEK_END: ::c_int = 2;
982 pub const STDIN_FILENO: ::c_int = 0;
983 pub const STDOUT_FILENO: ::c_int = 1;
984 pub const STDERR_FILENO: ::c_int = 2;
985 
986 pub const _PC_LINK_MAX: ::c_int = 0;
987 pub const _PC_MAX_CANON: ::c_int = 1;
988 pub const _PC_MAX_INPUT: ::c_int = 2;
989 pub const _PC_NAME_MAX: ::c_int = 3;
990 pub const _PC_PATH_MAX: ::c_int = 4;
991 pub const _PC_PIPE_BUF: ::c_int = 5;
992 pub const _PC_CHOWN_RESTRICTED: ::c_int = 6;
993 pub const _PC_NO_TRUNC: ::c_int = 7;
994 pub const _PC_VDISABLE: ::c_int = 8;
995 pub const _PC_SYNC_IO: ::c_int = 9;
996 pub const _PC_ASYNC_IO: ::c_int = 10;
997 pub const _PC_PRIO_IO: ::c_int = 11;
998 pub const _PC_SOCK_MAXBUF: ::c_int = 12;
999 pub const _PC_FILESIZEBITS: ::c_int = 13;
1000 pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 14;
1001 pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 15;
1002 pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 16;
1003 pub const _PC_REC_XFER_ALIGN: ::c_int = 17;
1004 pub const _PC_ALLOC_SIZE_MIN: ::c_int = 18;
1005 pub const _PC_SYMLINK_MAX: ::c_int = 19;
1006 pub const _PC_2_SYMLINKS: ::c_int = 20;
1007 
1008 pub const PRIO_PROCESS: ::c_int = 0;
1009 pub const PRIO_PGRP: ::c_int = 1;
1010 pub const PRIO_USER: ::c_int = 2;
1011 
1012 // wait.h
1013 f! {
1014     pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () {
1015         let fd = fd as usize;
1016         let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8;
1017         (*set).fds_bits[fd / size] &= !(1 << (fd % size));
1018         return
1019     }
1020 
1021     pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool {
1022         let fd = fd as usize;
1023         let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8;
1024         return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0
1025     }
1026 
1027     pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () {
1028         let fd = fd as usize;
1029         let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8;
1030         (*set).fds_bits[fd / size] |= 1 << (fd % size);
1031         return
1032     }
1033 
1034     pub fn FD_ZERO(set: *mut fd_set) -> () {
1035         for slot in (*set).fds_bits.iter_mut() {
1036             *slot = 0;
1037         }
1038     }
1039 }
1040 
1041 safe_f! {
1042     pub {const} fn WIFSTOPPED(status: ::c_int) -> bool {
1043         (status & 0xff) == 0x7f
1044     }
1045 
1046     pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int {
1047         (status >> 8) & 0xff
1048     }
1049 
1050     pub {const} fn WIFCONTINUED(status: ::c_int) -> bool {
1051         status == 0xffff
1052     }
1053 
1054     pub {const} fn WIFSIGNALED(status: ::c_int) -> bool {
1055         ((status & 0x7f) + 1) as i8 >= 2
1056     }
1057 
1058     pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int {
1059         status & 0x7f
1060     }
1061 
1062     pub {const} fn WIFEXITED(status: ::c_int) -> bool {
1063         (status & 0x7f) == 0
1064     }
1065 
1066     pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int {
1067         (status >> 8) & 0xff
1068     }
1069 
1070     pub {const} fn WCOREDUMP(status: ::c_int) -> bool {
1071         (status & 0x80) != 0
1072     }
1073 }
1074 
1075 extern "C" {
1076     // errno.h
__errno_location() -> *mut ::c_int1077     pub fn __errno_location() -> *mut ::c_int;
strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int1078     pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int;
1079 
1080     // unistd.h
pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int1081     pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int;
getdtablesize() -> ::c_int1082     pub fn getdtablesize() -> ::c_int;
1083 
1084     // grp.h
getgrent() -> *mut ::group1085     pub fn getgrent() -> *mut ::group;
setgrent()1086     pub fn setgrent();
endgrent()1087     pub fn endgrent();
getgrgid(gid: ::gid_t) -> *mut ::group1088     pub fn getgrgid(gid: ::gid_t) -> *mut ::group;
getgrgid_r( gid: ::gid_t, grp: *mut ::group, buf: *mut ::c_char, buflen: ::size_t, result: *mut *mut ::group, ) -> ::c_int1089     pub fn getgrgid_r(
1090         gid: ::gid_t,
1091         grp: *mut ::group,
1092         buf: *mut ::c_char,
1093         buflen: ::size_t,
1094         result: *mut *mut ::group,
1095     ) -> ::c_int;
getgrnam(name: *const ::c_char) -> *mut ::group1096     pub fn getgrnam(name: *const ::c_char) -> *mut ::group;
getgrnam_r( name: *const ::c_char, grp: *mut ::group, buf: *mut ::c_char, buflen: ::size_t, result: *mut *mut ::group, ) -> ::c_int1097     pub fn getgrnam_r(
1098         name: *const ::c_char,
1099         grp: *mut ::group,
1100         buf: *mut ::c_char,
1101         buflen: ::size_t,
1102         result: *mut *mut ::group,
1103     ) -> ::c_int;
getgrouplist( user: *const ::c_char, group: ::gid_t, groups: *mut ::gid_t, ngroups: *mut ::c_int, ) -> ::c_int1104     pub fn getgrouplist(
1105         user: *const ::c_char,
1106         group: ::gid_t,
1107         groups: *mut ::gid_t,
1108         ngroups: *mut ::c_int,
1109     ) -> ::c_int;
1110 
1111     // malloc.h
memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void1112     pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void;
1113 
1114     // netdb.h
getnameinfo( addr: *const ::sockaddr, addrlen: ::socklen_t, host: *mut ::c_char, hostlen: ::socklen_t, serv: *mut ::c_char, servlen: ::socklen_t, flags: ::c_int, ) -> ::c_int1115     pub fn getnameinfo(
1116         addr: *const ::sockaddr,
1117         addrlen: ::socklen_t,
1118         host: *mut ::c_char,
1119         hostlen: ::socklen_t,
1120         serv: *mut ::c_char,
1121         servlen: ::socklen_t,
1122         flags: ::c_int,
1123     ) -> ::c_int;
1124 
1125     // pthread.h
pthread_atfork( prepare: ::Option<unsafe extern "C" fn()>, parent: ::Option<unsafe extern "C" fn()>, child: ::Option<unsafe extern "C" fn()>, ) -> ::c_int1126     pub fn pthread_atfork(
1127         prepare: ::Option<unsafe extern "C" fn()>,
1128         parent: ::Option<unsafe extern "C" fn()>,
1129         child: ::Option<unsafe extern "C" fn()>,
1130     ) -> ::c_int;
pthread_create( tid: *mut ::pthread_t, attr: *const ::pthread_attr_t, start: extern "C" fn(*mut ::c_void) -> *mut ::c_void, arg: *mut ::c_void, ) -> ::c_int1131     pub fn pthread_create(
1132         tid: *mut ::pthread_t,
1133         attr: *const ::pthread_attr_t,
1134         start: extern "C" fn(*mut ::c_void) -> *mut ::c_void,
1135         arg: *mut ::c_void,
1136     ) -> ::c_int;
pthread_condattr_setclock( attr: *mut pthread_condattr_t, clock_id: ::clockid_t, ) -> ::c_int1137     pub fn pthread_condattr_setclock(
1138         attr: *mut pthread_condattr_t,
1139         clock_id: ::clockid_t,
1140     ) -> ::c_int;
1141 
1142     //pty.h
openpty( amaster: *mut ::c_int, aslave: *mut ::c_int, name: *mut ::c_char, termp: *const termios, winp: *const ::winsize, ) -> ::c_int1143     pub fn openpty(
1144         amaster: *mut ::c_int,
1145         aslave: *mut ::c_int,
1146         name: *mut ::c_char,
1147         termp: *const termios,
1148         winp: *const ::winsize,
1149     ) -> ::c_int;
1150 
1151     // pwd.h
getpwent() -> *mut passwd1152     pub fn getpwent() -> *mut passwd;
setpwent()1153     pub fn setpwent();
endpwent()1154     pub fn endpwent();
getpwnam_r( name: *const ::c_char, pwd: *mut passwd, buf: *mut ::c_char, buflen: ::size_t, result: *mut *mut passwd, ) -> ::c_int1155     pub fn getpwnam_r(
1156         name: *const ::c_char,
1157         pwd: *mut passwd,
1158         buf: *mut ::c_char,
1159         buflen: ::size_t,
1160         result: *mut *mut passwd,
1161     ) -> ::c_int;
getpwuid_r( uid: ::uid_t, pwd: *mut passwd, buf: *mut ::c_char, buflen: ::size_t, result: *mut *mut passwd, ) -> ::c_int1162     pub fn getpwuid_r(
1163         uid: ::uid_t,
1164         pwd: *mut passwd,
1165         buf: *mut ::c_char,
1166         buflen: ::size_t,
1167         result: *mut *mut passwd,
1168     ) -> ::c_int;
1169 
1170     // signal.h
pthread_sigmask( how: ::c_int, set: *const ::sigset_t, oldset: *mut ::sigset_t, ) -> ::c_int1171     pub fn pthread_sigmask(
1172         how: ::c_int,
1173         set: *const ::sigset_t,
1174         oldset: *mut ::sigset_t,
1175     ) -> ::c_int;
pthread_cancel(thread: ::pthread_t) -> ::c_int1176     pub fn pthread_cancel(thread: ::pthread_t) -> ::c_int;
pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int1177     pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int;
sigtimedwait( set: *const sigset_t, sig: *mut siginfo_t, timeout: *const ::timespec, ) -> ::c_int1178     pub fn sigtimedwait(
1179         set: *const sigset_t,
1180         sig: *mut siginfo_t,
1181         timeout: *const ::timespec,
1182     ) -> ::c_int;
sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int1183     pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int;
1184 
1185     // stdlib.h
getsubopt( optionp: *mut *mut c_char, tokens: *const *mut c_char, valuep: *mut *mut c_char, ) -> ::c_int1186     pub fn getsubopt(
1187         optionp: *mut *mut c_char,
1188         tokens: *const *mut c_char,
1189         valuep: *mut *mut c_char,
1190     ) -> ::c_int;
reallocarray(ptr: *mut ::c_void, nmemb: ::size_t, size: ::size_t) -> *mut ::c_void1191     pub fn reallocarray(ptr: *mut ::c_void, nmemb: ::size_t, size: ::size_t) -> *mut ::c_void;
1192 
1193     // string.h
explicit_bzero(p: *mut ::c_void, len: ::size_t)1194     pub fn explicit_bzero(p: *mut ::c_void, len: ::size_t);
strlcat(dst: *mut ::c_char, src: *const ::c_char, siz: ::size_t) -> ::size_t1195     pub fn strlcat(dst: *mut ::c_char, src: *const ::c_char, siz: ::size_t) -> ::size_t;
strlcpy(dst: *mut ::c_char, src: *const ::c_char, siz: ::size_t) -> ::size_t1196     pub fn strlcpy(dst: *mut ::c_char, src: *const ::c_char, siz: ::size_t) -> ::size_t;
1197 
1198     // sys/epoll.h
epoll_create(size: ::c_int) -> ::c_int1199     pub fn epoll_create(size: ::c_int) -> ::c_int;
epoll_create1(flags: ::c_int) -> ::c_int1200     pub fn epoll_create1(flags: ::c_int) -> ::c_int;
epoll_wait( epfd: ::c_int, events: *mut ::epoll_event, maxevents: ::c_int, timeout: ::c_int, ) -> ::c_int1201     pub fn epoll_wait(
1202         epfd: ::c_int,
1203         events: *mut ::epoll_event,
1204         maxevents: ::c_int,
1205         timeout: ::c_int,
1206     ) -> ::c_int;
epoll_ctl(epfd: ::c_int, op: ::c_int, fd: ::c_int, event: *mut ::epoll_event) -> ::c_int1207     pub fn epoll_ctl(epfd: ::c_int, op: ::c_int, fd: ::c_int, event: *mut ::epoll_event)
1208         -> ::c_int;
1209 
1210     // sys/ioctl.h
ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int1211     pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int;
1212 
1213     // sys/mman.h
madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int1214     pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int;
msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int1215     pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int;
mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int1216     pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int;
shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int1217     pub fn shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int;
shm_unlink(name: *const ::c_char) -> ::c_int1218     pub fn shm_unlink(name: *const ::c_char) -> ::c_int;
1219 
1220     // sys/resource.h
getpriority(which: ::c_int, who: ::id_t) -> ::c_int1221     pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int;
setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int1222     pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int;
getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int1223     pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int;
setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int1224     pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int;
1225 
1226     // sys/socket.h
bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int1227     pub fn bind(socket: ::c_int, address: *const ::sockaddr, address_len: ::socklen_t) -> ::c_int;
recvfrom( socket: ::c_int, buf: *mut ::c_void, len: ::size_t, flags: ::c_int, addr: *mut ::sockaddr, addrlen: *mut ::socklen_t, ) -> ::ssize_t1228     pub fn recvfrom(
1229         socket: ::c_int,
1230         buf: *mut ::c_void,
1231         len: ::size_t,
1232         flags: ::c_int,
1233         addr: *mut ::sockaddr,
1234         addrlen: *mut ::socklen_t,
1235     ) -> ::ssize_t;
1236 
1237     // sys/stat.h
futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int1238     pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int;
1239 
1240     // sys/uio.h
readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t1241     pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t;
writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t1242     pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t;
1243 
1244     // sys/utsname.h
uname(utsname: *mut utsname) -> ::c_int1245     pub fn uname(utsname: *mut utsname) -> ::c_int;
1246 
1247     // time.h
gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int1248     pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int;
clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int1249     pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int;
1250 
1251     // utmp.h
login_tty(fd: ::c_int) -> ::c_int1252     pub fn login_tty(fd: ::c_int) -> ::c_int;
1253 }
1254 
1255 cfg_if! {
1256     if #[cfg(feature = "extra_traits")] {
1257         impl PartialEq for dirent {
1258             fn eq(&self, other: &dirent) -> bool {
1259                 self.d_ino == other.d_ino
1260                     && self.d_off == other.d_off
1261                     && self.d_reclen == other.d_reclen
1262                     && self.d_type == other.d_type
1263                     && self
1264                     .d_name
1265                     .iter()
1266                     .zip(other.d_name.iter())
1267                     .all(|(a,b)| a == b)
1268             }
1269         }
1270 
1271         impl Eq for dirent {}
1272 
1273         impl ::fmt::Debug for dirent {
1274             fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
1275                 f.debug_struct("dirent")
1276                     .field("d_ino", &self.d_ino)
1277                     .field("d_off", &self.d_off)
1278                     .field("d_reclen", &self.d_reclen)
1279                     .field("d_type", &self.d_type)
1280                 // FIXME: .field("d_name", &self.d_name)
1281                     .finish()
1282             }
1283         }
1284 
1285         impl ::hash::Hash for dirent {
1286             fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
1287                 self.d_ino.hash(state);
1288                 self.d_off.hash(state);
1289                 self.d_reclen.hash(state);
1290                 self.d_type.hash(state);
1291                 self.d_name.hash(state);
1292             }
1293         }
1294 
1295         impl PartialEq for sockaddr_un {
1296             fn eq(&self, other: &sockaddr_un) -> bool {
1297                 self.sun_family == other.sun_family
1298                     && self
1299                     .sun_path
1300                     .iter()
1301                     .zip(other.sun_path.iter())
1302                     .all(|(a,b)| a == b)
1303             }
1304         }
1305 
1306         impl Eq for sockaddr_un {}
1307 
1308         impl ::fmt::Debug for sockaddr_un {
1309             fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
1310                 f.debug_struct("sockaddr_un")
1311                     .field("sun_family", &self.sun_family)
1312                 // FIXME: .field("sun_path", &self.sun_path)
1313                     .finish()
1314             }
1315         }
1316 
1317         impl ::hash::Hash for sockaddr_un {
1318             fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
1319                 self.sun_family.hash(state);
1320                 self.sun_path.hash(state);
1321             }
1322         }
1323 
1324         impl PartialEq for sockaddr_storage {
1325             fn eq(&self, other: &sockaddr_storage) -> bool {
1326                 self.ss_family == other.ss_family
1327                     && self.__ss_align == self.__ss_align
1328                     && self
1329                     .__ss_padding
1330                     .iter()
1331                     .zip(other.__ss_padding.iter())
1332                     .all(|(a,b)| a == b)
1333             }
1334         }
1335 
1336         impl Eq for sockaddr_storage {}
1337 
1338         impl ::fmt::Debug for sockaddr_storage {
1339             fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
1340                 f.debug_struct("sockaddr_storage")
1341                     .field("ss_family", &self.ss_family)
1342                     .field("__ss_align", &self.__ss_align)
1343                 // FIXME: .field("__ss_padding", &self.__ss_padding)
1344                     .finish()
1345             }
1346         }
1347 
1348         impl ::hash::Hash for sockaddr_storage {
1349             fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
1350                 self.ss_family.hash(state);
1351                 self.__ss_padding.hash(state);
1352                 self.__ss_align.hash(state);
1353             }
1354         }
1355 
1356         impl PartialEq for utsname {
1357             fn eq(&self, other: &utsname) -> bool {
1358                 self.sysname
1359                     .iter()
1360                     .zip(other.sysname.iter())
1361                     .all(|(a, b)| a == b)
1362                     && self
1363                     .nodename
1364                     .iter()
1365                     .zip(other.nodename.iter())
1366                     .all(|(a, b)| a == b)
1367                     && self
1368                     .release
1369                     .iter()
1370                     .zip(other.release.iter())
1371                     .all(|(a, b)| a == b)
1372                     && self
1373                     .version
1374                     .iter()
1375                     .zip(other.version.iter())
1376                     .all(|(a, b)| a == b)
1377                     && self
1378                     .machine
1379                     .iter()
1380                     .zip(other.machine.iter())
1381                     .all(|(a, b)| a == b)
1382                     && self
1383                     .domainname
1384                     .iter()
1385                     .zip(other.domainname.iter())
1386                     .all(|(a, b)| a == b)
1387             }
1388         }
1389 
1390         impl Eq for utsname {}
1391 
1392         impl ::fmt::Debug for utsname {
1393             fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
1394                 f.debug_struct("utsname")
1395                 // FIXME: .field("sysname", &self.sysname)
1396                 // FIXME: .field("nodename", &self.nodename)
1397                 // FIXME: .field("release", &self.release)
1398                 // FIXME: .field("version", &self.version)
1399                 // FIXME: .field("machine", &self.machine)
1400                 // FIXME: .field("domainname", &self.domainname)
1401                     .finish()
1402             }
1403         }
1404 
1405         impl ::hash::Hash for utsname {
1406             fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
1407                 self.sysname.hash(state);
1408                 self.nodename.hash(state);
1409                 self.release.hash(state);
1410                 self.version.hash(state);
1411                 self.machine.hash(state);
1412                 self.domainname.hash(state);
1413             }
1414         }
1415     }
1416 }
1417