]> git.lizzy.rs Git - dragonnet.git/commitdiff
Wrap MSG_WAITALL on windows waitall
authorElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 26 Apr 2022 09:24:29 +0000 (11:24 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 26 Apr 2022 10:02:36 +0000 (12:02 +0200)
dragonnet/recv.c
dragonnet/recv.h
dragonnet/recv_thread.c

index 36026604e6e566a3fe34b4b8197606356cd36f48..64182e1026a9a355dd9c30a1bbb023646aebfca0 100644 (file)
@@ -6,12 +6,36 @@
 #include "recv.h"
 #include "sock.h"
 
+ssize_t dragonnet_recv_wrapper(int sock, char *buf, size_t len)
+{
+#ifdef _WIN32
+       size_t rem = len;
+
+       while (rem) {
+               ssize_t num = recv(sock, buf, rem, 0);
+
+               if (num < 0)
+                       return num;
+
+               if (num == 0)
+                       return len - rem;
+
+               buf += num;
+               rem -= num;
+       }
+
+       return len;
+#else // _WIN32
+       return recv(sock, buf, len, MSG_WAITALL);
+#endif // _WIN32
+}
+
 bool dragonnet_recv_raw(DragonnetPeer *p, void *buf, size_t n)
 {
        if (n == 0)
                return true;
 
-       ssize_t len = recv(p->sock, buf, n, MSG_WAITALL);
+       ssize_t len = dragonnet_recv_wrapper(p->sock, buf, n);
        if (len < 0) {
                dragonnet_perror("recv");
                abort();
index eae26d3b8e1ac44591e8e9fe224de0f2ed5e30f2..b0a864f91ead29d1c2d9a3dc9edf44b9b3858956 100644 (file)
@@ -12,6 +12,7 @@ typedef struct {
 extern DragonnetTypeId dragonnet_num_types;
 extern DragonnetType dragonnet_types[];
 
+ssize_t dragonnet_recv_wrapper(int sock, char *buf, size_t len);
 bool dragonnet_recv_raw(DragonnetPeer *p, void *buf, size_t n);
 
 #endif
index 459e3466d20df54b49d8a305ac10a01bb2b16165..98411c7e3f52dd422c1fe1c78a92e602e7191257 100644 (file)
@@ -26,7 +26,7 @@ void *dragonnet_peer_recv_thread(void *g_peer)
 
                bool reset = false;
 
-               ssize_t len = recv(p->sock, (void *) &type_id, sizeof type_id, MSG_WAITALL);
+               ssize_t len = dragonnet_recv_wrapper(p->sock, (void *) &type_id, sizeof type_id);
                if (len < 0) {
                        if (dragonnet_isconnerr()) {
                                reset = true;