summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Rettberg2013-08-28 19:22:50 +0200
committerSimon Rettberg2013-08-28 19:22:50 +0200
commited39518381ca5cf147552b93a961a4ea3b36a72c (patch)
treeb2b87b1fde888a157715b1e3c817de0a999c46d0 /src
parent[SERVER] Save CRC-32 to disk if successfully retreived from uplink server (diff)
downloaddnbd3-ed39518381ca5cf147552b93a961a4ea3b36a72c.tar.gz
dnbd3-ed39518381ca5cf147552b93a961a4ea3b36a72c.tar.xz
dnbd3-ed39518381ca5cf147552b93a961a4ea3b36a72c.zip
[SERVER] Properly receive complete crc32 list
Diffstat (limited to 'src')
-rw-r--r--src/server/protocol.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/server/protocol.h b/src/server/protocol.h
index c8010ab..5544876 100644
--- a/src/server/protocol.h
+++ b/src/server/protocol.h
@@ -74,8 +74,14 @@ static inline int dnbd3_get_crc32(int sock, uint32_t *master, void *buffer, size
reply.size -= 4;
if ( reply.cmd != CMD_GET_CRC32 || reply.size > *bufferLen ) return FALSE;
*bufferLen = reply.size;
- return recv( sock, master, sizeof(uint32_t), 0 ) == sizeof(uint32_t)
- && recv( sock, buffer, reply.size, 0 ) == (int)reply.size;
+ if ( recv( sock, master, sizeof(uint32_t), MSG_WAITALL ) != sizeof(uint32_t) ) return FALSE;
+ int done = 0;
+ while ( done < reply.size ) {
+ const int ret = recv( sock, buffer, reply.size, 0 );
+ if ( ret <= 0 ) return FALSE;
+ done += ret;
+ }
+ return TRUE;
}
/**