blob: ed84bef24780cb600173e803e47c8c24f86c391e [file] [log] [blame]
Alex Crichton07d3a0d2015-10-30 10:21:32 -07001use dox::mem;
2
Alex Crichton5d6cf052015-09-11 14:52:34 -07003pub type rlim_t = c_ulong;
4pub type sa_family_t = u16;
Alex Crichton239f9cd2015-09-18 16:31:34 -07005pub type pthread_key_t = ::c_uint;
Alex Crichton5d6cf052015-09-11 14:52:34 -07006
7pub enum timezone {}
8
9s! {
Alex Crichton5d6cf052015-09-11 14:52:34 -070010 pub struct sockaddr {
11 pub sa_family: sa_family_t,
Alex Crichtonf3b97482015-09-16 14:13:20 -070012 pub sa_data: [::c_char; 14],
Alex Crichton5d6cf052015-09-11 14:52:34 -070013 }
14
Alex Crichton50a42e22015-09-15 14:27:15 -070015 pub struct sockaddr_in {
16 pub sin_family: sa_family_t,
17 pub sin_port: ::in_port_t,
18 pub sin_addr: ::in_addr,
19 pub sin_zero: [u8; 8],
20 }
21
22 pub struct sockaddr_in6 {
23 pub sin6_family: sa_family_t,
24 pub sin6_port: ::in_port_t,
25 pub sin6_flowinfo: u32,
26 pub sin6_addr: ::in6_addr,
27 pub sin6_scope_id: u32,
28 }
29
30 pub struct sockaddr_un {
31 pub sun_family: sa_family_t,
32 pub sun_path: [::c_char; 108]
33 }
34
Alex Crichton5d6cf052015-09-11 14:52:34 -070035 pub struct sockaddr_storage {
36 pub ss_family: sa_family_t,
Alex Crichtonf3b97482015-09-16 14:13:20 -070037 __ss_align: ::size_t,
Alex Crichton5d6cf052015-09-11 14:52:34 -070038 #[cfg(target_pointer_width = "32")]
39 __ss_pad2: [u8; 128 - 2 * 4],
40 #[cfg(target_pointer_width = "64")]
41 __ss_pad2: [u8; 128 - 2 * 8],
42 }
43
Alex Crichton5d6cf052015-09-11 14:52:34 -070044 pub struct addrinfo {
Alex Crichton239f9cd2015-09-18 16:31:34 -070045 pub ai_flags: ::c_int,
46 pub ai_family: ::c_int,
47 pub ai_socktype: ::c_int,
48 pub ai_protocol: ::c_int,
Alex Crichton5d6cf052015-09-11 14:52:34 -070049 pub ai_addrlen: socklen_t,
50
51 #[cfg(target_os = "linux")]
Alex Crichton50a42e22015-09-15 14:27:15 -070052 pub ai_addr: *mut ::sockaddr,
Alex Crichton5d6cf052015-09-11 14:52:34 -070053
54 pub ai_canonname: *mut c_char,
55
Alex Crichtoncd9b33e2015-09-17 14:47:40 -070056 #[cfg(target_os = "android")]
Alex Crichton50a42e22015-09-15 14:27:15 -070057 pub ai_addr: *mut ::sockaddr,
Alex Crichton5d6cf052015-09-11 14:52:34 -070058
59 pub ai_next: *mut addrinfo,
60 }
61
Alex Crichton5d6cf052015-09-11 14:52:34 -070062 pub struct sockaddr_ll {
Alex Crichton239f9cd2015-09-18 16:31:34 -070063 pub sll_family: ::c_ushort,
64 pub sll_protocol: ::c_ushort,
65 pub sll_ifindex: ::c_int,
66 pub sll_hatype: ::c_ushort,
67 pub sll_pkttype: ::c_uchar,
68 pub sll_halen: ::c_uchar,
69 pub sll_addr: [::c_uchar; 8]
Alex Crichton5d6cf052015-09-11 14:52:34 -070070 }
Alex Crichton07d3a0d2015-10-30 10:21:32 -070071
72 pub struct fd_set {
73 fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE],
74 }
Alex Crichton5d6cf052015-09-11 14:52:34 -070075}
76
Alex Crichton07d3a0d2015-10-30 10:21:32 -070077// intentionally not public, only used for fd_set
78#[cfg(target_pointer_width = "32")]
79const ULONG_SIZE: usize = 32;
80#[cfg(target_pointer_width = "64")]
81const ULONG_SIZE: usize = 64;
82
Alex Crichton239f9cd2015-09-18 16:31:34 -070083pub const EXIT_FAILURE: ::c_int = 1;
84pub const EXIT_SUCCESS: ::c_int = 0;
85pub const RAND_MAX: ::c_int = 2147483647;
86pub const EOF: ::c_int = -1;
87pub const SEEK_SET: ::c_int = 0;
88pub const SEEK_CUR: ::c_int = 1;
89pub const SEEK_END: ::c_int = 2;
90pub const _IOFBF: ::c_int = 0;
91pub const _IONBF: ::c_int = 2;
92pub const _IOLBF: ::c_int = 1;
Alex Crichton5d6cf052015-09-11 14:52:34 -070093
Alex Crichton239f9cd2015-09-18 16:31:34 -070094pub const F_DUPFD: ::c_int = 0;
95pub const F_GETFD: ::c_int = 1;
96pub const F_SETFD: ::c_int = 2;
97pub const F_GETFL: ::c_int = 3;
98pub const F_SETFL: ::c_int = 4;
Alex Crichton5d6cf052015-09-11 14:52:34 -070099
Alex Crichton239f9cd2015-09-18 16:31:34 -0700100pub const SIGTRAP: ::c_int = 5;
Alex Crichton5d6cf052015-09-11 14:52:34 -0700101
Alex Crichton239f9cd2015-09-18 16:31:34 -0700102pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0;
103pub const PTHREAD_CREATE_DETACHED: ::c_int = 1;
Alex Crichton5d6cf052015-09-11 14:52:34 -0700104
Alex Crichton239f9cd2015-09-18 16:31:34 -0700105pub const CLOCK_REALTIME: ::c_int = 0;
106pub const CLOCK_MONOTONIC: ::c_int = 1;
Alex Crichton5d6cf052015-09-11 14:52:34 -0700107
Alex Crichton239f9cd2015-09-18 16:31:34 -0700108pub const RLIMIT_CPU: ::c_int = 0;
109pub const RLIMIT_FSIZE: ::c_int = 1;
110pub const RLIMIT_DATA: ::c_int = 2;
111pub const RLIMIT_STACK: ::c_int = 3;
112pub const RLIMIT_CORE: ::c_int = 4;
113pub const RLIMIT_LOCKS: ::c_int = 10;
114pub const RLIMIT_SIGPENDING: ::c_int = 11;
115pub const RLIMIT_MSGQUEUE: ::c_int = 12;
116pub const RLIMIT_NICE: ::c_int = 13;
117pub const RLIMIT_RTPRIO: ::c_int = 14;
Alex Crichton5d6cf052015-09-11 14:52:34 -0700118
Alex Crichton239f9cd2015-09-18 16:31:34 -0700119pub const RUSAGE_SELF: ::c_int = 0;
Alex Crichtond3d77922015-09-11 17:03:39 -0700120
121pub const O_RDONLY: ::c_int = 0;
122pub const O_WRONLY: ::c_int = 1;
123pub const O_RDWR: ::c_int = 2;
Alex Crichtond3d77922015-09-11 17:03:39 -0700124pub const O_TRUNC: ::c_int = 512;
Alex Crichton14f7e022015-11-02 14:21:30 -0800125pub const O_CLOEXEC: ::c_int = 0x80000;
Alex Crichtond3d77922015-09-11 17:03:39 -0700126pub const S_IFIFO: ::mode_t = 4096;
127pub const S_IFCHR: ::mode_t = 8192;
128pub const S_IFBLK: ::mode_t = 24576;
129pub const S_IFDIR: ::mode_t = 16384;
130pub const S_IFREG: ::mode_t = 32768;
131pub const S_IFLNK: ::mode_t = 40960;
132pub const S_IFSOCK: ::mode_t = 49152;
133pub const S_IFMT: ::mode_t = 61440;
134pub const S_IRWXU: ::mode_t = 448;
135pub const S_IXUSR: ::mode_t = 64;
136pub const S_IWUSR: ::mode_t = 128;
137pub const S_IRUSR: ::mode_t = 256;
138pub const S_IRWXG: ::mode_t = 56;
139pub const S_IXGRP: ::mode_t = 8;
140pub const S_IWGRP: ::mode_t = 16;
141pub const S_IRGRP: ::mode_t = 32;
142pub const S_IRWXO: ::mode_t = 7;
143pub const S_IXOTH: ::mode_t = 1;
144pub const S_IWOTH: ::mode_t = 2;
145pub const S_IROTH: ::mode_t = 4;
146pub const F_OK: ::c_int = 0;
147pub const R_OK: ::c_int = 4;
148pub const W_OK: ::c_int = 2;
149pub const X_OK: ::c_int = 1;
150pub const STDIN_FILENO: ::c_int = 0;
151pub const STDOUT_FILENO: ::c_int = 1;
152pub const STDERR_FILENO: ::c_int = 2;
153pub const SIGHUP: ::c_int = 1;
154pub const SIGINT: ::c_int = 2;
155pub const SIGQUIT: ::c_int = 3;
156pub const SIGILL: ::c_int = 4;
157pub const SIGABRT: ::c_int = 6;
158pub const SIGFPE: ::c_int = 8;
159pub const SIGKILL: ::c_int = 9;
160pub const SIGSEGV: ::c_int = 11;
161pub const SIGPIPE: ::c_int = 13;
162pub const SIGALRM: ::c_int = 14;
163pub const SIGTERM: ::c_int = 15;
164
165pub const PROT_NONE: ::c_int = 0;
166pub const PROT_READ: ::c_int = 1;
167pub const PROT_WRITE: ::c_int = 2;
168pub const PROT_EXEC: ::c_int = 4;
169
170pub const MAP_FILE: ::c_int = 0x0000;
171pub const MAP_SHARED: ::c_int = 0x0001;
172pub const MAP_PRIVATE: ::c_int = 0x0002;
173pub const MAP_FIXED: ::c_int = 0x0010;
Alex Crichtond3d77922015-09-11 17:03:39 -0700174
175pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void;
176
177pub const MCL_CURRENT: ::c_int = 0x0001;
178pub const MCL_FUTURE: ::c_int = 0x0002;
179
180pub const MS_ASYNC: ::c_int = 0x0001;
181pub const MS_INVALIDATE: ::c_int = 0x0002;
182pub const MS_SYNC: ::c_int = 0x0004;
183
184pub const EPERM: ::c_int = 1;
185pub const ENOENT: ::c_int = 2;
186pub const ESRCH: ::c_int = 3;
187pub const EINTR: ::c_int = 4;
188pub const EIO: ::c_int = 5;
189pub const ENXIO: ::c_int = 6;
190pub const E2BIG: ::c_int = 7;
191pub const ENOEXEC: ::c_int = 8;
192pub const EBADF: ::c_int = 9;
193pub const ECHILD: ::c_int = 10;
194pub const EAGAIN: ::c_int = 11;
195pub const ENOMEM: ::c_int = 12;
196pub const EACCES: ::c_int = 13;
197pub const EFAULT: ::c_int = 14;
198pub const ENOTBLK: ::c_int = 15;
199pub const EBUSY: ::c_int = 16;
200pub const EEXIST: ::c_int = 17;
201pub const EXDEV: ::c_int = 18;
202pub const ENODEV: ::c_int = 19;
203pub const ENOTDIR: ::c_int = 20;
204pub const EISDIR: ::c_int = 21;
205pub const EINVAL: ::c_int = 22;
206pub const ENFILE: ::c_int = 23;
207pub const EMFILE: ::c_int = 24;
208pub const ENOTTY: ::c_int = 25;
209pub const ETXTBSY: ::c_int = 26;
210pub const EFBIG: ::c_int = 27;
211pub const ENOSPC: ::c_int = 28;
212pub const ESPIPE: ::c_int = 29;
213pub const EROFS: ::c_int = 30;
214pub const EMLINK: ::c_int = 31;
215pub const EPIPE: ::c_int = 32;
216pub const EDOM: ::c_int = 33;
217pub const ERANGE: ::c_int = 34;
Alex Crichtond3d77922015-09-11 17:03:39 -0700218pub const EWOULDBLOCK: ::c_int = EAGAIN;
Alex Crichtond3d77922015-09-11 17:03:39 -0700219
220pub const EBFONT: ::c_int = 59;
221pub const ENOSTR: ::c_int = 60;
222pub const ENODATA: ::c_int = 61;
223pub const ETIME: ::c_int = 62;
224pub const ENOSR: ::c_int = 63;
225pub const ENONET: ::c_int = 64;
226pub const ENOPKG: ::c_int = 65;
227pub const EREMOTE: ::c_int = 66;
228pub const ENOLINK: ::c_int = 67;
229pub const EADV: ::c_int = 68;
230pub const ESRMNT: ::c_int = 69;
231pub const ECOMM: ::c_int = 70;
232pub const EPROTO: ::c_int = 71;
Alex Crichtond3d77922015-09-11 17:03:39 -0700233pub const EDOTDOT: ::c_int = 73;
Alex Crichtond3d77922015-09-11 17:03:39 -0700234
235pub const AF_PACKET: ::c_int = 17;
236pub const IPPROTO_RAW: ::c_int = 255;
237
Alex Crichtond3d77922015-09-11 17:03:39 -0700238pub const PROT_GROWSDOWN: ::c_int = 0x1000000;
239pub const PROT_GROWSUP: ::c_int = 0x2000000;
240
241pub const MAP_TYPE: ::c_int = 0x000f;
Alex Crichtond3d77922015-09-11 17:03:39 -0700242
243pub const MADV_NORMAL: ::c_int = 0;
244pub const MADV_RANDOM: ::c_int = 1;
245pub const MADV_SEQUENTIAL: ::c_int = 2;
246pub const MADV_WILLNEED: ::c_int = 3;
247pub const MADV_DONTNEED: ::c_int = 4;
248pub const MADV_REMOVE: ::c_int = 9;
249pub const MADV_DONTFORK: ::c_int = 10;
250pub const MADV_DOFORK: ::c_int = 11;
251pub const MADV_MERGEABLE: ::c_int = 12;
252pub const MADV_UNMERGEABLE: ::c_int = 13;
253pub const MADV_HWPOISON: ::c_int = 100;
254
255pub const IFF_LOOPBACK: ::c_int = 0x8;
256
257pub const AF_UNIX: ::c_int = 1;
258pub const AF_INET: ::c_int = 2;
259pub const AF_INET6: ::c_int = 10;
Alex Crichtond3d77922015-09-11 17:03:39 -0700260pub const SOCK_RAW: ::c_int = 3;
261pub const IPPROTO_TCP: ::c_int = 6;
262pub const IPPROTO_IP: ::c_int = 0;
263pub const IPPROTO_IPV6: ::c_int = 41;
264pub const IP_MULTICAST_TTL: ::c_int = 33;
265pub const IP_MULTICAST_LOOP: ::c_int = 34;
266pub const IP_TTL: ::c_int = 2;
267pub const IP_HDRINCL: ::c_int = 3;
268pub const IP_ADD_MEMBERSHIP: ::c_int = 35;
269pub const IP_DROP_MEMBERSHIP: ::c_int = 36;
270pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20;
271pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21;
272
273pub const TCP_NODELAY: ::c_int = 1;
274pub const TCP_MAXSEG: ::c_int = 2;
275pub const TCP_CORK: ::c_int = 3;
276pub const TCP_KEEPIDLE: ::c_int = 4;
277pub const TCP_KEEPINTVL: ::c_int = 5;
278pub const TCP_KEEPCNT: ::c_int = 6;
279pub const TCP_SYNCNT: ::c_int = 7;
280pub const TCP_LINGER2: ::c_int = 8;
281pub const TCP_DEFER_ACCEPT: ::c_int = 9;
282pub const TCP_WINDOW_CLAMP: ::c_int = 10;
283pub const TCP_INFO: ::c_int = 11;
284pub const TCP_QUICKACK: ::c_int = 12;
285pub const TCP_CONGESTION: ::c_int = 13;
286
Alex Crichtonbabf3902015-09-18 17:16:51 -0700287pub const IPV6_MULTICAST_LOOP: ::c_int = 19;
288pub const IPV6_V6ONLY: ::c_int = 26;
289
Alex Crichtond3d77922015-09-11 17:03:39 -0700290pub const SO_DEBUG: ::c_int = 1;
Alex Crichtond3d77922015-09-11 17:03:39 -0700291
292pub const SHUT_RD: ::c_int = 0;
293pub const SHUT_WR: ::c_int = 1;
294pub const SHUT_RDWR: ::c_int = 2;
295
296pub const LOCK_SH: ::c_int = 1;
297pub const LOCK_EX: ::c_int = 2;
298pub const LOCK_NB: ::c_int = 4;
299pub const LOCK_UN: ::c_int = 8;
300
Alex Crichtoncd9b33e2015-09-17 14:47:40 -0700301pub const SIGSTKSZ: ::size_t = 8192;
302
Alex Crichton07d3a0d2015-10-30 10:21:32 -0700303pub const SA_NODEFER: ::c_int = 0x40000000;
304pub const SA_RESETHAND: ::c_int = 0x80000000;
305pub const SA_RESTART: ::c_int = 0x10000000;
306pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
307
308pub const FD_SETSIZE: usize = 1024;
309
310f! {
311 pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () {
312 let fd = fd as usize;
313 let size = mem::size_of_val(&(*set).fds_bits[0]);
314 (*set).fds_bits[fd / size] &= !(1 << (fd % size));
315 return
316 }
317
318 pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool {
319 let fd = fd as usize;
320 let size = mem::size_of_val(&(*set).fds_bits[0]);
321 return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0
322 }
323
324 pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () {
325 let fd = fd as usize;
326 let size = mem::size_of_val(&(*set).fds_bits[0]);
327 (*set).fds_bits[fd / size] |= 1 << (fd % size);
328 return
329 }
330
331 pub fn FD_ZERO(set: *mut fd_set) -> () {
332 for slot in (*set).fds_bits.iter_mut() {
333 *slot = 0;
334 }
335 }
336
337 pub fn WIFEXITED(status: ::c_int) -> bool {
338 (status & 0xff) == 0
339 }
340
341 pub fn WEXITSTATUS(status: ::c_int) -> ::c_int {
342 (status >> 8) & 0xff
343 }
344
345 pub fn WTERMSIG(status: ::c_int) -> ::c_int {
346 status & 0x7f
347 }
348}
349
Alex Crichtond3d77922015-09-11 17:03:39 -0700350extern {
351 pub fn fdatasync(fd: ::c_int) -> ::c_int;
Alex Crichton8293ced2015-09-15 17:05:19 -0700352 pub fn mincore(addr: *mut ::c_void, len: ::size_t,
353 vec: *mut ::c_uchar) -> ::c_int;
Alex Crichtoncd9b33e2015-09-17 14:47:40 -0700354 pub fn clock_gettime(clk_id: ::c_int, tp: *mut ::timespec) -> ::c_int;
355 pub fn prctl(option: ::c_int, ...) -> ::c_int;
356 pub fn pthread_getattr_np(native: ::pthread_t,
357 attr: *mut ::pthread_attr_t) -> ::c_int;
358 pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t,
359 guardsize: *mut ::size_t) -> ::c_int;
360 pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t,
361 stackaddr: *mut *mut ::c_void,
362 stacksize: *mut ::size_t) -> ::c_int;
Alex Crichtonde9736d2015-09-17 15:47:44 -0700363 pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void;
364 pub fn setgroups(ngroups: ::size_t,
365 ptr: *const ::gid_t) -> ::c_int;
Alex Crichton5d6cf052015-09-11 14:52:34 -0700366}
367
368cfg_if! {
Alex Crichton5d6cf052015-09-11 14:52:34 -0700369 if #[cfg(target_os = "linux")] {
370 mod linux;
371 pub use self::linux::*;
372 } else if #[cfg(target_os = "android")] {
373 mod android;
374 pub use self::android::*;
375 } else {
376 // ...
377 }
378}