@@ -124,41 +124,39 @@ int connection_open_listener(struct scache_bind ibind) {
124124 }
125125
126126 // bind1
127- sockaddr* tobind;
127+ union {
128+ struct sockaddr_in servaddr;
129+ struct sockaddr_in6 servaddr6;
130+ struct sockaddr_un unaddr;
131+ } tobind;
128132 int tobind_len;
129133 switch (ibind.af )
130134 {
131135 case AF_INET :
132- struct sockaddr_in servaddr;
133- tobind = (sockaddr*)&servaddr;
134- tobind_len = sizeof (servaddr);
135- memset (&servaddr, 0 , sizeof (servaddr));
136- servaddr.sin_family = ibind.af ;
137- memcpy (&servaddr.sin_addr .s_addr , &ibind.addr , sizeof (servaddr.sin_addr .s_addr ));
138- servaddr.sin_port = htons (ibind.port );
136+ tobind_len = sizeof (tobind.servaddr );
137+ memset (&tobind.servaddr , 0 , sizeof (tobind.servaddr ));
138+ tobind.servaddr .sin_family = ibind.af ;
139+ memcpy (&tobind.servaddr .sin_addr .s_addr , &ibind.addr , sizeof (tobind.servaddr .sin_addr .s_addr ));
140+ tobind.servaddr .sin_port = htons (ibind.port );
139141
140142 case AF_INET6 :
141- struct sockaddr_in6 servaddr6;
142- tobind = (sockaddr*)&servaddr6;
143- tobind_len = sizeof (servaddr6);
144- memset (&servaddr6, 0 , sizeof (servaddr6));
145- servaddr6.sin6_family = ibind.af ;
146- memcpy (&servaddr6.sin6_addr .__in6_u , &ibind.addr , sizeof (servaddr6.sin6_addr .__in6_u ));
147- servaddr6.sin6_port = htons (ibind.port );
143+ tobind_len = sizeof (tobind.servaddr6 );
144+ memset (&tobind.servaddr6 , 0 , sizeof (tobind.servaddr6 ));
145+ tobind.servaddr6 .sin6_family = ibind.af ;
146+ memcpy (&tobind.servaddr6 .sin6_addr .__in6_u , &ibind.addr , sizeof (tobind.servaddr6 .sin6_addr .__in6_u ));
147+ tobind.servaddr6 .sin6_port = htons (ibind.port );
148148
149149 case AF_UNIX :
150- struct sockaddr_un unaddr;
151- tobind = (sockaddr*)&unaddr;
152- tobind_len = sizeof (unaddr);
153- memset (&unaddr, 0 , sizeof (unaddr));
154- unaddr.sun_family = ibind.af ;
155- memcpy (&unaddr.sun_path , &ibind.addr , sizeof (unaddr.sun_path ));
150+ tobind_len = sizeof (tobind.unaddr );
151+ memset (&tobind.unaddr , 0 , sizeof (tobind.unaddr ));
152+ tobind.unaddr .sun_family = ibind.af ;
153+ memcpy (&tobind.unaddr .sun_path , &ibind.addr , sizeof (tobind.unaddr .sun_path ));
156154
157155 default :
158156 FATAL (" Unknown address family, cant bind" );
159157 }
160158
161- res = bind (listenfd, tobind, tobind_len);
159+ res = bind (listenfd, (sockaddr*)& tobind, tobind_len);
162160 if (res < 0 ){
163161 goto fail;
164162 }
0 commit comments