X-Git-Url: https://www.bearssl.org/gitweb//home/git/?p=BearSSL;a=blobdiff_plain;f=tools%2Fserver.c;h=8fcf2ebabbb691024fcc726bdd87575acc798ee0;hp=cb047113a6811e9b522f0d22c208b7c2fe3d948b;hb=7d313ccce746ed413f22ed0dc83402efb17488e6;hpb=927ecfc68d92d39e308eb5f1114db8de397fdb18 diff --git a/tools/server.c b/tools/server.c index cb04711..8fcf2eb 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; } @@ -1177,15 +1177,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