@@ -86,6 +86,33 @@ impl Connection {
86
86
_ => Err ( io:: Error :: new ( io:: ErrorKind :: Other , "oh no!" ) ) ,
87
87
}
88
88
}
89
+
90
+ #[ cfg( unix) ]
91
+ fn fileno ( & self ) -> i64 {
92
+ use std:: os:: unix:: io:: AsRawFd ;
93
+ let raw_fd = match self {
94
+ Connection :: TcpListener ( con) => con. as_raw_fd ( ) ,
95
+ Connection :: UdpSocket ( con) => con. as_raw_fd ( ) ,
96
+ Connection :: TcpStream ( con) => con. as_raw_fd ( ) ,
97
+ } ;
98
+ raw_fd as i64
99
+ }
100
+
101
+ #[ cfg( windows) ]
102
+ fn fileno ( & self ) -> i64 {
103
+ use std:: os:: windows:: io:: AsRawSocket ;
104
+ let raw_fd = match self {
105
+ Connection :: TcpListener ( con) => con. as_raw_socket ( ) ,
106
+ Connection :: UdpSocket ( con) => con. as_raw_socket ( ) ,
107
+ Connection :: TcpStream ( con) => con. as_raw_socket ( ) ,
108
+ } ;
109
+ raw_fd as i64
110
+ }
111
+
112
+ #[ cfg( all( not( unix) , not( windows) ) ) ]
113
+ fn fileno ( & self ) -> i64 {
114
+ unimplemented ! ( ) ;
115
+ }
89
116
}
90
117
91
118
impl Read for Connection {
@@ -387,6 +414,18 @@ fn socket_close(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
387
414
Ok ( vm. get_none ( ) )
388
415
}
389
416
417
+ fn socket_fileno ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
418
+ arg_check ! ( vm, args, required = [ ( zelf, None ) ] ) ;
419
+
420
+ let socket = get_socket ( zelf) ;
421
+
422
+ let fileno = match socket. con . borrow_mut ( ) . as_mut ( ) {
423
+ Some ( v) => v. fileno ( ) ,
424
+ None => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
425
+ } ;
426
+ Ok ( vm. ctx . new_int ( fileno) )
427
+ }
428
+
390
429
fn socket_getsockname ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
391
430
arg_check ! ( vm, args, required = [ ( zelf, None ) ] ) ;
392
431
let socket = get_socket ( zelf) ;
@@ -424,6 +463,7 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
424
463
"getsockname" => ctx. new_rustfunc( socket_getsockname) ,
425
464
"sendto" => ctx. new_rustfunc( socket_sendto) ,
426
465
"recvfrom" => ctx. new_rustfunc( socket_recvfrom) ,
466
+ "fileno" => ctx. new_rustfunc( socket_fileno) ,
427
467
} ) ;
428
468
429
469
py_module ! ( vm, "socket" , {
0 commit comments