3
3
#[ cfg( unix) ]
4
4
use std:: os:: unix:: io:: { AsFd , AsRawFd , BorrowedFd , FromRawFd , IntoRawFd , OwnedFd , RawFd } ;
5
5
#[ cfg( windows) ]
6
- use std:: os:: windows:: io:: { AsRawSocket , FromRawSocket , IntoRawSocket , RawSocket } ;
6
+ use std:: os:: windows:: io:: {
7
+ AsRawSocket , AsSocket , BorrowedSocket , FromRawSocket , IntoRawSocket , OwnedSocket , RawSocket ,
8
+ } ;
7
9
#[ cfg( feature = "v2_60" ) ]
8
10
use std:: time:: Duration ;
9
11
use std:: { cell:: RefCell , marker:: PhantomData , mem:: transmute, pin:: Pin , ptr} ;
@@ -27,22 +29,24 @@ impl Socket {
27
29
if error. is_null ( ) {
28
30
Ok ( from_glib_full ( ret) )
29
31
} else {
30
- libc :: close ( fd) ;
32
+ let _ = OwnedFd :: from_raw_fd ( fd) ;
31
33
Err ( from_glib_full ( error) )
32
34
}
33
35
}
34
36
}
35
37
#[ cfg( windows) ]
36
38
#[ cfg_attr( docsrs, doc( cfg( windows) ) ) ]
37
- #[ allow( clippy:: missing_safety_doc) ]
38
- pub unsafe fn from_socket ( socket : impl IntoRawSocket ) -> Result < Socket , glib:: Error > {
39
+ pub fn from_socket ( socket : OwnedSocket ) -> Result < Socket , glib:: Error > {
39
40
let socket = socket. into_raw_socket ( ) ;
40
41
let mut error = ptr:: null_mut ( ) ;
41
- let ret = ffi:: g_socket_new_from_fd ( socket as i32 , & mut error) ;
42
- if error. is_null ( ) {
43
- Ok ( from_glib_full ( ret) )
44
- } else {
45
- Err ( from_glib_full ( error) )
42
+ unsafe {
43
+ let ret = ffi:: g_socket_new_from_fd ( socket as i32 , & mut error) ;
44
+ if error. is_null ( ) {
45
+ Ok ( from_glib_full ( ret) )
46
+ } else {
47
+ let _ = OwnedSocket :: from_raw_socket ( socket) ;
48
+ Err ( from_glib_full ( error) )
49
+ }
46
50
}
47
51
}
48
52
}
@@ -74,6 +78,17 @@ impl AsRawSocket for Socket {
74
78
}
75
79
}
76
80
81
+ #[ cfg( windows) ]
82
+ #[ cfg_attr( docsrs, doc( cfg( windows) ) ) ]
83
+ impl AsSocket for Socket {
84
+ fn as_socket ( & self ) -> BorrowedSocket < ' _ > {
85
+ unsafe {
86
+ let raw_socket = self . as_raw_socket ( ) ;
87
+ BorrowedSocket :: borrow_raw ( raw_socket)
88
+ }
89
+ }
90
+ }
91
+
77
92
#[ doc( alias = "GInputVector" ) ]
78
93
#[ repr( transparent) ]
79
94
#[ derive( Debug ) ]
@@ -646,18 +661,16 @@ pub trait SocketExtManual: IsA<Socket> + Sized {
646
661
#[ cfg_attr( docsrs, doc( cfg( unix) ) ) ]
647
662
#[ doc( alias = "get_fd" ) ]
648
663
#[ doc( alias = "g_socket_get_fd" ) ]
649
- fn fd < T : FromRawFd > ( & self ) -> T {
650
- unsafe { FromRawFd :: from_raw_fd ( ffi :: g_socket_get_fd ( self . as_ref ( ) . to_glib_none ( ) . 0 ) ) }
664
+ fn fd ( & self ) -> BorrowedFd < ' _ > {
665
+ self . as_ref ( ) . as_fd ( )
651
666
}
652
667
653
668
#[ cfg( windows) ]
654
669
#[ cfg_attr( docsrs, doc( cfg( windows) ) ) ]
655
670
#[ doc( alias = "get_socket" ) ]
656
671
#[ doc( alias = "g_socket_get_fd" ) ]
657
- fn socket < T : FromRawSocket > ( & self ) -> T {
658
- unsafe {
659
- FromRawSocket :: from_raw_socket ( ffi:: g_socket_get_fd ( self . as_ref ( ) . to_glib_none ( ) . 0 ) as _ )
660
- }
672
+ fn socket ( & self ) -> BorrowedSocket < ' _ > {
673
+ self . as_ref ( ) . as_socket ( )
661
674
}
662
675
663
676
#[ doc( alias = "g_socket_create_source" ) ]
0 commit comments