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:: { AsRawFd , 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) ]
@@ -801,7 +804,10 @@ mod tests {
801
804
#[ test]
802
805
#[ cfg( unix) ]
803
806
fn socket_messages ( ) {
804
- use std:: { io, os:: unix:: io:: AsRawFd } ;
807
+ use std:: {
808
+ io,
809
+ os:: unix:: io:: { AsRawFd , FromRawFd , OwnedFd } ,
810
+ } ;
805
811
806
812
use super :: Socket ;
807
813
use crate :: { prelude:: * , Cancellable , UnixFDMessage } ;
@@ -813,8 +819,8 @@ mod tests {
813
819
panic ! ( "{}" , io:: Error :: last_os_error( ) ) ;
814
820
}
815
821
(
816
- Socket :: from_fd ( fds[ 0 ] ) . unwrap ( ) ,
817
- Socket :: from_fd ( fds[ 1 ] ) . unwrap ( ) ,
822
+ Socket :: from_fd ( OwnedFd :: from_raw_fd ( fds[ 0 ] ) ) . unwrap ( ) ,
823
+ Socket :: from_fd ( OwnedFd :: from_raw_fd ( fds[ 1 ] ) ) . unwrap ( ) ,
818
824
)
819
825
} ;
820
826
0 commit comments