diff options
author | Simon Rettberg | 2013-08-28 19:22:50 +0200 |
---|---|---|
committer | Simon Rettberg | 2013-08-28 19:22:50 +0200 |
commit | ed39518381ca5cf147552b93a961a4ea3b36a72c (patch) | |
tree | b2b87b1fde888a157715b1e3c817de0a999c46d0 | |
parent | [SERVER] Save CRC-32 to disk if successfully retreived from uplink server (diff) | |
download | dnbd3-ed39518381ca5cf147552b93a961a4ea3b36a72c.tar.gz dnbd3-ed39518381ca5cf147552b93a961a4ea3b36a72c.tar.xz dnbd3-ed39518381ca5cf147552b93a961a4ea3b36a72c.zip |
[SERVER] Properly receive complete crc32 list
-rw-r--r-- | src/server/protocol.h | 10 |
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; } /** |