sa = (struct sockaddr *)p->ai_addr;
if (sa->sa_family == AF_INET) {
- sa4 = *(struct sockaddr_in *)sa;
+ memcpy(&sa4, sa, sizeof sa4);
sa = (struct sockaddr *)&sa4;
sa_len = sizeof sa4;
addr = &sa4.sin_addr;
sa4.sin_addr.s_addr = INADDR_ANY;
}
} else if (sa->sa_family == AF_INET6) {
- sa6 = *(struct sockaddr_in6 *)sa;
+ memcpy(&sa6, sa, sizeof sa6);
sa = (struct sockaddr *)&sa6;
sa_len = sizeof sa6;
addr = &sa6.sin6_addr;
}
static SOCKET
-accept_client(SOCKET server_fd, int verbose)
+accept_client(SOCKET server_fd, int verbose, int nonblock)
{
int fd;
SOCKADDR_STORAGE sa;
* We make the socket non-blocking, since we are going to use
* poll() or select() to organise I/O.
*/
+ if (nonblock) {
#ifdef _WIN32
- {
u_long arg;
arg = 1;
ioctlsocket(fd, FIONBIO, &arg);
- }
#else
- fcntl(fd, F_SETFL, O_NONBLOCK);
+ fcntl(fd, F_SETFL, O_NONBLOCK);
#endif
+ }
return fd;
}
if ((req & REQ_AESCBC) != 0) {
br_ssl_engine_set_default_aes_cbc(&cc.eng);
}
+ if ((req & REQ_AESCCM) != 0) {
+ br_ssl_engine_set_default_aes_ccm(&cc.eng);
+ }
if ((req & REQ_AESGCM) != 0) {
br_ssl_engine_set_default_aes_gcm(&cc.eng);
}
*/
for (;;) {
int x;
+ unsigned run_flags;
- fd = accept_client(server_fd, verbose);
+ fd = accept_client(server_fd, verbose, 1);
if (fd == INVALID_SOCKET) {
goto server_exit_error;
}
br_ssl_server_reset(&cc);
- x = run_ssl_engine(&cc.eng, fd,
- (verbose ? RUN_ENGINE_VERBOSE : 0)
- | (trace ? RUN_ENGINE_TRACE : 0));
+ run_flags = (verbose ? RUN_ENGINE_VERBOSE : 0)
+ | (trace ? RUN_ENGINE_TRACE : 0);
+ x = run_ssl_engine(&cc.eng, fd, run_flags);
#ifdef _WIN32
closesocket(fd);
#else