1 #define _GNU_SOURCE 2 3 #include "block_range.h" 4 #include <stdio.h> 5 6 struct block_range *new_block_range(blk64_t start, blk64_t end) 7 { 8 struct block_range *range = malloc(sizeof(*range)); 9 range->start = start; 10 range->end = end; 11 range->next = NULL; 12 return range; 13 } 14 15 void add_blocks_to_range(struct block_range **head, struct block_range **tail, 16 blk64_t blk_start, blk64_t blk_end) 17 { 18 if (*head == NULL) 19 *head = *tail = new_block_range(blk_start, blk_end); 20 else if ((*tail)->end + 1 == blk_start) 21 (*tail)->end += (blk_end - blk_start + 1); 22 else { 23 struct block_range *range = new_block_range(blk_start, blk_end); 24 (*tail)->next = range; 25 *tail = range; 26 } 27 } 28 29 void delete_block_ranges(struct block_range *head) 30 { 31 struct block_range *tmp; 32 33 while (head) { 34 tmp = head->next; 35 free(head); 36 head = tmp; 37 } 38 } 39 40 int write_block_ranges(FILE *f, struct block_range *range, 41 char *sep) 42 { 43 int len; 44 char *buf; 45 46 while (range) { 47 if (range->start == range->end) 48 len = asprintf(&buf, "%llu%s", range->start, sep); 49 else 50 len = asprintf(&buf, "%llu-%llu%s", range->start, 51 range->end, sep); 52 if (fwrite(buf, 1, len, f) != (size_t)len) { 53 free(buf); 54 return -1; 55 } 56 free(buf); 57 range = range->next; 58 } 59 60 len = strlen(sep); 61 if (fseek(f, -len, SEEK_CUR) == -len) 62 return -1; 63 return 0; 64 } 65