From 5ac61ec8d38a862ab2888ded9a0d0b834719b446 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Wed, 19 Jun 2019 11:11:06 -0700 Subject: [PATCH] expand socket descriptor concept I didn't notice that windows has separate traits for raw sockets, so blanket impls for things that returned RawHandle's were not applying on windows in the same way that they were on unix systems. --- filedescriptor/Cargo.toml | 2 +- filedescriptor/src/lib.rs | 13 ++++++++++--- filedescriptor/src/unix.rs | 26 ++++++++++++++++++++++---- filedescriptor/src/windows.rs | 22 ++++++++++++++++++++-- 4 files changed, 53 insertions(+), 10 deletions(-) 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)]