@@ -62,6 +62,13 @@ impl Connection {
62
62
_ => Err ( io:: Error :: new ( io:: ErrorKind :: Other , "oh no!" ) ) ,
63
63
}
64
64
}
65
+
66
+ fn local_addr ( & self ) -> io:: Result < SocketAddr > {
67
+ match self {
68
+ Connection :: TcpListener ( con) => con. local_addr ( ) ,
69
+ _ => Err ( io:: Error :: new ( io:: ErrorKind :: Other , "oh no!" ) ) ,
70
+ }
71
+ }
65
72
}
66
73
67
74
impl Read for Connection {
@@ -293,6 +300,33 @@ fn socket_close(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
293
300
}
294
301
}
295
302
303
+ fn socket_getsockname ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
304
+ arg_check ! ( vm, args, required = [ ( zelf, None ) ] ) ;
305
+ match zelf. payload {
306
+ PyObjectPayload :: Socket { ref socket } => {
307
+ let addr = match socket. borrow_mut ( ) . con {
308
+ Some ( ref mut v) => v. local_addr ( ) ,
309
+ None => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
310
+ } ;
311
+
312
+ match addr {
313
+ Ok ( addr) => {
314
+ let port = vm. ctx . new_int ( addr. port ( ) ) ;
315
+ let ip = vm. ctx . new_str ( addr. ip ( ) . to_string ( ) ) ;
316
+ let elements = RefCell :: new ( vec ! [ ip, port] ) ;
317
+
318
+ Ok ( PyObject :: new (
319
+ PyObjectPayload :: Sequence { elements } ,
320
+ vm. ctx . tuple_type ( ) ,
321
+ ) )
322
+ }
323
+ _ => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
324
+ }
325
+ }
326
+ _ => Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
327
+ }
328
+ }
329
+
296
330
pub fn mk_module ( ctx : & PyContext ) -> PyObjectRef {
297
331
let py_mod = ctx. new_module ( & "socket" . to_string ( ) , ctx. new_scope ( None ) ) ;
298
332
@@ -318,6 +352,7 @@ pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
318
352
ctx. set_attr ( & socket, "accept" , ctx. new_rustfunc ( socket_accept) ) ;
319
353
ctx. set_attr ( & socket, "listen" , ctx. new_rustfunc ( socket_listen) ) ;
320
354
ctx. set_attr ( & socket, "close" , ctx. new_rustfunc ( socket_close) ) ;
355
+ ctx. set_attr ( & socket, "getsockname" , ctx. new_rustfunc ( socket_getsockname) ) ;
321
356
socket
322
357
} ;
323
358
ctx. set_attr ( & py_mod, "socket" , socket. clone ( ) ) ;
0 commit comments