/* Write a contiguous region of data blocks from a file */ int write_file_chunk(struct output_file *out, unsigned int len, const char *file, int64_t offset) { int ret; int file_fd = open(file, O_RDONLY | O_BINARY); if (file_fd < 0) { return -errno; } ret = write_fd_chunk(out, len, file_fd, offset); close(file_fd); return ret; }
static void sparse_file_write_block(struct output_file *out, struct backed_block *bb) { switch (backed_block_type(bb)) { case BACKED_BLOCK_DATA: write_data_chunk(out, backed_block_len(bb), backed_block_data(bb)); break; case BACKED_BLOCK_FILE: write_file_chunk(out, backed_block_len(bb), backed_block_filename(bb), backed_block_file_offset(bb)); break; case BACKED_BLOCK_FD: write_fd_chunk(out, backed_block_len(bb), backed_block_fd(bb), backed_block_file_offset(bb)); break; case BACKED_BLOCK_FILL: write_fill_chunk(out, backed_block_len(bb), backed_block_fill_val(bb)); break; } }