Extra Makefile hack for compatibility with OpenBSD 'make'.
[BearSSL] / tools / server.c
index cb04711..8fcf2eb 100644 (file)
@@ -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