From: Kirill Isakov Date: Mon, 5 Jul 2021 04:37:04 +0000 (+0600) Subject: invitation.c: fix socket error checking on Windows X-Git-Url: https://tinc-vpn.org/git/browse?a=commitdiff_plain;h=1a52f8093fc2e894860aee82e4a20885099a7130;p=tinc invitation.c: fix socket error checking on Windows --- diff --git a/src/invitation.c b/src/invitation.c index 29769686..30d100d9 100644 --- a/src/invitation.c +++ b/src/invitation.c @@ -1076,7 +1076,7 @@ static bool invitation_send(void *handle, uint8_t type, const void *vdata, size_ while(len) { int result = send(sock, data, len, 0); - if(result == -1 && errno == EINTR) { + if(result == -1 && sockwouldblock(sockerrno)) { continue; } else if(result <= 0) { return false; @@ -1324,11 +1324,21 @@ next: while((len = recv(sock, line, sizeof(line), 0))) { if(len < 0) { - if(errno == EINTR) { + if(sockwouldblock(sockerrno)) { continue; } - fprintf(stderr, "Error reading data from %s port %s: %s\n", address, port, strerror(errno)); +#if HAVE_MINGW + + // If socket has been shut down, recv() on Windows returns -1 and sets sockerrno + // to WSAESHUTDOWN, while on UNIX-like operating systems recv() returns 0, so we + // have to do an explicit check here. + if(sockshutdown(sockerrno)) { + break; + } + +#endif + fprintf(stderr, "Error reading data from %s port %s: %s\n", address, port, sockstrerror(sockerrno)); return 1; } diff --git a/src/utils.h b/src/utils.h index 42851501..25e8cc95 100644 --- a/src/utils.h +++ b/src/utils.h @@ -38,6 +38,7 @@ extern const char *winerror(int); #define sockinprogress(x) ((x) == WSAEINPROGRESS || (x) == WSAEWOULDBLOCK) #define sockinuse(x) ((x) == WSAEADDRINUSE) #define socknotconn(x) ((x) == WSAENOTCONN) +#define sockshutdown(x) ((x) == WSAESHUTDOWN) #else #define sockerrno errno #define sockstrerror(x) strerror(x)