Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement extra traits for all types #1035

Merged
merged 6 commits into from
Jun 12, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ task:
setup_script:
- pkg install -y curl
- curl https://sh.rustup.rs -sSf --output rustup.sh
- sh rustup.sh -y --default-toolchain 1.24.1
- sh rustup.sh -y --default-toolchain 1.25.0
- $HOME/.cargo/bin/rustup target add i686-unknown-freebsd
amd64_test_script:
- . $HOME/.cargo/env
Expand Down
50 changes: 25 additions & 25 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,71 +18,71 @@ matrix:
# week. Additionally they're moved to the front of the line to get them in
# the Travis OS X build queue first.
- env: TARGET="aarch64-apple-ios;armv7-apple-ios;armv7s-apple-ios;i386-apple-ios;x86_64-apple-ios" DISABLE_TESTS=1
rust: 1.24.1
rust: 1.25.0
os: osx

# Mac builds
# These are also moved to be first because they wait in a long queue with
# Travis
- env: TARGET=i686-apple-darwin
rust: 1.24.1
rust: 1.25.0
os: osx
- env: TARGET=x86_64-apple-darwin
rust: 1.24.1
rust: 1.25.0
os: osx

# Android
- env: TARGET=aarch64-linux-android DISABLE_TESTS=1
rust: 1.24.1
rust: 1.25.0
- env: TARGET=arm-linux-androideabi DISABLE_TESTS=1
rust: 1.24.1
rust: 1.25.0
- env: TARGET=armv7-linux-androideabi DISABLE_TESTS=1
rust: 1.24.1
rust: 1.25.0
- env: TARGET=i686-linux-android DISABLE_TESTS=1
rust: 1.24.1
rust: 1.25.0
- env: TARGET=x86_64-linux-android DISABLE_TESTS=1
rust: 1.24.1
rust: 1.25.0

# Linux
- env: TARGET=aarch64-unknown-linux-gnu
rust: 1.24.1
rust: 1.25.0
- env: TARGET=arm-unknown-linux-gnueabi
rust: 1.24.1
rust: 1.25.0
- env: TARGET=arm-unknown-linux-musleabi DISABLE_TESTS=1
rust: 1.24.1
rust: 1.25.0
- env: TARGET=armv7-unknown-linux-gnueabihf
rust: 1.24.1
rust: 1.25.0
- env: TARGET=i686-unknown-linux-gnu
rust: 1.24.1
rust: 1.25.0
- env: TARGET=i686-unknown-linux-musl
rust: 1.24.1
rust: 1.25.0
- env: TARGET=mips-unknown-linux-gnu
rust: 1.24.1
rust: 1.25.0
- env: TARGET=mips64-unknown-linux-gnuabi64
rust: 1.24.1
rust: 1.25.0
- env: TARGET=mips64el-unknown-linux-gnuabi64
rust: 1.24.1
rust: 1.25.0
- env: TARGET=mipsel-unknown-linux-gnu
rust: 1.24.1
rust: 1.25.0
- env: TARGET=powerpc-unknown-linux-gnu DISABLE_TESTS=1
rust: 1.24.1
rust: 1.25.0
- env: TARGET=powerpc64-unknown-linux-gnu
rust: 1.24.1
rust: 1.25.0
- env: TARGET=powerpc64le-unknown-linux-gnu
rust: 1.24.1
rust: 1.25.0
- env: TARGET=s390x-unknown-linux-gnu DISABLE_TESTS=1
rust: 1.24.1
rust: 1.25.0
- env: TARGET=x86_64-unknown-linux-gnu
rust: 1.24.1
rust: 1.25.0
- env: TARGET=x86_64-unknown-linux-musl
rust: 1.24.1
rust: 1.25.0

# *BSD
# FreeBSD i686 and x86_64 use Cirrus instead of Travis
# - env: TARGET=i686-unknown-freebsd DISABLE_TESTS=1
# - env: TARGET=x86_64-unknown-freebsd DISABLE_TESTS=1
- env: TARGET=x86_64-unknown-netbsd DISABLE_TESTS=1
rust: 1.24.1
rust: 1.25.0

