From dc81a51d59ccf31a5b47b989060a626e97a3d709 Mon Sep 17 00:00:00 2001 From: sr Date: Mon, 8 Jul 2013 18:46:26 +0200 Subject: Rewriting.... --- src/server/image.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/server/image.c (limited to 'src/server/image.c') diff --git a/src/server/image.c b/src/server/image.c new file mode 100644 index 0000000..8a2b943 --- /dev/null +++ b/src/server/image.c @@ -0,0 +1,38 @@ +#include "image.h" + +#include +#include + +int image_is_complete(dnbd3_image_t *image) +{ + assert(image != NULL); + if (image->working && image->cache_map == NULL) { + return TRUE; + } + if (image->filesize == 0 || !image->working) { + return FALSE; + } + int complete = TRUE, j; + const int map_len_bytes = IMGSIZE_TO_MAPBYTES(image->filesize); + for (j = 0; j < map_len_bytes - 1; ++j) + { + if (image->cache_map[j] != 0xFF) + { + complete = FALSE; + break; + } + } + if (complete) // Every block except the last one is complete + { // Last one might need extra treatment if it's not a full byte + const int blocks_in_last_byte = (image->filesize >> 12) & 7; + uint8_t last_byte = 0; + if (blocks_in_last_byte == 0) { + last_byte = 0xFF; + } else { + for (j = 0; j < blocks_in_last_byte; ++j) + last_byte |= (1 << j); + } + complete = ((image->cache_map[map_len_bytes - 1] & last_byte) == last_byte); + } + return complete; +} -- cgit v1.2.3-55-g7522