@@ -184,6 +184,29 @@ static struct k_mutex socket_mutex;
184184#define NET_HOSTNAME_MAX 32
185185#define SOCK_READ_BUF_SIZE 128
186186
187+ // TODO: this could perhaps be reused in dgram/ws etc
188+ static void zjs_copy_sockaddr (struct sockaddr * dst , struct sockaddr * src ,
189+ socklen_t len )
190+ {
191+ // requires: dst contains at least sizeof(sockaddr) bytes, src points to
192+ // a valid sockaddr struct (sockaddr_in or sockaddr_in6),
193+ // len is the address length if known, or 0
194+ // effects: copies src to dest, but only the number of bytes required by
195+ // the underlying address family; if len is given, asserts
196+ // that it matches the expected size
197+ if (src -> family == AF_INET ) {
198+ ZJS_ASSERT (!len || len == sizeof (sockaddr_in ), "expected IPv4 length" );
199+ * (struct sockaddr_in * )dst = * (struct sockaddr_in * )src ;
200+ }
201+ else if (src -> family == AF_INET6 ) {
202+ ZJS_ASSERT (!len || len == sizeof (sockaddr_in6 ), "expected IPv6 length" );
203+ * (struct sockaddr_in6 * )dst = * (struct sockaddr_in6 * )src ;
204+ }
205+ else {
206+ ZJS_ASSERT (false, "invalid sockaddr struct" );
207+ }
208+ }
209+
187210static int match_timer (sock_handle_t * sock , struct k_timer * timer )
188211{
189212 FTRACE ("sock = %p, timer = %p\n" , sock , timer );
@@ -891,7 +914,7 @@ static void tcp_accepted(struct net_context *context,
891914 accept .context = context ;
892915 accept .server_h = server_h ;
893916 memset (& accept .addr , 0 , sizeof (struct sockaddr ));
894- memcpy (& accept .addr , addr , addrlen );
917+ zjs_copy_sockaddr (& accept .addr , addr , addrlen );
895918
896919 zjs_defer_work (accept_connection , & accept , sizeof (accept ));
897920}
@@ -1017,12 +1040,12 @@ static ZJS_DECL_FUNC(server_listen)
10171040 double backlog = 0 ;
10181041 u32_t size = NET_HOSTNAME_MAX ;
10191042 char hostname [size ];
1020- double family = 0 ;
1043+ u32_t family = 0 ;
10211044
10221045 zjs_obj_get_double (argv [0 ], "port" , & port );
10231046 zjs_obj_get_double (argv [0 ], "backlog" , & backlog );
10241047 zjs_obj_get_string (argv [0 ], "host" , hostname , size );
1025- zjs_obj_get_double (argv [0 ], "family" , & family );
1048+ zjs_obj_get_uint32 (argv [0 ], "family" , & family );
10261049
10271050 // FIXME: validate or fix input, e.g. family
10281051
@@ -1032,41 +1055,32 @@ static ZJS_DECL_FUNC(server_listen)
10321055
10331056 struct sockaddr addr ;
10341057 memset (& addr , 0 , sizeof (struct sockaddr ));
1058+ addr .family = (family == 6 ) ? AF_INET6 : AF_INET ; // default to IPv4
10351059
1036- // default to IPv4
1037- if (family == 0 || family == 4 ) {
1038- family = 4 ;
1039- CHECK (net_context_get (AF_INET , SOCK_STREAM , IPPROTO_TCP ,
1040- & server_h -> server_ctx ));
1060+ CHECK (net_context_get (addr .family , SOCK_STREAM , IPPROTO_TCP ,
1061+ & server_h -> server_ctx ));
10411062
1063+ u32_t addrlen ;
1064+ if (addr .family == AF_INET ) {
10421065 struct sockaddr_in * addr4 = (struct sockaddr_in * )& addr ;
1043-
1044- addr4 -> sin_family = AF_INET ;
10451066 addr4 -> sin_port = htons ((int )port );
1046-
10471067 net_addr_pton (AF_INET , hostname , & addr4 -> sin_addr );
1068+ addrlen = sizeof (struct sockaddr_in );
10481069 } else {
1049- CHECK (net_context_get (AF_INET6 , SOCK_STREAM , IPPROTO_TCP ,
1050- & server_h -> server_ctx ));
1051-
10521070 struct sockaddr_in6 * addr6 = (struct sockaddr_in6 * )& addr ;
1053-
1054- addr6 -> sin6_family = AF_INET6 ;
10551071 addr6 -> sin6_port = htons ((int )port );
1056-
10571072 net_addr_pton (AF_INET6 , hostname , & addr6 -> sin6_addr );
1073+ addrlen = sizeof (struct sockaddr_in6 );
10581074 }
10591075
1060- CHECK (net_context_bind (server_h -> server_ctx , & addr ,
1061- sizeof (struct sockaddr )));
1076+ CHECK (net_context_bind (server_h -> server_ctx , & addr , addrlen ));
10621077 CHECK (net_context_listen (server_h -> server_ctx , (int )backlog ));
10631078
10641079 server_h -> listening = 1 ;
10651080 server_h -> port = (u16_t )port ;
10661081
1067- memcpy (& server_h -> local , zjs_net_config_get_ip (server_h -> server_ctx ),
1068- sizeof (struct sockaddr ));
1069- server_h -> local = * zjs_net_config_get_ip (server_h -> server_ctx );
1082+ zjs_copy_sockaddr (& server_h -> local ,
1083+ zjs_net_config_get_ip (server_h -> server_ctx ), 0 );
10701084 zjs_obj_add_boolean (this , "listening" , true);
10711085
10721086 // Here we defer just to keep the call stack short; this is unless we
0 commit comments