@@ -54,6 +54,38 @@ sockaddr_to_wasi_addr(const struct sockaddr *sock_addr, socklen_t addrlen,
5454 return ret ;
5555}
5656
57+ static __wasi_errno_t
58+ wasi_addr_to_sockaddr (const __wasi_addr_t * wasi_addr ,
59+ struct sockaddr * sock_addr , socklen_t * addrlen )
60+ {
61+ switch (wasi_addr -> kind ) {
62+ case IPv4 :
63+ {
64+ struct sockaddr_in sock_addr_in = { 0 };
65+ uint32_t s_addr ;
66+
67+ s_addr = (wasi_addr .addr .ip4 .addr .n0 << 24 )
68+ | (wasi_addr .addr .ip4 .addr .n1 << 16 )
69+ | (wasi_addr .addr .ip4 .addr .n2 << 8 )
70+ | wasi_addr .addr .ip4 .addr .n3 ;
71+
72+ sock_addr_in .sin_family = AF_INET ;
73+ sock_addr_in .sin_addr .s_addr = htonl (s_addr );
74+ sock_addr_in .sin_port = htons (wasi_addr -> addr .ip4 .port );
75+ memcpy (sock_addr , & sock_addr_in , sizeof (sock_addr_in ));
76+
77+ * addrlen = sizeof (sock_addr_in );
78+ break ;
79+ }
80+ case IPv6 :
81+ // TODO: IPV6
82+ return __WASI_ERRNO_AFNOSUPPORT ;
83+ default :
84+ return __WASI_ERRNO_AFNOSUPPORT ;
85+ }
86+ return __WASI_ERRNO_SUCCESS ;
87+ }
88+
5789static __wasi_errno_t
5890sock_addr_remote (__wasi_fd_t fd , struct sockaddr * sock_addr , socklen_t * addrlen )
5991{
@@ -67,30 +99,7 @@ sock_addr_remote(__wasi_fd_t fd, struct sockaddr *sock_addr, socklen_t *addrlen)
6799 return error ;
68100 }
69101
70- if (IPv4 == wasi_addr .kind ) {
71- struct sockaddr_in sock_addr_in = { 0 };
72-
73- s_addr = (wasi_addr .addr .ip4 .addr .n0 << 24 )
74- | (wasi_addr .addr .ip4 .addr .n1 << 16 )
75- | (wasi_addr .addr .ip4 .addr .n2 << 8 )
76- | wasi_addr .addr .ip4 .addr .n3 ;
77-
78- sock_addr_in .sin_family = AF_INET ;
79- sock_addr_in .sin_addr .s_addr = htonl (s_addr );
80- sock_addr_in .sin_port = htons (wasi_addr .addr .ip4 .port );
81- memcpy (sock_addr , & sock_addr_in , sizeof (sock_addr_in ));
82-
83- * addrlen = sizeof (sock_addr_in );
84- }
85- else if (IPv6 == wasi_addr .kind ) {
86- // TODO: IPV6
87- return __WASI_ERRNO_AFNOSUPPORT ;
88- }
89- else {
90- return __WASI_ERRNO_AFNOSUPPORT ;
91- }
92-
93- return __WASI_ERRNO_SUCCESS ;
102+ return wasi_addr_to_sockaddr (& wasi_addr , sock_addr , addrlen );
94103}
95104
96105int
@@ -260,3 +269,18 @@ socket(int domain, int type, int protocol)
260269
261270 return sockfd ;
262271}
272+
273+ int
274+ getsockname (int sockfd , struct sockaddr * addr , socklen_t * addrlen )
275+ {
276+ __wasi_addr_t wasi_addr = { 0 };
277+ __wasi_errno_t error ;
278+
279+ error = __wasi_sock_addr_local (sockfd , & wasi_addr );
280+ HANDLE_ERROR (error )
281+
282+ error = wasi_addr_to_sockaddr (& wasi_addr , addr , addrlen );
283+ HANDLE_ERROR (error )
284+
285+ return __WASI_ERRNO_SUCCESS ;
286+ }
0 commit comments