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 5, 2020
1 parent 5d2a8c2 commit 1ebd893
Show file tree
Hide file tree
Showing 10 changed files with 194 additions and 94 deletions.
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
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: 2 additions & 0 deletions src/pty.rs
Expand Up @@ -29,6 +29,7 @@ pub struct OpenptyResult {
///
/// This is returned by `forkpty`. Note that this type does *not* implement `Drop`, so the user
/// must manually close the file descriptors.
#[cfg(not(target_os = "fuchsia"))]
#[derive(Clone, Copy, Debug)]
pub struct ForkptyResult {
/// The master port in a virtual pty pair
Expand Down Expand Up @@ -302,6 +303,7 @@ pub fn openpty<'a, 'b, T: Into<Option<&'a Winsize>>, U: Into<Option<&'b Termios>
/// If `winsize` is not `None`, the window size of the slave will be set to
/// the values in `winsize`. If `termios` is not `None`, the pseudoterminal's
/// terminal settings of the slave will be set to the values in `termios`.
#[cfg(not(target_os = "fuchsia"))]
pub fn forkpty<'a, 'b, T: Into<Option<&'a Winsize>>, U: Into<Option<&'b Termios>>>(
winsize: T,
termios: U,
Expand Down

0 comments on commit 1ebd893

Please sign in to comment.