Skip to content

Commit b3e1ab1

Browse files
Implement the I/O-safety traits for Socket
This implements: * The AsFd and AsSocket traits for Socket. * From<OwnedFd> and From<OwnedSocket> for Socket. * From<Socket> for OwnedFd and OwnedSocket. Co-authored-by: Thomas de Zeeuw <[email protected]>
1 parent 54bf112 commit b3e1ab1

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

src/sys/unix.rs

+25-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use std::os::unix::ffi::OsStrExt;
3737
)
3838
))]
3939
use std::os::unix::io::RawFd;
40-
use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd};
40+
use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd};
4141
#[cfg(feature = "all")]
4242
use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream};
4343
#[cfg(feature = "all")]
@@ -2006,20 +2006,44 @@ impl crate::Socket {
20062006
}
20072007
}
20082008

2009+
#[cfg_attr(docsrs, doc(cfg(unix)))]
2010+
impl AsFd for crate::Socket {
2011+
fn as_fd(&self) -> BorrowedFd<'_> {
2012+
// SAFETY: lifetime is bound by self.
2013+
unsafe { BorrowedFd::borrow_raw(self.as_raw()) }
2014+
}
2015+
}
2016+
20092017
#[cfg_attr(docsrs, doc(cfg(unix)))]
20102018
impl AsRawFd for crate::Socket {
20112019
fn as_raw_fd(&self) -> c_int {
20122020
self.as_raw()
20132021
}
20142022
}
20152023

2024+
#[cfg_attr(docsrs, doc(cfg(unix)))]
2025+
impl From<crate::Socket> for OwnedFd {
2026+
fn from(sock: crate::Socket) -> OwnedFd {
2027+
// SAFETY: sock.into_raw() always returns a valid fd.
2028+
unsafe { OwnedFd::from_raw_fd(sock.into_raw()) }
2029+
}
2030+
}
2031+
20162032
#[cfg_attr(docsrs, doc(cfg(unix)))]
20172033
impl IntoRawFd for crate::Socket {
20182034
fn into_raw_fd(self) -> c_int {
20192035
self.into_raw()
20202036
}
20212037
}
20222038

2039+
#[cfg_attr(docsrs, doc(cfg(unix)))]
2040+
impl From<OwnedFd> for crate::Socket {
2041+
fn from(fd: OwnedFd) -> crate::Socket {
2042+
// SAFETY: `OwnedFd` ensures the fd is valid.
2043+
unsafe { crate::Socket::from_raw_fd(fd.into_raw_fd()) }
2044+
}
2045+
}
2046+
20232047
#[cfg_attr(docsrs, doc(cfg(unix)))]
20242048
impl FromRawFd for crate::Socket {
20252049
unsafe fn from_raw_fd(fd: c_int) -> crate::Socket {

src/sys/windows.rs

+30-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ use std::io::{self, IoSlice};
1111
use std::marker::PhantomData;
1212
use std::mem::{self, size_of, MaybeUninit};
1313
use std::net::{self, Ipv4Addr, Ipv6Addr, Shutdown};
14-
use std::os::windows::io::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket};
14+
use std::os::windows::io::{
15+
AsRawSocket, AsSocket, BorrowedSocket, FromRawSocket, IntoRawSocket, OwnedSocket, RawSocket,
16+
};
1517
use std::sync::Once;
1618
use std::time::{Duration, Instant};
1719
use std::{process, ptr, slice};
@@ -800,18 +802,45 @@ impl crate::Socket {
800802
}
801803
}
802804

805+
#[cfg_attr(docsrs, doc(cfg(windows)))]
806+
impl AsSocket for crate::Socket {
807+
fn as_socket(&self) -> BorrowedSocket<'_> {
808+
// SAFETY: lifetime is bound by self.
809+
unsafe { BorrowedSocket::borrow_raw(self.as_raw() as RawSocket) }
810+
}
811+
}
812+
813+
#[cfg_attr(docsrs, doc(cfg(windows)))]
803814
impl AsRawSocket for crate::Socket {
804815
fn as_raw_socket(&self) -> RawSocket {
805816
self.as_raw() as RawSocket
806817
}
807818
}
808819

820+
#[cfg_attr(docsrs, doc(cfg(windows)))]
821+
impl From<crate::Socket> for OwnedSocket {
822+
fn from(sock: crate::Socket) -> OwnedSocket {
823+
// SAFETY: sock.into_raw() always returns a valid fd.
824+
unsafe { OwnedSocket::from_raw_socket(sock.into_raw() as RawSocket) }
825+
}
826+
}
827+
828+
#[cfg_attr(docsrs, doc(cfg(windows)))]
809829
impl IntoRawSocket for crate::Socket {
810830
fn into_raw_socket(self) -> RawSocket {
811831
self.into_raw() as RawSocket
812832
}
813833
}
814834

835+
#[cfg_attr(docsrs, doc(cfg(windows)))]
836+
impl From<OwnedSocket> for crate::Socket {
837+
fn from(fd: OwnedSocket) -> crate::Socket {
838+
// SAFETY: `OwnedFd` ensures the fd is valid.
839+
unsafe { crate::Socket::from_raw_socket(fd.into_raw_socket()) }
840+
}
841+
}
842+
843+
#[cfg_attr(docsrs, doc(cfg(windows)))]
815844
impl FromRawSocket for crate::Socket {
816845
unsafe fn from_raw_socket(socket: RawSocket) -> crate::Socket {
817846
crate::Socket::from_raw(socket as Socket)

0 commit comments

Comments
 (0)