1
1
// Take a look at the license at the top of the repository in the LICENSE file.
2
2
3
3
#[ 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 } ;
5
5
#[ cfg( windows) ]
6
6
use std:: os:: windows:: io:: { AsRawSocket , FromRawSocket , IntoRawSocket , RawSocket } ;
7
7
#[ cfg( feature = "v2_60" ) ]
@@ -18,15 +18,18 @@ use crate::{ffi, Cancellable, Socket, SocketAddress, SocketControlMessage};
18
18
impl Socket {
19
19
#[ cfg( unix) ]
20
20
#[ 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 > {
23
23
let fd = fd. into_raw_fd ( ) ;
24
24
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
+ }
30
33
}
31
34
}
32
35
#[ cfg( windows) ]
@@ -52,6 +55,17 @@ impl AsRawFd for Socket {
52
55
}
53
56
}
54
57
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
+
55
69
#[ cfg( windows) ]
56
70
#[ cfg_attr( docsrs, doc( cfg( windows) ) ) ]
57
71
impl AsRawSocket for Socket {
@@ -801,7 +815,10 @@ mod tests {
801
815
#[ test]
802
816
#[ cfg( unix) ]
803
817
fn socket_messages ( ) {
804
- use std:: { io, os:: unix:: io:: AsRawFd } ;
818
+ use std:: {
819
+ io,
820
+ os:: unix:: io:: { AsRawFd , FromRawFd , OwnedFd } ,
821
+ } ;
805
822
806
823
use super :: Socket ;
807
824
use crate :: { prelude:: * , Cancellable , UnixFDMessage } ;
@@ -813,8 +830,8 @@ mod tests {
813
830
panic ! ( "{}" , io:: Error :: last_os_error( ) ) ;
814
831
}
815
832
(
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 ( ) ,
818
835
)
819
836
} ;
820
837
0 commit comments