@@ -273,28 +273,18 @@ os_socket_addr_resolve(const char *host, const char *service,
273273 return BHT_OK ;
274274}
275275
276- int
277- os_socket_addr_local ( bh_socket_t socket , uint8_t * buf , size_t buflen ,
278- uint16_t * port , uint8_t * is_ipv4 )
276+ static int
277+ os_socket_convert_sockaddr ( struct sockaddr * addr , uint8_t * buf , size_t buflen ,
278+ uint16_t * port , uint8_t * is_ipv4 )
279279{
280- struct sockaddr_storage addr_storage = { 0 };
281- socklen_t addr_len = sizeof (addr_storage );
282- int ret ;
283-
284280 assert (buf );
285281 assert (is_ipv4 );
286282 assert (port );
287283
288- ret = getsockname (socket , (struct sockaddr * )& addr_storage , & addr_len );
289-
290- if (ret != BHT_OK ) {
291- return BHT_ERROR ;
292- }
293-
294- switch (addr_storage .ss_family ) {
284+ switch (addr -> sa_family ) {
295285 case AF_INET :
296286 {
297- struct sockaddr_in * addr_in = (struct sockaddr_in * )& addr_storage ;
287+ struct sockaddr_in * addr_in = (struct sockaddr_in * )addr ;
298288
299289 assert (buflen >= sizeof (addr_in -> sin_addr ));
300290 * port = ntohs (addr_in -> sin_port );
@@ -304,7 +294,7 @@ os_socket_addr_local(bh_socket_t socket, uint8_t *buf, size_t buflen,
304294 }
305295 case AF_INET6 :
306296 {
307- struct sockaddr_in6 * addr_in = (struct sockaddr_in6 * )& addr_storage ;
297+ struct sockaddr_in6 * addr_in = (struct sockaddr_in6 * )addr ;
308298 assert (buflen >= sizeof (addr_in -> sin6_addr ));
309299 * port = ntohs (addr_in -> sin6_port );
310300
@@ -320,4 +310,40 @@ os_socket_addr_local(bh_socket_t socket, uint8_t *buf, size_t buflen,
320310 }
321311
322312 return BHT_OK ;
313+ }
314+
315+ int
316+ os_socket_addr_local (bh_socket_t socket , uint8_t * buf , size_t buflen ,
317+ uint16_t * port , uint8_t * is_ipv4 )
318+ {
319+ struct sockaddr_storage addr_storage = { 0 };
320+ socklen_t addr_len = sizeof (addr_storage );
321+ int ret ;
322+
323+ ret = getsockname (socket , (struct sockaddr * )& addr_storage , & addr_len );
324+
325+ if (ret != BHT_OK ) {
326+ return BHT_ERROR ;
327+ }
328+
329+ return os_socket_convert_sockaddr ((struct sockaddr * )& addr_storage , buf ,
330+ buflen , port , is_ipv4 );
331+ }
332+
333+ int
334+ os_socket_addr_remote (bh_socket_t socket , uint8_t * buf , size_t buflen ,
335+ uint16_t * port , uint8_t * is_ipv4 )
336+ {
337+ struct sockaddr_storage addr_storage = { 0 };
338+ socklen_t addr_len = sizeof (addr_storage );
339+ int ret ;
340+
341+ ret = getpeername (socket , (struct sockaddr * )& addr_storage , & addr_len );
342+
343+ if (ret != BHT_OK ) {
344+ return BHT_ERROR ;
345+ }
346+
347+ return os_socket_convert_sockaddr ((struct sockaddr * )& addr_storage , buf ,
348+ buflen , port , is_ipv4 );
323349}
0 commit comments