@@ -87,6 +87,14 @@ pub(crate) fn register(
8787        drop_tcp_listener, 
8888        namespace_filter, 
8989    ) ?; 
90+     link_if_match ( 
91+         linker, 
92+         "lunatic::networking" , 
93+         "local_addr" , 
94+         FuncType :: new ( [ ValType :: I64 ,  ValType :: I32 ] ,  [ ValType :: I32 ] ) , 
95+         local_addr, 
96+         namespace_filter, 
97+     ) ?; 
9098    link_async3_if_match ( 
9199        linker, 
92100        "lunatic::networking" , 
@@ -417,7 +425,7 @@ fn tcp_bind(
417425//% Drops the TCP listener resource. 
418426//% 
419427//% Traps: 
420- //% * If the DNS iterator  ID doesn't exist. 
428+ //% * If the TCP listener  ID doesn't exist. 
421429fn  drop_tcp_listener ( mut  caller :  Caller < ProcessState > ,  tcp_listener_id :  u64 )  -> Result < ( ) ,  Trap >  { 
422430    caller
423431        . data_mut ( ) 
@@ -428,6 +436,53 @@ fn drop_tcp_listener(mut caller: Caller<ProcessState>, tcp_listener_id: u64) ->
428436    Ok ( ( ) ) 
429437} 
430438
439+ //% lunatic::networking::local_addr(tcp_listener_id: i64, id_u64_ptr: u32) -> i64 
440+ //% 
441+ //% Returns the local address that this listener is bound to as an DNS iterator with just one 
442+ //% element. 
443+ //% * 0 on success - The local address that this listener is bound to is returned as an DNS 
444+ //%                  iterator with just one element and written to **id_ptr**. 
445+ //% 
446+ //% * 1 on error   - The error ID is written to **id_u64_ptr** 
447+ //% 
448+ //% Traps: 
449+ //% * If the tcp listener ID doesn't exist. 
450+ //% * If **peer_socket_addr_id_ptr** is outside the memory. 
451+ fn  local_addr ( 
452+     mut  caller :  Caller < ProcessState > , 
453+     tcp_listener_id :  u64 , 
454+     id_u64_ptr :  u32 , 
455+ )  -> Result < u32 ,  Trap >  { 
456+     let  tcp_listener = caller
457+         . data ( ) 
458+         . resources 
459+         . tcp_listeners 
460+         . get ( tcp_listener_id) 
461+         . or_trap ( "lunatic::network::local_addr: listener ID doesn't exist" ) ?; 
462+     let  ( dns_iter_or_error_id,  result)  = match  tcp_listener. local_addr ( )  { 
463+         Ok ( socket_addr)  => { 
464+             let  dns_iter_id = caller
465+                 . data_mut ( ) 
466+                 . resources 
467+                 . dns_iterators 
468+                 . add ( DnsIterator :: new ( vec ! [ socket_addr] . into_iter ( ) ) ) ; 
469+             ( dns_iter_id,  0 ) 
470+         } 
471+         Err ( error)  => ( caller. data_mut ( ) . errors . add ( error. into ( ) ) ,  1 ) , 
472+     } ; 
473+ 
474+     let  memory = get_memory ( & mut  caller) ?; 
475+     memory
476+         . write ( 
477+             & mut  caller, 
478+             id_u64_ptr as  usize , 
479+             & dns_iter_or_error_id. to_le_bytes ( ) , 
480+         ) 
481+         . or_trap ( "lunatic::network::local_addr" ) ?; 
482+ 
483+     Ok ( result) 
484+ } 
485+ 
431486//% lunatic::networking::tcp_accept( 
432487//%     listener_id: u64, 
433488//%     id_u64_ptr: u32, 
@@ -447,7 +502,7 @@ fn drop_tcp_listener(mut caller: Caller<ProcessState>, tcp_listener_id: u64) ->
447502fn  tcp_accept ( 
448503    mut  caller :  Caller < ProcessState > , 
449504    listener_id :  u64 , 
450-     id_ptr :  u32 , 
505+     id_u64_ptr :  u32 , 
451506    socket_addr_id_ptr :  u32 , 
452507)  -> Box < dyn  Future < Output  = Result < u32 ,  Trap > >  + Send  + ' _ >  { 
453508    Box :: new ( async  move  { 
@@ -475,7 +530,7 @@ fn tcp_accept(
475530        memory
476531            . write ( 
477532                & mut  caller, 
478-                 id_ptr  as  usize , 
533+                 id_u64_ptr  as  usize , 
479534                & tcp_stream_or_error_id. to_le_bytes ( ) , 
480535            ) 
481536            . or_trap ( "lunatic::networking::tcp_accept" ) ?; 
0 commit comments