@@ -891,53 +891,8 @@ mod _socket {
891
891
use std:: os:: unix:: ffi:: OsStrExt ;
892
892
let buf = crate :: vm:: function:: ArgStrOrBytesLike :: try_from_object ( vm, addr) ?;
893
893
let path = & * buf. borrow_bytes ( ) ;
894
- if cfg ! ( any( target_os = "linux" , target_os = "android" ) )
895
- && path. first ( ) == Some ( & 0 )
896
- {
897
- use libc:: { sa_family_t, socklen_t} ;
898
- use { socket2:: SockAddr , std:: ptr} ;
899
- unsafe {
900
- // based on SockAddr::unix
901
- // TODO: upstream or fix socklen check for SockAddr::unix()?
902
- SockAddr :: init ( |storage, len| {
903
- // Safety: `SockAddr::init` zeros the address, which is a valid
904
- // representation.
905
- let storage: & mut libc:: sockaddr_un = & mut * storage. cast ( ) ;
906
- let len: & mut socklen_t = & mut * len;
907
-
908
- let bytes = path;
909
- if bytes. len ( ) > storage. sun_path . len ( ) {
910
- return Err ( io:: Error :: new (
911
- io:: ErrorKind :: InvalidInput ,
912
- "path must be shorter than SUN_LEN" ,
913
- ) ) ;
914
- }
915
-
916
- storage. sun_family = libc:: AF_UNIX as sa_family_t ;
917
- // Safety: `bytes` and `addr.sun_path` are not overlapping and
918
- // both point to valid memory.
919
- // `SockAddr::init` zeroes the memory, so the path is already
920
- // null terminated.
921
- ptr:: copy_nonoverlapping (
922
- bytes. as_ptr ( ) ,
923
- storage. sun_path . as_mut_ptr ( ) as * mut u8 ,
924
- bytes. len ( ) ,
925
- ) ;
926
-
927
- let base = storage as * const _ as usize ;
928
- let path = & storage. sun_path as * const _ as usize ;
929
- let sun_path_offset = path - base;
930
- let length = sun_path_offset + bytes. len ( ) ;
931
- * len = length as socklen_t ;
932
-
933
- Ok ( ( ) )
934
- } )
935
- }
936
- . map ( |( _, addr) | addr)
937
- } else {
938
- socket2:: SockAddr :: unix ( ffi:: OsStr :: from_bytes ( path) )
939
- }
940
- . map_err ( |_| vm. new_os_error ( "AF_UNIX path too long" . to_owned ( ) ) . into ( ) )
894
+ socket2:: SockAddr :: unix ( ffi:: OsStr :: from_bytes ( path) )
895
+ . map_err ( |_| vm. new_os_error ( "AF_UNIX path too long" . to_owned ( ) ) . into ( ) )
941
896
}
942
897
c:: AF_INET => {
943
898
let tuple: PyTupleRef = addr. downcast ( ) . map_err ( |obj| {
@@ -1087,20 +1042,7 @@ mod _socket {
1087
1042
_ => { }
1088
1043
}
1089
1044
if socket_kind == -1 {
1090
- // TODO: when socket2 cuts a new release, type will be available on all os
1091
- // socket_kind = sock.r#type().map_err(|e| e.into_pyexception(vm))?.into();
1092
- let res = unsafe {
1093
- c:: getsockopt (
1094
- sock_fileno ( & sock) as _ ,
1095
- c:: SOL_SOCKET ,
1096
- c:: SO_TYPE ,
1097
- & mut socket_kind as * mut libc:: c_int as * mut _ ,
1098
- & mut ( std:: mem:: size_of :: < i32 > ( ) as _ ) ,
1099
- )
1100
- } ;
1101
- if res < 0 {
1102
- return Err ( crate :: common:: os:: errno ( ) . into ( ) ) ;
1103
- }
1045
+ socket_kind = sock. r#type ( ) . map_err ( |e| e. into_pyexception ( vm) ) ?. into ( ) ;
1104
1046
}
1105
1047
cfg_if:: cfg_if! {
1106
1048
if #[ cfg( any(
@@ -1601,30 +1543,23 @@ mod _socket {
1601
1543
if let Some ( addr) = addr. as_socket ( ) {
1602
1544
return get_ip_addr_tuple ( & addr, vm) ;
1603
1545
}
1604
- match addr. family ( ) as i32 {
1605
- #[ cfg( unix) ]
1606
- libc:: AF_UNIX => {
1607
- let addr_len = addr. len ( ) as usize ;
1608
- let unix_addr = unsafe { & * ( addr. as_ptr ( ) as * const libc:: sockaddr_un ) } ;
1609
- let path_u8 = unsafe { & * ( & unix_addr. sun_path [ ..] as * const [ _ ] as * const [ u8 ] ) } ;
1610
- let sun_path_offset =
1611
- & unix_addr. sun_path as * const _ as usize - unix_addr as * const _ as usize ;
1612
- if cfg ! ( any( target_os = "linux" , target_os = "android" ) )
1613
- && addr_len > sun_path_offset
1614
- && unix_addr. sun_path [ 0 ] == 0
1615
- {
1616
- let abstractaddrlen = addr_len - sun_path_offset;
1617
- let abstractpath = & path_u8[ ..abstractaddrlen] ;
1618
- vm. ctx . new_bytes ( abstractpath. to_vec ( ) ) . into ( )
1619
- } else {
1620
- let len = memchr:: memchr ( b'\0' , path_u8) . unwrap_or ( path_u8. len ( ) ) ;
1621
- let path = & path_u8[ ..len] ;
1622
- vm. ctx . new_str ( String :: from_utf8_lossy ( path) ) . into ( )
1623
- }
1546
+ #[ cfg( unix) ]
1547
+ use nix:: sys:: socket:: { SockaddrLike , UnixAddr } ;
1548
+ #[ cfg( unix) ]
1549
+ if let Some ( unix_addr) = unsafe { UnixAddr :: from_raw ( addr. as_ptr ( ) , Some ( addr. len ( ) ) ) } {
1550
+ use std:: os:: unix:: ffi:: OsStrExt ;
1551
+ #[ cfg( any( target_os = "android" , target_os = "linux" ) ) ]
1552
+ if let Some ( abstractpath) = unix_addr. as_abstract ( ) {
1553
+ return vm. ctx . new_bytes ( [ b"\0 " , abstractpath] . concat ( ) ) . into ( ) ;
1624
1554
}
1625
- // TODO: support more address families
1626
- _ => ( String :: new ( ) , 0 ) . to_pyobject ( vm) ,
1555
+ // necessary on macos
1556
+ let path = ffi:: OsStr :: as_bytes ( unix_addr. path ( ) . unwrap_or ( "" . as_ref ( ) ) . as_ref ( ) ) ;
1557
+ let nul_pos = memchr:: memchr ( b'\0' , path) . unwrap_or ( path. len ( ) ) ;
1558
+ let path = ffi:: OsStr :: from_bytes ( & path[ ..nul_pos] ) ;
1559
+ return vm. ctx . new_str ( path. to_string_lossy ( ) ) . into ( ) ;
1627
1560
}
1561
+ // TODO: support more address families
1562
+ ( String :: new ( ) , 0 ) . to_pyobject ( vm)
1628
1563
}
1629
1564
1630
1565
#[ pyfunction]
@@ -1764,25 +1699,19 @@ mod _socket {
1764
1699
let fd = sock_fileno ( sock) ;
1765
1700
#[ cfg( unix) ]
1766
1701
{
1767
- let mut pollfd = libc:: pollfd {
1768
- fd,
1769
- events : match kind {
1770
- SelectKind :: Read => libc:: POLLIN ,
1771
- SelectKind :: Write => libc:: POLLOUT ,
1772
- SelectKind :: Connect => libc:: POLLOUT | libc:: POLLERR ,
1773
- } ,
1774
- revents : 0 ,
1702
+ use nix:: poll:: * ;
1703
+ let events = match kind {
1704
+ SelectKind :: Read => PollFlags :: POLLIN ,
1705
+ SelectKind :: Write => PollFlags :: POLLOUT ,
1706
+ SelectKind :: Connect => PollFlags :: POLLOUT | PollFlags :: POLLERR ,
1775
1707
} ;
1708
+ let mut pollfd = [ PollFd :: new ( fd, events) ] ;
1776
1709
let timeout = match interval {
1777
1710
Some ( d) => d. as_millis ( ) as _ ,
1778
1711
None => -1 ,
1779
1712
} ;
1780
- let ret = unsafe { libc:: poll ( & mut pollfd, 1 , timeout) } ;
1781
- if ret < 0 {
1782
- Err ( io:: Error :: last_os_error ( ) )
1783
- } else {
1784
- Ok ( ret == 0 )
1785
- }
1713
+ let ret = poll ( & mut pollfd, timeout) ?;
1714
+ Ok ( ret == 0 )
1786
1715
}
1787
1716
#[ cfg( windows) ]
1788
1717
{
0 commit comments