11// Take a look at the license at the top of the repository in the LICENSE file.
22
33#[ cfg( unix) ]
4- use std:: os:: unix:: io:: { AsRawFd , FromRawFd , IntoRawFd , RawFd } ;
4+ use std:: os:: unix:: io:: { AsFd , AsRawFd , BorrowedFd , FromRawFd , IntoRawFd , OwnedFd , RawFd } ;
55#[ cfg( windows) ]
66use std:: os:: windows:: io:: { AsRawSocket , FromRawSocket , IntoRawSocket , RawSocket } ;
77#[ cfg( feature = "v2_60" ) ]
@@ -18,15 +18,18 @@ use crate::{ffi, Cancellable, Socket, SocketAddress, SocketControlMessage};
1818impl Socket {
1919 #[ cfg( unix) ]
2020 #[ cfg_attr( docsrs, doc( cfg( unix) ) ) ]
21- #[ allow ( clippy :: missing_safety_doc ) ]
22- pub unsafe fn from_fd ( fd : impl IntoRawFd ) -> Result < Socket , glib:: Error > {
21+ #[ doc ( alias = "g_socket_new_from_fd" ) ]
22+ pub fn from_fd ( fd : OwnedFd ) -> Result < Socket , glib:: Error > {
2323 let fd = fd. into_raw_fd ( ) ;
2424 let mut error = ptr:: null_mut ( ) ;
25- let ret = ffi:: g_socket_new_from_fd ( fd, & mut error) ;
26- if error. is_null ( ) {
27- Ok ( from_glib_full ( ret) )
28- } else {
29- Err ( from_glib_full ( error) )
25+ unsafe {
26+ let ret = ffi:: g_socket_new_from_fd ( fd, & mut error) ;
27+ if error. is_null ( ) {
28+ Ok ( from_glib_full ( ret) )
29+ } else {
30+ libc:: close ( fd) ;
31+ Err ( from_glib_full ( error) )
32+ }
3033 }
3134 }
3235 #[ cfg( windows) ]
@@ -52,6 +55,17 @@ impl AsRawFd for Socket {
5255 }
5356}
5457
58+ #[ cfg( unix) ]
59+ #[ cfg_attr( docsrs, doc( cfg( unix) ) ) ]
60+ impl AsFd for Socket {
61+ fn as_fd ( & self ) -> BorrowedFd < ' _ > {
62+ unsafe {
63+ let raw_fd = self . as_raw_fd ( ) ;
64+ BorrowedFd :: borrow_raw ( raw_fd)
65+ }
66+ }
67+ }
68+
5569#[ cfg( windows) ]
5670#[ cfg_attr( docsrs, doc( cfg( windows) ) ) ]
5771impl AsRawSocket for Socket {
@@ -801,7 +815,10 @@ mod tests {
801815 #[ test]
802816 #[ cfg( unix) ]
803817 fn socket_messages ( ) {
804- use std:: { io, os:: unix:: io:: AsRawFd } ;
818+ use std:: {
819+ io,
820+ os:: unix:: io:: { AsRawFd , FromRawFd , OwnedFd } ,
821+ } ;
805822
806823 use super :: Socket ;
807824 use crate :: { prelude:: * , Cancellable , UnixFDMessage } ;
@@ -813,8 +830,8 @@ mod tests {
813830 panic ! ( "{}" , io:: Error :: last_os_error( ) ) ;
814831 }
815832 (
816- Socket :: from_fd ( fds[ 0 ] ) . unwrap ( ) ,
817- Socket :: from_fd ( fds[ 1 ] ) . unwrap ( ) ,
833+ Socket :: from_fd ( OwnedFd :: from_raw_fd ( fds[ 0 ] ) ) . unwrap ( ) ,
834+ Socket :: from_fd ( OwnedFd :: from_raw_fd ( fds[ 1 ] ) ) . unwrap ( ) ,
818835 )
819836 } ;
820837
0 commit comments