Skip to content

Commit e0f8ff5

Browse files
committed
Remove sys::Socket type
1 parent 7bed206 commit e0f8ff5

File tree

2 files changed

+122
-210
lines changed

2 files changed

+122
-210
lines changed

src/sys/unix.rs

Lines changed: 91 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream};
2020
#[cfg(feature = "all")]
2121
use std::path::Path;
2222
use std::time::Duration;
23-
use std::{fmt, io, ptr};
23+
use std::{io, ptr};
2424

2525
#[cfg(not(target_vendor = "apple"))]
2626
use libc::ssize_t;
@@ -652,6 +652,95 @@ fn into_secs(duration: Duration) -> c_int {
652652
min(duration.as_secs(), c_int::max_value() as u64) as c_int
653653
}
654654

655+
/// Add `flag` to the current set flags of `F_GETFD`.
656+
fn fcntl_add(fd: SysSocket, get_cmd: c_int, set_cmd: c_int, flag: c_int) -> io::Result<()> {
657+
let previous = syscall!(fcntl(fd, get_cmd))?;
658+
let new = previous | flag;
659+
if new != previous {
660+
syscall!(fcntl(fd, set_cmd, new)).map(|_| ())
661+
} else {
662+
// Flag was already set.
663+
Ok(())
664+
}
665+
}
666+
667+
/// Remove `flag` to the current set flags of `F_GETFD`.
668+
fn fcntl_remove(fd: SysSocket, get_cmd: c_int, set_cmd: c_int, flag: c_int) -> io::Result<()> {
669+
let previous = syscall!(fcntl(fd, get_cmd))?;
670+
let new = previous & !flag;
671+
if new != previous {
672+
syscall!(fcntl(fd, set_cmd, new)).map(|_| ())
673+
} else {
674+
// Flag was already set.
675+
Ok(())
676+
}
677+
}
678+
679+
/// Caller must ensure `T` is the correct type for `opt` and `val`.
680+
pub(crate) unsafe fn getsockopt<T>(fd: SysSocket, opt: c_int, val: c_int) -> io::Result<T> {
681+
let mut payload: MaybeUninit<T> = MaybeUninit::uninit();
682+
let mut len = size_of::<T>() as libc::socklen_t;
683+
syscall!(getsockopt(
684+
fd,
685+
opt,
686+
val,
687+
payload.as_mut_ptr().cast(),
688+
&mut len,
689+
))
690+
.map(|_| {
691+
debug_assert_eq!(len as usize, size_of::<T>());
692+
// Safety: `getsockopt` initialised `payload` for us.
693+
payload.assume_init()
694+
})
695+
}
696+
697+
/// Caller must ensure `T` is the correct type for `opt` and `val`.
698+
pub(crate) unsafe fn setsockopt<T>(
699+
fd: SysSocket,
700+
opt: c_int,
701+
val: c_int,
702+
payload: T,
703+
) -> io::Result<()> {
704+
let payload = &payload as *const T as *const c_void;
705+
syscall!(setsockopt(
706+
fd,
707+
opt,
708+
val,
709+
payload,
710+
mem::size_of::<T>() as libc::socklen_t,
711+
))
712+
.map(|_| ())
713+
}
714+
715+
pub(crate) fn close(fd: SysSocket) {
716+
unsafe {
717+
let _ = libc::close(fd);
718+
}
719+
}
720+
721+
pub(crate) fn to_in_addr(addr: &Ipv4Addr) -> in_addr {
722+
// `s_addr` is stored as BE on all machines, and the array is in BE order.
723+
// So the native endian conversion method is used so that it's never
724+
// swapped.
725+
in_addr {
726+
s_addr: u32::from_ne_bytes(addr.octets()),
727+
}
728+
}
729+
730+
pub(crate) fn from_in_addr(in_addr: in_addr) -> Ipv4Addr {
731+
Ipv4Addr::from(in_addr.s_addr.to_ne_bytes())
732+
}
733+
734+
pub(crate) fn to_in6_addr(addr: &Ipv6Addr) -> libc::in6_addr {
735+
let mut ret: libc::in6_addr = unsafe { mem::zeroed() };
736+
ret.s6_addr = addr.octets();
737+
return ret;
738+
}
739+
740+
pub(crate) fn from_in6_addr(in6_addr: in6_addr) -> Ipv6Addr {
741+
Ipv6Addr::from(in6_addr.s6_addr)
742+
}
743+
655744
/// Unix only API.
656745
impl crate::Socket {
657746
/// Accept a new incoming connection from this listener.
@@ -869,124 +958,6 @@ impl crate::Socket {
869958
}
870959
}
871960

