diff --git a/.travis.yml b/.travis.yml index a87dd3bb1d..592fbeda21 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,9 +23,9 @@ matrix: - env: TARGET=armv7-linux-androideabi DISABLE_TESTS=1 rust: 1.13.0 - env: TARGET=i686-linux-android DISABLE_TESTS=1 - rust: 1.13.0 + rust: 1.18.0 - env: TARGET=x86_64-linux-android DISABLE_TESTS=1 - rust: 1.13.0 + rust: 1.18.0 # iOS - env: TARGET=aarch64-apple-ios DISABLE_TESTS=1 @@ -104,18 +104,6 @@ matrix: rust: nightly allow_failures: - # Android (in the process of fixing these, so they're allowed to fail for now) - - env: TARGET=aarch64-linux-android DISABLE_TESTS=1 - rust: 1.13.0 - - env: TARGET=arm-linux-androideabi DISABLE_TESTS=1 - rust: 1.13.0 - - env: TARGET=armv7-linux-androideabi DISABLE_TESTS=1 - rust: 1.13.0 - - env: TARGET=i686-linux-android DISABLE_TESTS=1 - rust: 1.13.0 - - env: TARGET=x86_64-linux-android DISABLE_TESTS=1 - rust: 1.13.0 - # iOS is still being worked on, so for now don't block on compilation failures - env: TARGET=aarch64-apple-ios DISABLE_TESTS=1 rust: 1.13.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 0828f34885..0e44306ff6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Introduced wrapper types for gid_t, pid_t, and uid_t as Gid, Pid, and Uid respectively. Various functions have been changed to use these new types as arguments. ([#629](https://github.com/nix-rust/nix/pull/629)) +- Promoted all Android targets to Tier 2 support ### Removed - Removed io::Error from nix::Error and conversion from nix::Error to Errno @@ -45,8 +46,11 @@ This project adheres to [Semantic Versioning](http://semver.org/). Now compiles on Linux/MIPS ([#538](https://github.com/nix-rust/nix/pull/538)), `Linux/PPC` ([#553](https://github.com/nix-rust/nix/pull/553)), `MacOS/x86_64,i686` ([#553](https://github.com/nix-rust/nix/pull/553)), - `NetBSD/x64_64` ([#538](https://github.com/nix-rust/nix/pull/538)), and - `FreeBSD/x86_64,i686` ([#536](https://github.com/nix-rust/nix/pull/536)). + `NetBSD/x64_64` ([#538](https://github.com/nix-rust/nix/pull/538)), + `FreeBSD/x86_64,i686` ([#536](https://github.com/nix-rust/nix/pull/536)), and + `Android` ([#631](https://github.com/nix-rust/nix/pull/631)). +- `bind` and `errno_location` now work correctly on `Android` + ([#631](https://github.com/nix-rust/nix/pull/631)) ## [0.8.1] 2017-04-16 diff --git a/README.md b/README.md index 3f51a51209..cf03cac804 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,8 @@ limitations. Support for platforms is split into two tiers: *do not* block the inclusion of new code. Testing may be run, but failures in tests don't block the inclusion of new code. -The following targets are all supported by nix on Rust 1.13.0 or newer: +The following targets are all supported by nix on Rust 1.13.0 or newer (unless +otherwise noted): Tier 1: * i686-unknown-linux-gnu @@ -68,18 +69,18 @@ Tier 1: Tier 2: * i686-unknown-freebsd * x86_64-unknown-netbsd + * aarch64-linux-android + * arm-linux-androideabi + * armv7-linux-androideabi + * i686-linux-android (requires Rust >= 1.18) + * x86_64-linux-android (requires Rust >= 1.18) Tier 3: * aarch64-apple-ios - * aarch64-linux-android - * arm-linux-androideabi * armv7-apple-ios - * armv7-linux-androideabi * armv7s-apple-ios * i386-apple-ios - * i686-linux-android * x86_64-apple-ios - * x86_64-linux-android ## Usage diff --git a/src/errno.rs b/src/errno.rs index a27abaa730..9102d7b17b 100644 --- a/src/errno.rs +++ b/src/errno.rs @@ -35,12 +35,18 @@ unsafe fn errno_location() -> *mut c_int { __errno() } -#[cfg(any(target_os = "linux", target_os = "android"))] +#[cfg(target_os = "linux")] unsafe fn errno_location() -> *mut c_int { extern { fn __errno_location() -> *mut c_int; } __errno_location() } +#[cfg(target_os = "android")] +unsafe fn errno_location() -> *mut c_int { + extern { fn __errno() -> *mut c_int; } + __errno() +} + /// Sets the platform-specific errno to no-error unsafe fn clear() -> () { *errno_location() = 0; diff --git a/src/macros.rs b/src/macros.rs index 046077f9ce..b8707d0b7e 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -19,6 +19,24 @@ /// } /// } /// ``` +/// +/// Example with casting, due to a mistake in libc. In this example, the +/// various flags have different types, so we cast the broken ones to the right +/// type. +/// +/// ``` +/// libc_bitflags!{ +/// pub flags SaFlags: libc::c_ulong { +/// SA_NOCLDSTOP as libc::c_ulong, +/// SA_NOCLDWAIT, +/// SA_NODEFER as libc::c_ulong, +/// SA_ONSTACK, +/// SA_RESETHAND as libc::c_ulong, +/// SA_RESTART as libc::c_ulong, +/// SA_SIGINFO, +/// } +/// } +/// ``` macro_rules! libc_bitflags { // (non-pub) Exit rule. (@call_bitflags @@ -130,6 +148,22 @@ macro_rules! libc_bitflags { } }; + // Munch last ident and cast it to the given type. + (@accumulate_flags + $prefix:tt, + [$($flags:tt)*]; + $flag:ident as $ty:ty + ) => { + libc_bitflags! { + @accumulate_flags + $prefix, + [ + $($flags)* + const $flag = libc::$flag as $ty; + ]; + } + }; + // Munch an ident; covers terminating comma case. (@accumulate_flags $prefix:tt, @@ -147,6 +181,24 @@ macro_rules! libc_bitflags { } }; + // Munch an ident and cast it to the given type; covers terminating comma + // case. + (@accumulate_flags + $prefix:tt, + [$($flags:tt)*]; + $flag:ident as $ty:ty, $($tail:tt)* + ) => { + libc_bitflags! { + @accumulate_flags + $prefix, + [ + $($flags)* + const $flag = libc::$flag as $ty; + ]; + $($tail)* + } + }; + // (non-pub) Entry rule. ( $(#[$attr:meta])* diff --git a/src/sys/signal.rs b/src/sys/signal.rs index e79780521a..ee952369ce 100644 --- a/src/sys/signal.rs +++ b/src/sys/signal.rs @@ -198,6 +198,7 @@ pub const SIGIOT : Signal = SIGABRT; pub const SIGPOLL : Signal = SIGIO; pub const SIGUNUSED : Signal = SIGSYS; +#[cfg(not(target_os = "android"))] libc_bitflags!{ pub flags SaFlags: libc::c_int { SA_NOCLDSTOP, @@ -210,6 +211,35 @@ libc_bitflags!{ } } +// On 64-bit android, sa_flags is c_uint while on 32-bit android, it is +// c_ulong. +// FIXME: https://github.com/rust-lang/libc/pull/511 +#[cfg(all(target_os = "android", target_pointer_width = "32"))] +libc_bitflags!{ + pub flags SaFlags: libc::c_ulong { + SA_NOCLDSTOP as libc::c_ulong, + SA_NOCLDWAIT as libc::c_ulong, + SA_NODEFER as libc::c_ulong, + SA_ONSTACK as libc::c_ulong, + SA_RESETHAND as libc::c_ulong, + SA_RESTART as libc::c_ulong, + SA_SIGINFO as libc::c_ulong, + } +} + +#[cfg(all(target_os = "android", target_pointer_width = "64"))] +libc_bitflags!{ + pub flags SaFlags: libc::c_uint { + SA_NOCLDSTOP as libc::c_uint, + SA_NOCLDWAIT as libc::c_uint, + SA_NODEFER as libc::c_uint, + SA_ONSTACK as libc::c_uint, + SA_RESETHAND as libc::c_uint, + SA_RESTART as libc::c_uint, + SA_SIGINFO as libc::c_uint, + } +} + #[repr(i32)] #[derive(Clone, Copy, PartialEq)] pub enum SigmaskHow { diff --git a/src/sys/socket/consts.rs b/src/sys/socket/consts.rs index ef3d0252df..ad9c522f14 100644 --- a/src/sys/socket/consts.rs +++ b/src/sys/socket/consts.rs @@ -40,10 +40,8 @@ mod os { pub const SO_LINGER: c_int = libc::SO_LINGER; pub const SO_MARK: c_int = libc::SO_MARK; pub const SO_OOBINLINE: c_int = libc::SO_OOBINLINE; - #[cfg(not(target_arch="arm"))] pub const SO_PASSCRED: c_int = libc::SO_PASSCRED; pub const SO_PEEK_OFF: c_int = libc::SO_PEEK_OFF; - #[cfg(not(target_arch="arm"))] pub const SO_PEERCRED: c_int = libc::SO_PEERCRED; pub const SO_PRIORITY: c_int = libc::SO_PRIORITY; pub const SO_PROTOCOL: c_int = libc::SO_PROTOCOL; @@ -57,7 +55,6 @@ mod os { pub const SO_REUSEPORT: c_int = libc::SO_REUSEPORT; pub const SO_RXQ_OVFL: c_int = libc::SO_RXQ_OVFL; pub const SO_SNDBUF: c_int = libc::SO_SNDBUF; - #[cfg(not(target_arch="arm"))] pub const SO_SNDBUFFORCE: c_int = libc::SO_SNDBUFFORCE; pub const SO_TIMESTAMP: c_int = libc::SO_TIMESTAMP; pub const SO_TYPE: c_int = libc::SO_TYPE; diff --git a/src/sys/socket/mod.rs b/src/sys/socket/mod.rs index 73cab9d574..a126f8b438 100644 --- a/src/sys/socket/mod.rs +++ b/src/sys/socket/mod.rs @@ -394,6 +394,7 @@ pub fn listen(sockfd: RawFd, backlog: usize) -> Result<()> { /// Bind a name to a socket /// /// [Further reading](http://man7.org/linux/man-pages/man2/bind.2.html) +#[cfg(not(all(target_os="android", target_pointer_width="64")))] pub fn bind(fd: RawFd, addr: &SockAddr) -> Result<()> { let res = unsafe { let (ptr, len) = addr.as_ffi_pair(); @@ -403,6 +404,21 @@ pub fn bind(fd: RawFd, addr: &SockAddr) -> Result<()> { Errno::result(res).map(drop) } +/// Bind a name to a socket +/// +/// [Further reading](http://man7.org/linux/man-pages/man2/bind.2.html) +// Android has some weirdness. Its 64-bit bind takes a c_int instead of a +// socklen_t +#[cfg(all(target_os="android", target_pointer_width="64"))] +pub fn bind(fd: RawFd, addr: &SockAddr) -> Result<()> { + let res = unsafe { + let (ptr, len) = addr.as_ffi_pair(); + ffi::bind(fd, ptr, len as c_int) + }; + + Errno::result(res).map(drop) +} + /// Accept a connection on a socket /// /// [Further reading](http://man7.org/linux/man-pages/man2/accept.2.html) diff --git a/src/sys/termios.rs b/src/sys/termios.rs index 65e7c01c70..0f8bd6c9e2 100644 --- a/src/sys/termios.rs +++ b/src/sys/termios.rs @@ -39,7 +39,6 @@ mod ffi { pub use self::non_android::*; // On Android before 5.0, Bionic directly inline these to ioctl() calls. - #[inline] #[cfg(all(target_os = "android", not(target_arch = "mips")))] mod android { use libc;