]> tinc-vpn.org Git - tinc/commitdiff
invitation.c: fix socket error checking on Windows
authorKirill Isakov <is-kir@ya.ru>
Mon, 5 Jul 2021 04:37:04 +0000 (10:37 +0600)
committerKirill Isakov <is-kir@ya.ru>
Sat, 10 Jul 2021 15:18:14 +0000 (21:18 +0600)
src/invitation.c
src/utils.h

index 29769686e96f1cf775929a9cc0ec7e85e690a024..30d100d98e43ed9d131c0e8264841be0cd1b31c0 100644 (file)
@@ -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;
                }
 
index 42851501c4e1342ed37f2177f330661b4340a96c..25e8cc951ca0f7dbd3158954f150ba9e4eaa9ff5 100644 (file)
@@ -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)