# Make sure stable is always working too
- env: TARGET=x86_64-unknown-linux-gnu
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Added
- Added `MSG_WAITALL` to `MsgFlags` in `sys::socket`.
([#1079](https://github.com/nix-rust/nix/pull/1079))
- Implemented `Clone`, `Copy`, `Debug`, `Eq`, `Hash`, and `PartialEq` for most
types that support them. ([#1035](https://github.com/nix-rust/nix/pull/1035))

### Changed
- Support for `ifaddrs` now present when building for Android.
([#1077](https://github.com/nix-rust/nix/pull/1077))
- Minimum supported Rust version is now 1.25.0
([#1035](https://github.com/nix-rust/nix/pull/1035))

### Fixed
### Removed
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ exclude = [
]

[dependencies]
libc = { git = "https://github.com/rust-lang/libc" }
libc = { git = "https://github.com/rust-lang/libc", features = [ "extra_traits" ] }
bitflags = "1.0"
cfg-if = "0.1.0"
void = "1.0.2"
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ limitations. Support for platforms is split into three 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.24.1 or newer (unless
otherwise noted):
The following targets are supported by `nix`:

Tier 1:
* aarch64-unknown-linux-gnu
Expand Down Expand Up @@ -84,6 +83,8 @@ Tier 2:

## Usage

`nix` requires Rust 1.25.0 or newer.

To use `nix`, first add this to your `Cargo.toml`:

```toml
Expand Down
41 changes: 12 additions & 29 deletions src/dir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use errno::Errno;
use fcntl::{self, OFlag};
use libc;
use std::os::unix::io::{AsRawFd, IntoRawFd, RawFd};
use std::{ffi, fmt, ptr};
use std::{ffi, ptr};
use sys;

#[cfg(target_os = "linux")]
Expand All @@ -25,9 +25,9 @@ use libc::{dirent, readdir_r};
/// * returns entries for `.` (current directory) and `..` (parent directory).
/// * returns entries' names as a `CStr` (no allocation or conversion beyond whatever libc
/// does).
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct Dir(
// This could be ptr::NonNull once nix requires Rust 1.25.
*mut libc::DIR
ptr::NonNull<libc::DIR>
);

impl Dir {
Expand Down Expand Up @@ -59,7 +59,8 @@ impl Dir {
unsafe { libc::close(fd) };
return Err(e);
};
Ok(Dir(d))
// Always guaranteed to be non-null by the previous check
Ok(Dir(ptr::NonNull::new(d).unwrap()))
}

/// Returns an iterator of `Result<Entry>` which rewinds when finished.
Expand All @@ -78,25 +79,17 @@ unsafe impl Send for Dir {}

impl AsRawFd for Dir {
fn as_raw_fd(&self) -> RawFd {
unsafe { libc::dirfd(self.0) }
}
}

impl fmt::Debug for Dir {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Dir")
.field("fd", &self.as_raw_fd())
.finish()
unsafe { libc::dirfd(self.0.as_ptr()) }
}
}

impl Drop for Dir {
fn drop(&mut self) {
unsafe { libc::closedir(self.0) };
unsafe { libc::closedir(self.0.as_ptr()) };
}
}

#[derive(Debug)]
#[derive(Debug, Eq, Hash, PartialEq)]
pub struct Iter<'d>(&'d mut Dir);

impl<'d> Iterator for Iter<'d> {
Expand All @@ -111,7 +104,7 @@ impl<'d> Iterator for Iter<'d> {
// Probably fine here too then.
let mut ent: Entry = Entry(::std::mem::uninitialized());
let mut result = ptr::null_mut();
if let Err(e) = Errno::result(readdir_r((self.0).0, &mut ent.0, &mut result)) {
if let Err(e) = Errno::result(readdir_r((self.0).0.as_ptr(), &mut ent.0, &mut result)) {
return Some(Err(e));
}
if result == ptr::null_mut() {
Expand All @@ -125,17 +118,17 @@ impl<'d> Iterator for Iter<'d> {

impl<'d> Drop for Iter<'d> {
fn drop(&mut self) {
unsafe { libc::rewinddir((self.0).0) }
unsafe { libc::rewinddir((self.0).0.as_ptr()) }
}
}

/// A directory entry, similar to `std::fs::DirEntry`.
///
/// Note that unlike the std version, this may represent the `.` or `..` entries.
#[derive(Copy, Clone)]
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
pub struct Entry(dirent);

#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
pub enum Type {
Fifo,
CharacterDevice,
Expand Down Expand Up @@ -198,13 +191,3 @@ impl Entry {
}
}
}

impl fmt::Debug for Entry {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Entry")
.field("ino", &self.ino())
.field("file_name", &self.file_name())
.field("file_type", &self.file_type())
.finish()
}
}
5 changes: 2 additions & 3 deletions src/fcntl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ libc_bitflags!(
}
);

#[allow(missing_debug_implementations)]
#[derive(Debug, Eq, Hash, PartialEq)]
pub enum FcntlArg<'a> {
F_DUPFD(RawFd),
F_DUPFD_CLOEXEC(RawFd),
Expand Down Expand Up @@ -277,8 +277,7 @@ pub fn fcntl(fd: RawFd, arg: FcntlArg) -> Result<c_int> {
Errno::result(res)
}

#[derive(Clone, Copy)]
#[allow(missing_debug_implementations)]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum FlockArg {
LockShared,
LockExclusive,
Expand Down
2 changes: 1 addition & 1 deletion src/ifaddrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use sys::socket::SockAddr;
use net::if_::*;

/// Describes a single address for an interface as returned by `getifaddrs`.
#[derive(Clone, Eq, Hash, PartialEq, Debug)]
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct InterfaceAddress {
/// Name of the network interface
pub interface_name: String,
Expand Down
2 changes: 1 addition & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ pub type Result<T> = result::Result<T, Error>;
/// error has a corresponding errno (usually the one from the
/// underlying OS) to which it can be mapped in addition to
/// implementing other common traits.
#[derive(Clone, Copy, Debug, PartialEq)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Error {
Sys(Errno),
InvalidPath,
Expand Down
13 changes: 1 addition & 12 deletions src/mqueue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,22 +29,11 @@ libc_bitflags!{
}

#[repr(C)]
#[derive(Clone, Copy)]
#[allow(missing_debug_implementations)]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct MqAttr {
mq_attr: libc::mq_attr,
}

impl PartialEq<MqAttr> for MqAttr {
Susurrus marked this conversation as resolved.
Show resolved Hide resolved
fn eq(&self, other: &MqAttr) -> bool {
let self_attr = self.mq_attr;
let other_attr = other.mq_attr;
self_attr.mq_flags == other_attr.mq_flags && self_attr.mq_maxmsg == other_attr.mq_maxmsg &&
self_attr.mq_msgsize == other_attr.mq_msgsize &&
self_attr.mq_curmsgs == other_attr.mq_curmsgs
}
}

impl MqAttr {
pub fn new(mq_flags: c_long,
mq_maxmsg: c_long,
Expand Down
20 changes: 1 addition & 19 deletions src/poll.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ use sys::time::TimeSpec;
#[cfg(any(target_os = "android", target_os = "dragonfly", target_os = "freebsd", target_os = "linux"))]
use sys::signal::SigSet;
use std::os::unix::io::RawFd;
use std::fmt;

use libc;
use Result;
Expand All @@ -19,7 +18,7 @@ use errno::Errno;
/// After a call to `poll` or `ppoll`, the events that occured can be
/// retrieved by calling [`revents()`](#method.revents) on the `PollFd`.
#[repr(C)]
#[derive(Clone, Copy)]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct PollFd {
pollfd: libc::pollfd,
}
Expand All @@ -43,23 +42,6 @@ impl PollFd {
}
}

impl fmt::Debug for PollFd {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let pfd = self.pollfd;
let mut ds = f.debug_struct("PollFd");
ds.field("fd", &pfd.fd);
match PollFlags::from_bits(pfd.events) {
None => ds.field("events", &pfd.events),
Some(ef) => ds.field("events", &ef),
};
match PollFlags::from_bits(pfd.revents) {
None => ds.field("revents", &pfd.revents),
Some(ef) => ds.field("revents", &ef),
};
ds.finish()
}
}

libc_bitflags! {
/// These flags define the different events that can be monitored by `poll` and `ppoll`
pub struct PollFlags: libc::c_short {
Expand Down
5 changes: 2 additions & 3 deletions src/pty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ use errno::Errno;
///
/// This is returned by `openpty`. Note that this type does *not* implement `Drop`, so the user
/// must manually close the file descriptors.
#[derive(Clone, Copy)]
#[allow(missing_debug_implementations)]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct OpenptyResult {
/// The master port in a virtual pty pair
pub master: RawFd,
Expand All @@ -45,7 +44,7 @@ pub struct ForkptyResult {
/// While this datatype is a thin wrapper around `RawFd`, it enforces that the available PTY
/// functions are given the correct file descriptor. Additionally this type implements `Drop`,
/// so that when it's consumed or goes out of scope, it's automatically cleaned-up.
#[derive(Debug)]
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct PtyMaster(RawFd);

impl AsRawFd for PtyMaster {
Expand Down
3 changes: 1 addition & 2 deletions src/sched.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ libc_bitflags!{
pub type CloneCb<'a> = Box<FnMut() -> isize + 'a>;

#[repr(C)]
#[derive(Clone, Copy)]
#[allow(missing_debug_implementations)]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct CpuSet {
cpu_set: libc::cpu_set_t,
}
Expand Down
Loading