@@ -1038,7 +1038,7 @@ use std::net::SocketAddr;
10381038use std:: sync:: Mutex ;
10391039
10401040enum HostSocket {
1041- Socket ( Socket ) ,
1041+ Socket ( Socket , i32 ) ,
10421042}
10431043
10441044struct SocketTable {
@@ -1069,7 +1069,13 @@ impl SocketTable {
10691069
10701070 fn get_socket ( & self , fd : u32 ) -> Result < & Socket > {
10711071 match self . get ( fd) ? {
1072- HostSocket :: Socket ( s) => Ok ( s) ,
1072+ HostSocket :: Socket ( s, _) => Ok ( s) ,
1073+ }
1074+ }
1075+
1076+ fn get_sock_type ( & self , fd : u32 ) -> Result < i32 > {
1077+ match self . get ( fd) ? {
1078+ HostSocket :: Socket ( _, t) => Ok ( * t) ,
10731079 }
10741080 }
10751081
@@ -1136,7 +1142,7 @@ fn register_net_tools(
11361142 Some ( Protocol :: from ( protocol) )
11371143 } ;
11381144 let sock = Socket :: new ( domain, stype, proto) ?;
1139- let fd = t. lock ( ) . unwrap ( ) . insert ( HostSocket :: Socket ( sock) ) ;
1145+ let fd = t. lock ( ) . unwrap ( ) . insert ( HostSocket :: Socket ( sock, sock_type ) ) ;
11401146 Ok ( json ! ( { "fd" : fd } ) )
11411147 } ) ;
11421148
@@ -1186,13 +1192,15 @@ fn register_net_tools(
11861192 let t = table. clone ( ) ;
11871193 tools. register ( "net_accept" , move |args| {
11881194 let fd = args[ "fd" ] . as_u64 ( ) . ok_or_else ( || anyhow ! ( "missing 'fd'" ) ) ? as u32 ;
1189- let ( new_sock, peer) = {
1195+ let ( new_sock, peer, parent_type ) = {
11901196 let tbl = t. lock ( ) . unwrap ( ) ;
11911197 let sock = tbl. get_socket ( fd) ?;
1192- sock. accept ( ) ?
1198+ let ( s, p) = sock. accept ( ) ?;
1199+ let st = tbl. get_sock_type ( fd) ?;
1200+ ( s, p, st)
11931201 } ;
11941202 let peer_addr: Option < SocketAddr > = peer. as_socket ( ) ;
1195- let new_fd = t. lock ( ) . unwrap ( ) . insert ( HostSocket :: Socket ( new_sock) ) ;
1203+ let new_fd = t. lock ( ) . unwrap ( ) . insert ( HostSocket :: Socket ( new_sock, parent_type ) ) ;
11961204 let mut resp = json ! ( { "fd" : new_fd } ) ;
11971205 if let Some ( pa) = peer_addr {
11981206 resp[ "addr" ] = json ! ( pa. ip( ) . to_string( ) ) ;
@@ -1336,8 +1344,8 @@ fn register_net_tools(
13361344 let tbl = t. lock ( ) . unwrap ( ) ;
13371345 let sock = tbl. get_socket ( fd) ?;
13381346 let val: i32 = if level == 1 && optname == 3 {
1339- // SOL_SOCKET + SO_TYPE — all our sockets are SOCK_STREAM
1340- 1
1347+ // SOL_SOCKET + SO_TYPE — return the actual socket type
1348+ tbl . get_sock_type ( fd ) ?
13411349 } else if level == 1 && optname == 2 {
13421350 sock. reuse_address ( ) ? as i32
13431351 } else if level == 6 && optname == 1 {
0 commit comments