1fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht#include "block_list.h" 2fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht#include "block_range.h" 3fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht#include <stdio.h> 4fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht#include <sys/types.h> 5fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht#include <sys/stat.h> 6fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht#include <fcntl.h> 7fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 8fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknechtstruct block_list { 9fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht FILE *f; 10fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht const char *mountpoint; 11fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 12fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht struct { 13fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht const char *filename; 14fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht struct block_range *head; 15fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht struct block_range *tail; 16fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht } entry; 17fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht}; 18fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 19fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknechtstatic void *init(const char *file, const char *mountpoint) 20fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht{ 21fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht struct block_list *params = malloc(sizeof(*params)); 22fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 23fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht if (!params) 24fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht return NULL; 25fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht params->mountpoint = mountpoint; 26fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht params->f = fopen(file, "w+"); 27fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht if (!params->f) { 28fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht free(params); 29fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht return NULL; 30fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht } 31fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht return params; 32fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht} 33fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 34fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknechtstatic int start_new_file(char *path, ext2_ino_t ino EXT2FS_ATTR((unused)), 35fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht struct ext2_inode *inode EXT2FS_ATTR((unused)), 36fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht void *data) 37fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht{ 38fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht struct block_list *params = data; 39fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 40fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht params->entry.head = params->entry.tail = NULL; 41fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht params->entry.filename = LINUX_S_ISREG(inode->i_mode) ? path : NULL; 42fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht return 0; 43fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht} 44fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 45fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknechtstatic int add_block(ext2_filsys fs EXT2FS_ATTR((unused)), blk64_t blocknr, 46fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht int metadata, void *data) 47fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht{ 48fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht struct block_list *params = data; 49fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 50fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht if (params->entry.filename && !metadata) 51fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht add_blocks_to_range(¶ms->entry.head, ¶ms->entry.tail, 52fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht blocknr, blocknr); 53fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht return 0; 54fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht} 55fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 56fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknechtstatic int inline_data(void *inline_data EXT2FS_ATTR((unused)), 57fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht void *data EXT2FS_ATTR((unused))) 58fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht{ 59fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht return 0; 60fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht} 61fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 62fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknechtstatic int end_new_file(void *data) 63fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht{ 64fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht struct block_list *params = data; 65fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 66cc933ab3bfee821dc885fe5a6bbb2a4997304ff9Ben Fennema if (!params->entry.filename || !params->entry.head) 67fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht return 0; 68fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht if (fprintf(params->f, "%s%s ", params->mountpoint, 69fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht params->entry.filename) < 0 70fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht || write_block_ranges(params->f, params->entry.head, " ") 71fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht || fwrite("\n", 1, 1, params->f) != 1) 72fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht return -1; 73fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 74fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht delete_block_ranges(params->entry.head); 75fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht return 0; 76fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht} 77fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 78fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknechtstatic int cleanup(void *data) 79fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht{ 80fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht struct block_list *params = data; 81fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 82fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht fclose(params->f); 83fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht free(params); 84fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht return 0; 85fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht} 86fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht 87fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknechtstruct fsmap_format block_list_format = { 88fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht .init = init, 89fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht .start_new_file = start_new_file, 90fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht .add_block = add_block, 91fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht .inline_data = inline_data, 92fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht .end_new_file = end_new_file, 93fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht .cleanup = cleanup, 94fdc29bee07aef3a379f3ec3ccbaa551ff6500bffAdrien Schildknecht}; 95