]> git.proxmox.com Git - rustc.git/blame - src/libstd/sys/unix/c.rs
Imported Upstream version 1.3.0+dfsg1
[rustc.git] / src / libstd / sys / unix / c.rs
CommitLineData
1a4d82fc
JJ
1// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
2// file at the top-level directory of this distribution and at
3// http://rust-lang.org/COPYRIGHT.
4//
5// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8// option. This file may not be copied, modified, or distributed
9// except according to those terms.
10
62682a34
SL
11//! C definitions used by std::sys that don't belong in liblibc
12
13// These are definitions sufficient for the users in this directory.
14// This is not a general-purpose binding to this functionality, and in
15// some cases (notably the definition of siginfo_t), we intentionally
16// have incomplete bindings so that we don't need to fight with unions.
17//
18// Note that these types need to match the definitions from the platform
19// libc (currently glibc on Linux), not the kernel definitions / the
20// syscall interface. This has a few weirdnesses, like glibc's sigset_t
21// being 1024 bits on all platforms. If you're adding a new GNU/Linux
22// port, check glibc's sysdeps/unix/sysv/linux, not the kernel headers.
1a4d82fc
JJ
23
24#![allow(dead_code)]
25#![allow(non_camel_case_types)]
26
62682a34
SL
27pub use self::signal_os::{sigaction, siginfo, sigset_t, sigaltstack};
28pub use self::signal_os::{SA_ONSTACK, SA_SIGINFO, SIGBUS, SIGSTKSZ, SIG_SETMASK};
1a4d82fc
JJ
29
30use libc;
31
32#[cfg(any(target_os = "macos",
33 target_os = "ios",
34 target_os = "freebsd",
85aaf69f 35 target_os = "dragonfly",
c34b1796 36 target_os = "bitrig",
c1a9b12d 37 target_os = "netbsd",
85aaf69f 38 target_os = "openbsd"))]
62682a34
SL
39pub const FIOCLEX: libc::c_ulong = 0x20006601;
40
1a4d82fc
JJ
41#[cfg(any(all(target_os = "linux",
42 any(target_arch = "x86",
43 target_arch = "x86_64",
44 target_arch = "arm",
45 target_arch = "aarch64")),
46 target_os = "android"))]
62682a34
SL
47pub const FIOCLEX: libc::c_ulong = 0x5451;
48
1a4d82fc 49#[cfg(all(target_os = "linux",
85aaf69f
SL
50 any(target_arch = "mips",
51 target_arch = "mipsel",
52 target_arch = "powerpc")))]
62682a34 53pub const FIOCLEX: libc::c_ulong = 0x6601;
1a4d82fc
JJ
54
55pub const WNOHANG: libc::c_int = 1;
56
85aaf69f
SL
57#[cfg(target_os = "linux")]
58pub const _SC_GETPW_R_SIZE_MAX: libc::c_int = 70;
59#[cfg(any(target_os = "macos",
60 target_os = "freebsd",
61 target_os = "dragonfly"))]
62pub const _SC_GETPW_R_SIZE_MAX: libc::c_int = 71;
c34b1796 63#[cfg(any(target_os = "bitrig",
c1a9b12d 64 target_os = "netbsd",
c34b1796 65 target_os = "openbsd"))]
85aaf69f
SL
66pub const _SC_GETPW_R_SIZE_MAX: libc::c_int = 101;
67#[cfg(target_os = "android")]
68pub const _SC_GETPW_R_SIZE_MAX: libc::c_int = 0x0048;
69
70#[repr(C)]
71#[cfg(target_os = "linux")]
72pub struct passwd {
73 pub pw_name: *mut libc::c_char,
74 pub pw_passwd: *mut libc::c_char,
75 pub pw_uid: libc::uid_t,
76 pub pw_gid: libc::gid_t,
77 pub pw_gecos: *mut libc::c_char,
78 pub pw_dir: *mut libc::c_char,
79 pub pw_shell: *mut libc::c_char,
80}
81
82#[repr(C)]
83#[cfg(any(target_os = "macos",
84 target_os = "freebsd",
85 target_os = "dragonfly",
c34b1796 86 target_os = "bitrig",
c1a9b12d 87 target_os = "netbsd",
85aaf69f
SL
88 target_os = "openbsd"))]
89pub struct passwd {
90 pub pw_name: *mut libc::c_char,
91 pub pw_passwd: *mut libc::c_char,
92 pub pw_uid: libc::uid_t,
93 pub pw_gid: libc::gid_t,
94 pub pw_change: libc::time_t,
95 pub pw_class: *mut libc::c_char,
96 pub pw_gecos: *mut libc::c_char,
97 pub pw_dir: *mut libc::c_char,
98 pub pw_shell: *mut libc::c_char,
99 pub pw_expire: libc::time_t,
100}
101
102#[repr(C)]
103#[cfg(target_os = "android")]
104pub struct passwd {
105 pub pw_name: *mut libc::c_char,
106 pub pw_passwd: *mut libc::c_char,
107 pub pw_uid: libc::uid_t,
108 pub pw_gid: libc::gid_t,
109 pub pw_dir: *mut libc::c_char,
110 pub pw_shell: *mut libc::c_char,
111}
112
62682a34
SL
113// This is really a function pointer (or a union of multiple function
114// pointers), except for constants like SIG_DFL.
115pub type sighandler_t = *mut libc::c_void;
116
117pub const SIG_DFL: sighandler_t = 0 as sighandler_t;
118pub const SIG_ERR: sighandler_t = !0 as sighandler_t;
119
1a4d82fc 120extern {
1a4d82fc
JJ
121 pub fn getsockopt(sockfd: libc::c_int,
122 level: libc::c_int,
123 optname: libc::c_int,
124 optval: *mut libc::c_void,
125 optlen: *mut libc::socklen_t) -> libc::c_int;
126 pub fn ioctl(fd: libc::c_int, req: libc::c_ulong, ...) -> libc::c_int;
127
128
129 pub fn waitpid(pid: libc::pid_t, status: *mut libc::c_int,
130 options: libc::c_int) -> libc::pid_t;
131
62682a34
SL
132 pub fn raise(signum: libc::c_int) -> libc::c_int;
133
1a4d82fc
JJ
134 pub fn sigaction(signum: libc::c_int,
135 act: *const sigaction,
136 oldact: *mut sigaction) -> libc::c_int;
137
62682a34
SL
138 pub fn sigaltstack(ss: *const sigaltstack,
139 oss: *mut sigaltstack) -> libc::c_int;
140
141 #[cfg(not(target_os = "android"))]
1a4d82fc 142 pub fn sigemptyset(set: *mut sigset_t) -> libc::c_int;
85aaf69f 143
62682a34
SL
144 pub fn pthread_sigmask(how: libc::c_int, set: *const sigset_t,
145 oldset: *mut sigset_t) -> libc::c_int;
146
85aaf69f
SL
147 #[cfg(not(target_os = "ios"))]
148 pub fn getpwuid_r(uid: libc::uid_t,
149 pwd: *mut passwd,
150 buf: *mut libc::c_char,
151 buflen: libc::size_t,
152 result: *mut *mut passwd) -> libc::c_int;
153
154 pub fn utimes(filename: *const libc::c_char,
155 times: *const libc::timeval) -> libc::c_int;
156 pub fn gai_strerror(errcode: libc::c_int) -> *const libc::c_char;
9346a6ac
AL
157 pub fn setgroups(ngroups: libc::c_int,
158 ptr: *const libc::c_void) -> libc::c_int;
d9579d0f
AL
159 pub fn realpath(pathname: *const libc::c_char, resolved: *mut libc::c_char)
160 -> *mut libc::c_char;
1a4d82fc
JJ
161}
162
62682a34
SL
163// Ugh. This is only available as an inline until Android API 21.
164#[cfg(target_os = "android")]
165pub unsafe fn sigemptyset(set: *mut sigset_t) -> libc::c_int {
166 use intrinsics;
167 intrinsics::write_bytes(set, 0, 1);
168 return 0;
1a4d82fc
JJ
169}
170
62682a34 171#[cfg(any(target_os = "linux",
1a4d82fc 172 target_os = "android"))]
62682a34
SL
173mod signal_os {
174 pub use self::arch::{SA_ONSTACK, SA_SIGINFO, SIGBUS, SIG_SETMASK,
175 sigaction, sigaltstack};
1a4d82fc
JJ
176 use libc;
177
62682a34
SL
178 #[cfg(any(target_arch = "x86",
179 target_arch = "x86_64",
180 target_arch = "arm",
181 target_arch = "mips",
182 target_arch = "mipsel"))]
183 pub const SIGSTKSZ: libc::size_t = 8192;
184
185 // This is smaller on musl and Android, but no harm in being generous.
186 #[cfg(any(target_arch = "aarch64",
187 target_arch = "powerpc"))]
188 pub const SIGSTKSZ: libc::size_t = 16384;
189
190 // This definition is intentionally a subset of the C structure: the
191 // fields after si_code are actually a giant union. We're only
192 // interested in si_addr for this module, though.
1a4d82fc
JJ
193 #[repr(C)]
194 pub struct siginfo {
62682a34
SL
195 _signo: libc::c_int,
196 _errno: libc::c_int,
197 _code: libc::c_int,
198 // This structure will need extra padding here for MIPS64.
199 pub si_addr: *mut libc::c_void
1a4d82fc
JJ
200 }
201
62682a34 202 #[cfg(all(target_os = "linux", target_pointer_width = "32"))]
1a4d82fc 203 #[repr(C)]
1a4d82fc
JJ
204 pub struct sigset_t {
205 __val: [libc::c_ulong; 32],
206 }
207
62682a34 208 #[cfg(all(target_os = "linux", target_pointer_width = "64"))]
1a4d82fc 209 #[repr(C)]
1a4d82fc
JJ
210 pub struct sigset_t {
211 __val: [libc::c_ulong; 16],
212 }
1a4d82fc 213
62682a34
SL
214 // Android for MIPS has a 128-bit sigset_t, but we don't currently
215 // support it. Android for AArch64 technically has a structure of a
216 // single ulong.
217 #[cfg(target_os = "android")]
218 pub type sigset_t = libc::c_ulong;
219
220 #[cfg(any(target_arch = "x86",
221 target_arch = "x86_64",
222 target_arch = "powerpc",
223 target_arch = "arm",
224 target_arch = "aarch64"))]
225 mod arch {
226 use libc;
227 use super::super::sighandler_t;
228 use super::sigset_t;
229
230 pub const SA_ONSTACK: libc::c_ulong = 0x08000000;
231 pub const SA_SIGINFO: libc::c_ulong = 0x00000004;
232
233 pub const SIGBUS: libc::c_int = 7;
234
235 pub const SIG_SETMASK: libc::c_int = 2;
236
237 #[cfg(target_os = "linux")]
238 #[repr(C)]
239 pub struct sigaction {
240 pub sa_sigaction: sighandler_t,
241 pub sa_mask: sigset_t,
242 pub sa_flags: libc::c_ulong,
243 _restorer: *mut libc::c_void,
244 }
245
246 #[cfg(all(target_os = "android", target_pointer_width = "32"))]
247 #[repr(C)]
248 pub struct sigaction {
249 pub sa_sigaction: sighandler_t,
250 pub sa_flags: libc::c_ulong,
251 _restorer: *mut libc::c_void,
252 pub sa_mask: sigset_t,
253 }
254
255 #[cfg(all(target_os = "android", target_pointer_width = "64"))]
256 #[repr(C)]
257 pub struct sigaction {
258 pub sa_flags: libc::c_uint,
259 pub sa_sigaction: sighandler_t,
260 pub sa_mask: sigset_t,
261 _restorer: *mut libc::c_void,
262 }
263
264 #[repr(C)]
265 pub struct sigaltstack {
266 pub ss_sp: *mut libc::c_void,
267 pub ss_flags: libc::c_int,
268 pub ss_size: libc::size_t
269 }
1a4d82fc
JJ
270 }
271
62682a34
SL
272 #[cfg(any(target_arch = "mips",
273 target_arch = "mipsel"))]
274 mod arch {
275 use libc;
276 use super::super::sighandler_t;
277 use super::sigset_t;
278
279 pub const SA_ONSTACK: libc::c_ulong = 0x08000000;
280 pub const SA_SIGINFO: libc::c_ulong = 0x00000008;
281
282 pub const SIGBUS: libc::c_int = 10;
283
284 pub const SIG_SETMASK: libc::c_int = 3;
285
286 #[cfg(all(target_os = "linux", not(target_env = "musl")))]
287 #[repr(C)]
288 pub struct sigaction {
289 pub sa_flags: libc::c_uint,
290 pub sa_sigaction: sighandler_t,
291 pub sa_mask: sigset_t,
292 _restorer: *mut libc::c_void,
293 _resv: [libc::c_int; 1],
294 }
295
296 #[cfg(target_env = "musl")]
297 #[repr(C)]
298 pub struct sigaction {
299 pub sa_sigaction: sighandler_t,
300 pub sa_mask: sigset_t,
301 pub sa_flags: libc::c_ulong,
302 _restorer: *mut libc::c_void,
303 }
304
305 #[cfg(target_os = "android")]
306 #[repr(C)]
307 pub struct sigaction {
308 pub sa_flags: libc::c_uint,
309 pub sa_sigaction: sighandler_t,
310 pub sa_mask: sigset_t,
311 }
312
313 #[repr(C)]
314 pub struct sigaltstack {
315 pub ss_sp: *mut libc::c_void,
316 pub ss_size: libc::size_t,
317 pub ss_flags: libc::c_int,
318 }
1a4d82fc
JJ
319 }
320}
321
322#[cfg(any(target_os = "macos",
323 target_os = "ios",
324 target_os = "freebsd",
62682a34
SL
325 target_os = "dragonfly",
326 target_os = "bitrig",
c1a9b12d 327 target_os = "netbsd",
62682a34
SL
328 target_os = "openbsd"))]
329mod signal_os {
1a4d82fc 330 use libc;
62682a34 331 use super::sighandler_t;
1a4d82fc
JJ
332
333 pub const SA_ONSTACK: libc::c_int = 0x0001;
1a4d82fc 334 pub const SA_SIGINFO: libc::c_int = 0x0040;
62682a34
SL
335
336 pub const SIGBUS: libc::c_int = 10;
337
338 #[cfg(any(target_os = "macos", target_os = "ios"))]
339 pub const SIGSTKSZ: libc::size_t = 131072;
340 // FreeBSD's is actually arch-dependent, but never more than 40960.
341 // No harm in being generous.
342 #[cfg(not(any(target_os = "macos", target_os = "ios")))]
343 pub const SIGSTKSZ: libc::size_t = 40960;
344
345 pub const SIG_SETMASK: libc::c_int = 3;
1a4d82fc 346
85aaf69f 347 #[cfg(any(target_os = "macos",
c34b1796 348 target_os = "ios"))]
1a4d82fc
JJ
349 pub type sigset_t = u32;
350 #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
351 #[repr(C)]
352 pub struct sigset_t {
353 bits: [u32; 4],
354 }
c1a9b12d 355 #[cfg(any(target_os = "bitrig", target_os = "netbsd", target_os = "openbsd"))]
62682a34 356 pub type sigset_t = libc::c_uint;
1a4d82fc
JJ
357
358 // This structure has more fields, but we're not all that interested in
359 // them.
62682a34
SL
360 #[cfg(any(target_os = "macos", target_os = "ios",
361 target_os = "freebsd", target_os = "dragonfly"))]
362 #[repr(C)]
363 pub struct siginfo {
364 pub _signo: libc::c_int,
365 pub _errno: libc::c_int,
366 pub _code: libc::c_int,
367 pub _pid: libc::pid_t,
368 pub _uid: libc::uid_t,
369 pub _status: libc::c_int,
370 pub si_addr: *mut libc::c_void
371 }
c1a9b12d 372 #[cfg(any(target_os = "bitrig", target_os = "netbsd", target_os = "openbsd"))]
1a4d82fc
JJ
373 #[repr(C)]
374 pub struct siginfo {
375 pub si_signo: libc::c_int,
1a4d82fc 376 pub si_code: libc::c_int,
62682a34
SL
377 pub si_errno: libc::c_int,
378 pub si_addr: *mut libc::c_void
1a4d82fc
JJ
379 }
380
62682a34 381 #[cfg(any(target_os = "macos", target_os = "ios",
c1a9b12d 382 target_os = "bitrig", target_os = "netbsd", target_os = "openbsd"))]
1a4d82fc
JJ
383 #[repr(C)]
384 pub struct sigaction {
62682a34 385 pub sa_sigaction: sighandler_t,
1a4d82fc 386 pub sa_mask: sigset_t,
62682a34 387 pub sa_flags: libc::c_int,
1a4d82fc 388 }
c34b1796 389
62682a34 390 #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
c34b1796 391 #[repr(C)]
62682a34
SL
392 pub struct sigaction {
393 pub sa_sigaction: sighandler_t,
394 pub sa_flags: libc::c_int,
395 pub sa_mask: sigset_t,
c34b1796
AL
396 }
397
398 #[repr(C)]
62682a34
SL
399 pub struct sigaltstack {
400 pub ss_sp: *mut libc::c_void,
401 pub ss_size: libc::size_t,
402 pub ss_flags: libc::c_int,
c34b1796
AL
403 }
404}