872-
/// Add `flag` to the current set flags of `F_GETFD`.
873-
fn fcntl_add(fd: SysSocket, get_cmd: c_int, set_cmd: c_int, flag: c_int) -> io::Result<()> {
874-
let previous = syscall!(fcntl(fd, get_cmd))?;
875-
let new = previous | flag;
876-
if new != previous {
877-
syscall!(fcntl(fd, set_cmd, new)).map(|_| ())
878-
} else {
879-
// Flag was already set.
880-
Ok(())
881-
}
882-
}
883-
884-
/// Remove `flag` to the current set flags of `F_GETFD`.
885-
fn fcntl_remove(fd: SysSocket, get_cmd: c_int, set_cmd: c_int, flag: c_int) -> io::Result<()> {
886-
let previous = syscall!(fcntl(fd, get_cmd))?;
887-
let new = previous & !flag;
888-
if new != previous {
889-
syscall!(fcntl(fd, set_cmd, new)).map(|_| ())
890-
} else {
891-
// Flag was already set.
892-
Ok(())
893-
}
894-
}
895-
896-
/// Caller must ensure `T` is the correct type for `opt` and `val`.
897-
pub(crate) unsafe fn getsockopt<T>(fd: SysSocket, opt: c_int, val: c_int) -> io::Result<T> {
898-
let mut payload: MaybeUninit<T> = MaybeUninit::uninit();
899-
let mut len = size_of::<T>() as libc::socklen_t;
900-
syscall!(getsockopt(
901-
fd,
902-
opt,
903-
val,
904-
payload.as_mut_ptr().cast(),
905-
&mut len,
906-
))
907-
.map(|_| {
908-
debug_assert_eq!(len as usize, size_of::<T>());
909-
// Safety: `getsockopt` initialised `payload` for us.
910-
payload.assume_init()
911-
})
912-
}
913-
914-
/// Caller must ensure `T` is the correct type for `opt` and `val`.
915-
pub(crate) unsafe fn setsockopt<T>(
916-
fd: SysSocket,
917-
opt: c_int,
918-
val: c_int,
919-
payload: T,
920-
) -> io::Result<()> {
921-
let payload = &payload as *const T as *const c_void;
922-
syscall!(setsockopt(
923-
fd,
924-
opt,
925-
val,
926-
payload,
927-
mem::size_of::<T>() as libc::socklen_t,
928-
))
929-
.map(|_| ())
930-
}
931-
932-
pub(crate) fn to_in_addr(addr: &Ipv4Addr) -> in_addr {
933-
// `s_addr` is stored as BE on all machines, and the array is in BE order.
934-
// So the native endian conversion method is used so that it's never
935-
// swapped.
936-
in_addr {
937-
s_addr: u32::from_ne_bytes(addr.octets()),
938-
}
939-
}
940-
941-
pub(crate) fn from_in_addr(in_addr: in_addr) -> Ipv4Addr {
942-
Ipv4Addr::from(in_addr.s_addr.to_ne_bytes())
943-
}
944-
945-
#[repr(transparent)] // Required during rewriting.
946-
pub struct Socket {
947-
fd: SysSocket,
948-
}
949-
950-
impl Socket {
951-
pub fn inner(self) -> SysSocket {
952-
self.fd
953-
}
954-
}
955-
956-
impl fmt::Debug for Socket {
957-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
958-
let mut f = f.debug_struct("Socket");
959-
f.field("fd", &self.fd);
960-
if let Ok(addr) = getsockname(self.fd) {
961-
f.field("local_addr", &addr);
962-
}
963-
if let Ok(addr) = getpeername(self.fd) {
964-
f.field("peer_addr", &addr);
965-
}
966-
f.finish()
967-
}
968-
}
969-
970-
impl AsRawFd for Socket {
971-
fn as_raw_fd(&self) -> c_int {
972-
self.fd
973-
}
974-
}
975-
976-
impl IntoRawFd for Socket {
977-
fn into_raw_fd(self) -> c_int {
978-
let fd = self.fd;
979-
mem::forget(self);
980-
return fd;
981-
}
982-
}
983-
984-
impl FromRawFd for Socket {
985-
unsafe fn from_raw_fd(fd: c_int) -> Socket {
986-
Socket { fd: fd }
987-
}
988-
}
989-
990961
impl AsRawFd for crate::Socket {
991962
fn as_raw_fd(&self) -> c_int {
992963
self.inner
@@ -1003,9 +974,7 @@ impl IntoRawFd for crate::Socket {
1003974

1004975
impl FromRawFd for crate::Socket {
1005976
unsafe fn from_raw_fd(fd: c_int) -> crate::Socket {
1006-
crate::Socket {
1007-
inner: Socket::from_raw_fd(fd).inner(),
1008-
}
977+
crate::Socket { inner: fd }
1009978
}
1010979
}
1011980

@@ -1057,22 +1026,6 @@ impl From<UnixDatagram> for crate::Socket {
10571026
}
10581027
}
10591028

1060-
pub(crate) fn close(fd: SysSocket) {
1061-
unsafe {
1062-
let _ = libc::close(fd);
1063-
}
1064-
}
1065-
1066-
pub(crate) fn to_in6_addr(addr: &Ipv6Addr) -> libc::in6_addr {
1067-
let mut ret: libc::in6_addr = unsafe { mem::zeroed() };
1068-
ret.s6_addr = addr.octets();
1069-
return ret;
1070-
}
1071-
1072-
pub(crate) fn from_in6_addr(in6_addr: in6_addr) -> Ipv6Addr {
1073-
Ipv6Addr::from(in6_addr.s6_addr)
1074-
}
1075-
10761029
#[test]
10771030
fn test_ip() {
10781031
let ip = Ipv4Addr::new(127, 0, 0, 1);

src/sys/windows.rs

Lines changed: 31 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ use std::io::{self, IoSlice, IoSliceMut};
1111
use std::mem::{self, size_of, MaybeUninit};
1212
use std::net::{self, Ipv4Addr, Ipv6Addr, Shutdown};
1313
use std::os::windows::prelude::*;
14+
use std::ptr;
1415
use std::sync::Once;
1516
use std::time::Duration;
16-
use std::{fmt, ptr};
1717

1818
use winapi::ctypes::c_long;
1919
use winapi::shared::in6addr::*;
@@ -611,6 +611,36 @@ fn ioctlsocket(socket: SysSocket, cmd: c_long, payload: &mut u_long) -> io::Resu
611611
.map(|_| ())
612612
}
613613

614+
pub(crate) fn close(socket: SysSocket) {
615+
unsafe {
616+
let _ = sock::closesocket(socket);
617+
}
618+
}
619+
620+
pub(crate) fn to_in_addr(addr: &Ipv4Addr) -> IN_ADDR {
621+
let mut s_un: in_addr_S_un = unsafe { mem::zeroed() };
622+
// `S_un` is stored as BE on all machines, and the array is in BE order. So
623+
// the native endian conversion method is used so that it's never swapped.
624+
unsafe { *(s_un.S_addr_mut()) = u32::from_ne_bytes(addr.octets()) };
625+
IN_ADDR { S_un: s_un }
626+
}
627+
628+
pub(crate) fn from_in_addr(in_addr: IN_ADDR) -> Ipv4Addr {
629+
Ipv4Addr::from(unsafe { *in_addr.S_un.S_addr() }.to_ne_bytes())
630+
}
631+
632+
pub(crate) fn to_in6_addr(addr: &Ipv6Addr) -> in6_addr {
633+
let mut ret_addr: in6_addr_u = unsafe { mem::zeroed() };
634+
unsafe { *(ret_addr.Byte_mut()) = addr.octets() };
635+
let mut ret: in6_addr = unsafe { mem::zeroed() };
636+
ret.u = ret_addr;
637+
ret
638+
}
639+
640+
pub(crate) fn from_in6_addr(in6_addr: in6_addr) -> Ipv6Addr {
641+
Ipv6Addr::from(*unsafe { in6_addr.u.Byte() })
642+
}
643+
614644
/// Windows only API.
615645
impl crate::Socket {
616646
/// Sets `HANDLE_FLAG_INHERIT` using `SetHandleInformation`.
@@ -638,59 +668,6 @@ impl crate::Socket {
638668
}
639669
}
640670

641-
pub(crate) fn to_in_addr(addr: &Ipv4Addr) -> IN_ADDR {
642-
let mut s_un: in_addr_S_un = unsafe { mem::zeroed() };
643-
// `S_un` is stored as BE on all machines, and the array is in BE order. So
644-
// the native endian conversion method is used so that it's never swapped.
645-
unsafe { *(s_un.S_addr_mut()) = u32::from_ne_bytes(addr.octets()) };
646-
IN_ADDR { S_un: s_un }
647-
}
648-
649-
pub(crate) fn from_in_addr(in_addr: IN_ADDR) -> Ipv4Addr {
650-
Ipv4Addr::from(unsafe { *in_addr.S_un.S_addr() }.to_ne_bytes())
651-
}
652-
653-
#[repr(transparent)] // Required during rewriting.
654-
pub struct Socket {
655-
socket: SysSocket,
656-
}
657-
658-
impl fmt::Debug for Socket {
659-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
660-
let mut f = f.debug_struct("Socket");
661-
f.field("socket", &self.socket);
662-
if let Ok(addr) = getsockname(self.socket) {
663-
f.field("local_addr", &addr);
664-
}
665-
if let Ok(addr) = getpeername(self.socket) {
666-
f.field("peer_addr", &addr);
667-
}
668-
f.finish()
669-
}
670-
}
671-
672-
impl AsRawSocket for Socket {
673-
fn as_raw_socket(&self) -> RawSocket {
674-
self.socket as RawSocket
675-
}
676-
}
677-
678-
impl IntoRawSocket for Socket {
679-
fn into_raw_socket(self) -> RawSocket {
680-
let socket = self.socket;
681-
mem::forget(self);
682-
socket as RawSocket
683-
}
684-
}
685-
686-
impl FromRawSocket for Socket {
687-
unsafe fn from_raw_socket(socket: RawSocket) -> Socket {
688-
Socket {
689-
socket: socket as sock::SOCKET,
690-
}
691-
}
692-
}
693-
694671
impl AsRawSocket for crate::Socket {
695672
fn as_raw_socket(&self) -> RawSocket {
696673
self.inner as RawSocket
@@ -713,24 +690,6 @@ impl FromRawSocket for crate::Socket {
713690
}
714691
}
715692

716-
pub(crate) fn close(socket: SysSocket) {
717-
unsafe {
718-
let _ = sock::closesocket(socket);
719-
}
720-
}
721-
722-
pub(crate) fn to_in6_addr(addr: &Ipv6Addr) -> in6_addr {
723-
let mut ret_addr: in6_addr_u = unsafe { mem::zeroed() };
724-
unsafe { *(ret_addr.Byte_mut()) = addr.octets() };
725-
let mut ret: in6_addr = unsafe { mem::zeroed() };
726-
ret.u = ret_addr;
727-
ret
728-
}
729-
730-
pub(crate) fn from_in6_addr(in6_addr: in6_addr) -> Ipv6Addr {
731-
Ipv6Addr::from(*unsafe { in6_addr.u.Byte() })
732-
}
733-
734693
#[test]
735694
fn test_ipv4() {
736695
let ip = Ipv4Addr::new(127, 0, 0, 1);

0 commit comments

Comments
 (0)