Skip to content

Commit

Permalink
Add fuchsia support
Browse files Browse the repository at this point in the history
Allow nix to compile on Fuchsia by conditionally avoiding libc
functionality that does not exist for Fuchsia.
  • Loading branch information
amanda-tait authored and tamird committed Nov 15, 2020
1 parent b373f2f commit 1d79e31
Show file tree
Hide file tree
Showing 15 changed files with 220 additions and 110 deletions.
10 changes: 10 additions & 0 deletions .travis.yml
Expand Up @@ -106,6 +106,16 @@ matrix:
- . $HOME/.cargo/env
- cargo build --all-targets

# Fuchsia doesn't have external CI support, so we'll just make sure things compile
- language: generic
name: fuchsia
script:
- curl --proto '=https' --tlsv1.2 -sSf --output rustup.sh https://sh.rustup.rs
- sh rustup.sh -y --profile=minimal --default-toolchain 1.36.0 --target x86_64-fuchsia
- . $HOME/.cargo/env
- cargo build --all-targets
- cargo test --all-targets --no-run

before_install: set -e

install:
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -6,6 +6,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
## [Unreleased] - ReleaseDate
### Added
- Added `mremap` (#[1306](https://github.com/nix-rust/nix/pull/1306))
- Added limited Fuchsia support (#[1285](https://github.com/nix-rust/nix/pull/1285))
### Changed
### Fixed
### Removed
Expand Down
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -82,6 +82,7 @@ Tier 2:
* x86_64-unknown-netbsd

Tier 3:
* x86_64-fuchsia
* x86_64-unknown-redox

## Usage
Expand Down
192 changes: 128 additions & 64 deletions src/errno.rs
Expand Up @@ -20,7 +20,8 @@ cfg_if! {
}
} else if #[cfg(any(target_os = "linux",
target_os = "redox",
target_os = "dragonfly"))] {
target_os = "dragonfly",
target_os = "fuchsia"))] {
unsafe fn errno_location() -> *mut c_int {
libc::__errno_location()
}
Expand Down Expand Up @@ -188,192 +189,254 @@ fn desc(errno: Errno) -> &'static str {
EHOSTDOWN => "Host is down",
EHOSTUNREACH => "No route to host",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ECHRNG => "Channel number out of range",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EL2NSYNC => "Level 2 not synchronized",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EL3HLT => "Level 3 halted",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EL3RST => "Level 3 reset",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ELNRNG => "Link number out of range",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EUNATCH => "Protocol driver not attached",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENOCSI => "No CSI structure available",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EL2HLT => "Level 2 halted",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EBADE => "Invalid exchange",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EBADR => "Invalid request descriptor",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EXFULL => "Exchange full",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENOANO => "No anode",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EBADRQC => "Invalid request code",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EBADSLT => "Invalid slot",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EBFONT => "Bad font file format",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENOSTR => "Device not a stream",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENODATA => "No data available",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ETIME => "Timer expired",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENOSR => "Out of streams resources",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENONET => "Machine is not on the network",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENOPKG => "Package not installed",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EREMOTE => "Object is remote",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENOLINK => "Link has been severed",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EADV => "Advertise error",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ESRMNT => "Srmount error",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ECOMM => "Communication error on send",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EPROTO => "Protocol error",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EMULTIHOP => "Multihop attempted",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EDOTDOT => "RFS specific error",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EBADMSG => "Not a data message",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EOVERFLOW => "Value too large for defined data type",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENOTUNIQ => "Name not unique on network",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EBADFD => "File descriptor in bad state",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EREMCHG => "Remote address changed",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ELIBACC => "Can not access a needed shared library",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ELIBBAD => "Accessing a corrupted shared library",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ELIBSCN => ".lib section in a.out corrupted",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ELIBMAX => "Attempting to link in too many shared libraries",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ELIBEXEC => "Cannot exec a shared library directly",

#[cfg(any(target_os = "linux", target_os = "android", target_os = "openbsd"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia", target_os = "openbsd"))]
EILSEQ => "Illegal byte sequence",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ERESTART => "Interrupted system call should be restarted",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ESTRPIPE => "Streams pipe error",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EUSERS => "Too many users",

#[cfg(any(target_os = "linux", target_os = "android",
target_os = "netbsd", target_os = "redox"))]
target_os = "fuchsia", target_os = "netbsd",
target_os = "redox"))]
EOPNOTSUPP => "Operation not supported on transport endpoint",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ESTALE => "Stale file handle",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EUCLEAN => "Structure needs cleaning",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENOTNAM => "Not a XENIX named type file",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENAVAIL => "No XENIX semaphores available",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EISNAM => "Is a named type file",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EREMOTEIO => "Remote I/O error",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EDQUOT => "Quota exceeded",

#[cfg(any(target_os = "linux", target_os = "android",
target_os = "openbsd", target_os = "dragonfly"))]
target_os = "fuchsia", target_os = "openbsd",
target_os = "dragonfly"))]
ENOMEDIUM => "No medium found",

#[cfg(any(target_os = "linux", target_os = "android", target_os = "openbsd"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia", target_os = "openbsd"))]
EMEDIUMTYPE => "Wrong medium type",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ECANCELED => "Operation canceled",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENOKEY => "Required key not available",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EKEYEXPIRED => "Key has expired",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EKEYREVOKED => "Key has been revoked",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EKEYREJECTED => "Key was rejected by service",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
EOWNERDEAD => "Owner died",

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
ENOTRECOVERABLE => "State not recoverable",

#[cfg(all(target_os = "linux", not(target_arch="mips")))]
#[cfg(any(all(target_os = "linux", not(target_arch="mips")),
target_os = "fuchsia"))]
ERFKILL => "Operation not possible due to RF-kill",

#[cfg(all(target_os = "linux", not(target_arch="mips")))]
#[cfg(any(all(target_os = "linux", not(target_arch="mips")),
target_os = "fuchsia"))]
EHWPOISON => "Memory page has hardware error",

#[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
Expand Down Expand Up @@ -567,7 +630,8 @@ fn desc(errno: Errno) -> &'static str {
}
}

#[cfg(any(target_os = "linux", target_os = "android"))]
#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
mod consts {
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(i32)]
Expand Down
2 changes: 1 addition & 1 deletion src/features.rs
Expand Up @@ -97,7 +97,7 @@ mod os {
#[cfg(any(target_os = "macos", target_os = "freebsd",
target_os = "dragonfly", target_os = "ios",
target_os = "openbsd", target_os = "netbsd",
target_os = "redox"))]
target_os = "redox", target_os = "fuchsia"))]
mod os {
/// Check if the OS supports atomic close-on-exec for sockets
pub fn socket_atomic_cloexec() -> bool {
Expand Down
2 changes: 1 addition & 1 deletion src/lib.rs
Expand Up @@ -57,7 +57,7 @@ pub mod net;
#[deny(missing_docs)]
pub mod poll;
#[deny(missing_docs)]
#[cfg(not(target_os = "redox"))]
#[cfg(not(any(target_os = "redox", target_os = "fuchsia")))]
pub mod pty;
pub mod sched;
pub mod sys;
Expand Down

0 comments on commit 1d79e31

Please sign in to comment.