X-Git-Url: https://www.bearssl.org/gitweb//home/git/?p=BearSSL;a=blobdiff_plain;f=tools%2Fserver.c;h=a97de35dee8ed57bfbed019772a59fdb001f9973;hp=cb047113a6811e9b522f0d22c208b7c2fe3d948b;hb=b715b43e411dc5d5949df6f75ef7bb65952db11c;hpb=927ecfc68d92d39e308eb5f1114db8de397fdb18 diff --git a/tools/server.c b/tools/server.c index cb04711..a97de35 100644 --- a/tools/server.c +++ b/tools/server.c @@ -75,7 +75,7 @@ host_bind(const char *host, const char *port, int verbose) 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; @@ -83,7 +83,7 @@ host_bind(const char *host, const char *port, int verbose) 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; @@ -166,7 +166,7 @@ host_bind(const char *host, const char *port, int verbose) } static SOCKET -accept_client(SOCKET server_fd, int verbose) +accept_client(SOCKET server_fd, int verbose, int nonblock) { int fd; SOCKADDR_STORAGE sa; @@ -209,16 +209,16 @@ accept_client(SOCKET server_fd, int verbose) * 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; } @@ -1058,6 +1058,9 @@ do_server(int argc, char *argv[]) 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); } @@ -1177,15 +1180,16 @@ do_server(int argc, char *argv[]) */ 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 @@ -1214,6 +1218,13 @@ server_exit: closesocket(fd); #else close(fd); +#endif + } + if (server_fd != INVALID_SOCKET) { +#ifdef _WIN32 + closesocket(server_fd); +#else + close(server_fd); #endif } return retcode;