diff --git a/filedescriptor/Cargo.toml b/filedescriptor/Cargo.toml index 320462d18..8778920bd 100644 --- a/filedescriptor/Cargo.toml +++ b/filedescriptor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "filedescriptor" -version = "0.3.0" +version = "0.4.0" authors = ["Wez Furlong"] edition = "2018" repository = "https://github.com/wez/wzsh" diff --git a/filedescriptor/src/lib.rs b/filedescriptor/src/lib.rs index 903d41296..0e9a7976f 100644 --- a/filedescriptor/src/lib.rs +++ b/filedescriptor/src/lib.rs @@ -112,9 +112,6 @@ pub use crate::windows::*; /// type. pub trait AsRawFileDescriptor { fn as_raw_file_descriptor(&self) -> RawFileDescriptor; - fn as_socket_descriptor(&self) -> SocketDescriptor { - self.as_raw_file_descriptor() as SocketDescriptor - } } /// `IntoRawFileDescriptor` is a platform independent trait for converting @@ -133,6 +130,16 @@ pub trait FromRawFileDescriptor { unsafe fn from_raw_file_descriptor(fd: RawFileDescriptor) -> Self; } +pub trait AsRawSocketDescriptor { + fn as_raw_socket_descriptor(&self) -> SocketDescriptor; +} +pub trait IntoRawSocketDescriptor { + fn into_raw_socket_descriptor(self) -> SocketDescriptor; +} +pub trait FromRawSocketDescriptor { + unsafe fn from_raw_socket_descriptor(fd: SocketDescriptor) -> Self; +} + /// `OwnedHandle` allows managing the lifetime of the platform `RawFileDescriptor` /// type. It is exposed in the interface of this crate primarily for convenience /// on Windows where the system handle type is used for a variety of objects diff --git a/filedescriptor/src/unix.rs b/filedescriptor/src/unix.rs index 860dcc8c8..7512c2332 100644 --- a/filedescriptor/src/unix.rs +++ b/filedescriptor/src/unix.rs @@ -1,6 +1,6 @@ use crate::{ - AsRawFileDescriptor, FileDescriptor, FromRawFileDescriptor, IntoRawFileDescriptor, OwnedHandle, - Pipe, + AsRawFileDescriptor, AsRawSocketDescriptor, FileDescriptor, FromRawFileDescriptor, + FromRawSocketDescriptor, IntoRawFileDescriptor, IntoRawSocketDescriptor, OwnedHandle, Pipe, }; use failure::{bail, Fallible}; use std::os::unix::prelude::*; @@ -33,6 +33,24 @@ impl FromRawFileDescriptor for T { } } +impl AsRawSocketDescriptor for T { + fn as_raw_socket_descriptor(&self) -> SocketDescriptor { + self.as_raw_fd() + } +} + +impl IntoRawSocketDescriptor for T { + fn into_raw_socket_descriptor(self) -> SocketDescriptor { + self.into_raw_fd() + } +} + +impl FromRawSocketDescriptor for T { + unsafe fn from_raw_socket_descriptor(fd: SocketDescriptor) -> Self { + Self::from_raw_fd(fd) + } +} + impl Drop for OwnedHandle { fn drop(&mut self) { unsafe { @@ -232,10 +250,10 @@ pub fn socketpair_impl() -> Fallible<(FileDescriptor, FileDescriptor)> { std::io::Error::last_os_error() ) } else { - let mut read = FileDescriptor { + let read = FileDescriptor { handle: OwnedHandle { handle: fds[0] }, }; - let mut write = FileDescriptor { + let write = FileDescriptor { handle: OwnedHandle { handle: fds[1] }, }; Ok((read, write)) diff --git a/filedescriptor/src/windows.rs b/filedescriptor/src/windows.rs index dba192f71..e36b9881b 100644 --- a/filedescriptor/src/windows.rs +++ b/filedescriptor/src/windows.rs @@ -1,6 +1,6 @@ use crate::{ - AsRawFileDescriptor, FileDescriptor, FromRawFileDescriptor, IntoRawFileDescriptor, OwnedHandle, - Pipe, + AsRawFileDescriptor, AsRawSocketDescriptor, FileDescriptor, FromRawFileDescriptor, + FromRawSocketDescriptor, IntoRawFileDescriptor, IntoRawSocketDescriptor, OwnedHandle, Pipe, }; use failure::{bail, Fallible}; use std::io::{self, Error as IoError}; @@ -52,6 +52,24 @@ impl FromRawFileDescriptor for T { } } +impl AsRawSocketDescriptor for T { + fn as_raw_socket_descriptor(&self) -> SocketDescriptor { + self.as_raw_socket() as SocketDescriptor + } +} + +impl IntoRawSocketDescriptor for T { + fn into_raw_socket_descriptor(self) -> SocketDescriptor { + self.into_raw_socket() as SocketDescriptor + } +} + +impl FromRawSocketDescriptor for T { + unsafe fn from_raw_socket_descriptor(handle: SocketDescriptor) -> Self { + Self::from_raw_socket(handle as _) + } +} + unsafe impl Send for OwnedHandle {} #[derive(Clone, Copy, PartialEq, Eq)]