Skip to content

Commit

Permalink
Allow compilation of nix on android
Browse files Browse the repository at this point in the history
  • Loading branch information
roblabla committed Jul 3, 2017
1 parent 1bd18d5 commit 9936533
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 5 deletions.
8 changes: 7 additions & 1 deletion src/errno.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
33 changes: 33 additions & 0 deletions src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,22 @@ macro_rules! libc_bitflags {
}
};

// Munch last ident with as
(@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,
Expand All @@ -147,6 +163,23 @@ macro_rules! libc_bitflags {
}
};

// Munch an ident; covers terminating comma case with as.
(@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])*
Expand Down
30 changes: 30 additions & 0 deletions src/sys/signal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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 {
Expand Down
3 changes: 0 additions & 3 deletions src/sys/socket/consts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
16 changes: 16 additions & 0 deletions src/sys/socket/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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)
Expand Down
1 change: 0 additions & 1 deletion src/sys/termios.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 9936533

Please sign in to comment.