diff --git a/httplib.h b/httplib.h index b5bc38f..a14afb8 100644 --- a/httplib.h +++ b/httplib.h @@ -1198,20 +1198,18 @@ inline int close_socket(socket_t sock) { #endif } -template -inline ssize_t handle_EINTR(T fn) { +template inline ssize_t handle_EINTR(T fn) { ssize_t res = false; while (true) { res = fn(); - if (res < 0 && errno == EINTR) { - continue; - } + if (res < 0 && errno == EINTR) { continue; } break; } return res; } -#define HANDLE_EINTR(method, ...) (handle_EINTR([&]() { return method(__VA_ARGS__); })) +#define HANDLE_EINTR(method, ...) \ + (handle_EINTR([&]() { return method(__VA_ARGS__); })) inline ssize_t select_read(socket_t sock, time_t sec, time_t usec) { #ifdef CPPHTTPLIB_USE_POLL @@ -1231,7 +1229,8 @@ inline ssize_t select_read(socket_t sock, time_t sec, time_t usec) { tv.tv_sec = static_cast(sec); tv.tv_usec = static_cast(usec); - return HANDLE_EINTR(select, static_cast(sock + 1), &fds, nullptr, nullptr, &tv); + return HANDLE_EINTR(select, static_cast(sock + 1), &fds, nullptr, + nullptr, &tv); #endif } @@ -1253,7 +1252,8 @@ inline ssize_t select_write(socket_t sock, time_t sec, time_t usec) { tv.tv_sec = static_cast(sec); tv.tv_usec = static_cast(usec); - return HANDLE_EINTR(select, static_cast(sock + 1), nullptr, &fds, nullptr, &tv); + return HANDLE_EINTR(select, static_cast(sock + 1), nullptr, &fds, + nullptr, &tv); #endif } @@ -1270,7 +1270,7 @@ inline bool wait_until_socket_is_ready(socket_t sock, time_t sec, time_t usec) { int error = 0; socklen_t len = sizeof(error); auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, - reinterpret_cast(&error), &len); + reinterpret_cast(&error), &len); return res >= 0 && !error; } return false; @@ -1286,7 +1286,8 @@ inline bool wait_until_socket_is_ready(socket_t sock, time_t sec, time_t usec) { tv.tv_sec = static_cast(sec); tv.tv_usec = static_cast(usec); - if (HANDLE_EINTR(select, static_cast(sock + 1), &fdsr, &fdsw, &fdse, &tv) > 0 && + if (HANDLE_EINTR(select, static_cast(sock + 1), &fdsr, &fdsw, &fdse, + &tv) > 0 && (FD_ISSET(sock, &fdsr) || FD_ISSET(sock, &fdsw))) { int error = 0; socklen_t len = sizeof(error); @@ -1470,15 +1471,17 @@ socket_t create_socket(const char *host, int port, Fn fn, setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&yes), sizeof(yes)); - int no = 0; - setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&no), - sizeof(no)); - #ifdef SO_REUSEPORT setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, reinterpret_cast(&yes), sizeof(yes)); #endif + if (rp->ai_family == AF_INET6) { + int no = 0; + setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&no), + sizeof(no)); + } + // bind or connect if (fn(sock, *rp)) { freeaddrinfo(result); @@ -5127,4 +5130,3 @@ namespace detail { } // namespace httplib #endif // CPPHTTPLIB_HTTPLIB_H -