summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2017-07-04 18:39:33 +0000
committerbors[bot] <bors[bot]@users.noreply.github.com>2017-07-04 18:39:33 +0000
commit3912a202255d9fee797703966998babbc79fc49b (patch)
treec90eda445af8f832db5225ae8de9a474dd98e782
parent9e51647095af4612870c0e4582b739c8147784dc (diff)
parent552fccf1e02ee2b075ae0528ee5f22b0f1791db3 (diff)
downloadnix-3912a202255d9fee797703966998babbc79fc49b.zip
Merge #631
631: Allow nix to compile on android r=Susurrus Fixes #313
-rw-r--r--.travis.yml16
-rw-r--r--CHANGELOG.md8
-rw-r--r--README.md13
-rw-r--r--src/errno.rs8
-rw-r--r--src/macros.rs52
-rw-r--r--src/sys/signal.rs30
-rw-r--r--src/sys/socket/consts.rs3
-rw-r--r--src/sys/socket/mod.rs16
-rw-r--r--src/sys/termios.rs1
9 files changed, 120 insertions, 27 deletions
diff --git a/.travis.yml b/.travis.yml
index a87dd3bb..592fbeda 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 0828f348..0e44306f 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 3f51a512..cf03cac8 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 a27abaa7..9102d7b1 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 046077f9..b8707d0b 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 e7978052..ee952369 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 ef3d0252..ad9c522f 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 73cab9d5..a126f8b4 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 65e7c01c..0f8bd6c9 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;