]>
git.proxmox.com Git - rustc.git/blob - src/libstd/sys/unix/mod.rs
1 // Copyright 2014 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.
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.
11 #![allow(missing_docs, bad_style)]
13 use io
::{self, ErrorKind}
;
16 #[cfg(any(dox, target_os = "linux"))] pub use os::linux as platform;
18 #[cfg(all(not(dox), target_os = "android"))] pub use os::android as platform;
19 #[cfg(all(not(dox), target_os = "bitrig"))] pub use os::bitrig as platform;
20 #[cfg(all(not(dox), target_os = "dragonfly"))] pub use os::dragonfly as platform;
21 #[cfg(all(not(dox), target_os = "freebsd"))] pub use os::freebsd as platform;
22 #[cfg(all(not(dox), target_os = "haiku"))] pub use os::haiku as platform;
23 #[cfg(all(not(dox), target_os = "ios"))] pub use os::ios as platform;
24 #[cfg(all(not(dox), target_os = "macos"))] pub use os::macos as platform;
25 #[cfg(all(not(dox), target_os = "netbsd"))] pub use os::netbsd as platform;
26 #[cfg(all(not(dox), target_os = "openbsd"))] pub use os::openbsd as platform;
27 #[cfg(all(not(dox), target_os = "solaris"))] pub use os::solaris as platform;
28 #[cfg(all(not(dox), target_os = "emscripten"))] pub use os::emscripten as platform;
29 #[cfg(all(not(dox), target_os = "fuchsia"))] pub use os::fuchsia as platform;
30 #[cfg(all(not(dox), target_os = "l4re"))] pub use os::linux as platform;
32 pub use self::rand
::hashmap_random_keys
;
40 #[cfg(feature = "backtrace")]
46 pub mod fast_thread_local
;
51 #[cfg(not(target_os = "l4re"))]
53 #[cfg(target_os = "l4re")]
55 #[cfg(target_os = "l4re")]
56 pub use self::l4re
::net
;
64 pub mod stack_overflow
;
72 // By default, some platforms will send a *signal* when an EPIPE error
73 // would otherwise be delivered. This runtime doesn't install a SIGPIPE
74 // handler, causing it to kill the program, which isn't exactly what we
77 // Hence, we set SIGPIPE to ignore when the program starts up in order
78 // to prevent this problem.
83 #[cfg(not(any(target_os = "emscripten", target_os="fuchsia")))]
84 unsafe fn reset_sigpipe() {
85 assert
!(signal(libc
::SIGPIPE
, libc
::SIG_IGN
) != libc
::SIG_ERR
);
87 #[cfg(any(target_os = "emscripten", target_os="fuchsia"))]
88 unsafe fn reset_sigpipe() {}
91 #[cfg(target_os = "android")]
92 pub use sys
::android
::signal
;
93 #[cfg(not(target_os = "android"))]
96 pub fn decode_error_kind(errno
: i32) -> ErrorKind
{
97 match errno
as libc
::c_int
{
98 libc
::ECONNREFUSED
=> ErrorKind
::ConnectionRefused
,
99 libc
::ECONNRESET
=> ErrorKind
::ConnectionReset
,
100 libc
::EPERM
| libc
::EACCES
=> ErrorKind
::PermissionDenied
,
101 libc
::EPIPE
=> ErrorKind
::BrokenPipe
,
102 libc
::ENOTCONN
=> ErrorKind
::NotConnected
,
103 libc
::ECONNABORTED
=> ErrorKind
::ConnectionAborted
,
104 libc
::EADDRNOTAVAIL
=> ErrorKind
::AddrNotAvailable
,
105 libc
::EADDRINUSE
=> ErrorKind
::AddrInUse
,
106 libc
::ENOENT
=> ErrorKind
::NotFound
,
107 libc
::EINTR
=> ErrorKind
::Interrupted
,
108 libc
::EINVAL
=> ErrorKind
::InvalidInput
,
109 libc
::ETIMEDOUT
=> ErrorKind
::TimedOut
,
110 libc
::EEXIST
=> ErrorKind
::AlreadyExists
,
112 // These two constants can have the same value on some systems,
113 // but different values on others, so we can't use a match
115 x
if x
== libc
::EAGAIN
|| x
== libc
::EWOULDBLOCK
=>
116 ErrorKind
::WouldBlock
,
118 _
=> ErrorKind
::Other
,
123 pub trait IsMinusOne
{
124 fn is_minus_one(&self) -> bool
;
127 macro_rules
! impl_is_minus_one
{
128 ($
($t
:ident
)*) => ($
(impl IsMinusOne
for $t
{
129 fn is_minus_one(&self) -> bool
{
135 impl_is_minus_one
! { i8 i16 i32 i64 isize }
137 pub fn cvt
<T
: IsMinusOne
>(t
: T
) -> io
::Result
<T
> {
138 if t
.is_minus_one() {
139 Err(io
::Error
::last_os_error())
145 pub fn cvt_r
<T
, F
>(mut f
: F
) -> io
::Result
<T
>
151 Err(ref e
) if e
.kind() == ErrorKind
::Interrupted
=> {}
152 other
=> return other
,
157 // On Unix-like platforms, libc::abort will unregister signal handlers
158 // including the SIGABRT handler, preventing the abort from being blocked, and
159 // fclose streams, with the side effect of flushing them so libc bufferred
160 // output will be printed. Additionally the shell will generally print a more
161 // understandable error message like "Abort trap" rather than "Illegal
162 // instruction" that intrinsics::abort would cause, as intrinsics::abort is
163 // implemented as an illegal instruction.
164 pub unsafe fn abort_internal() -> ! {