128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross/* 228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Copyright (C) 2012 The Android Open Source Project 328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Licensed under the Apache License, Version 2.0 (the "License"); 528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * you may not use this file except in compliance with the License. 628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * You may obtain a copy of the License at 728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * http://www.apache.org/licenses/LICENSE-2.0 928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 1028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Unless required by applicable law or agreed to in writing, software 1128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * distributed under the License is distributed on an "AS IS" BASIS, 1228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * See the License for the specific language governing permissions and 1428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * limitations under the License. 1528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross */ 1628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 1728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#ifndef _LIBSPARSE_SPARSE_H_ 1828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#define _LIBSPARSE_SPARSE_H_ 1928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 2028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#include <stdbool.h> 2128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#include <stdint.h> 2228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 23099824cce31853a0680723e70151d866416a5c78Colin Cross#ifdef __cplusplus 24099824cce31853a0680723e70151d866416a5c78Colin Crossextern "C" { 25099824cce31853a0680723e70151d866416a5c78Colin Cross#endif 26099824cce31853a0680723e70151d866416a5c78Colin Cross 2728fa5bc347390480fe190294c6c385b6a9f0d68bColin Crossstruct sparse_file; 2828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 2928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross/** 3028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * sparse_file_new - create a new sparse file cookie 3128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 3228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @block_size - minimum size of a chunk 3328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @len - size of the expanded sparse file. 3428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 3528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Creates a new sparse_file cookie that can be used to associate data 3628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * blocks. Can later be written to a file with a variety of options. 3728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * block_size specifies the minimum size of a chunk in the file. The maximum 3828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * size of the file is 2**32 * block_size (16TB for 4k block size). 3928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 4028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Returns the sparse file cookie, or NULL on error. 4128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross */ 4228fa5bc347390480fe190294c6c385b6a9f0d68bColin Crossstruct sparse_file *sparse_file_new(unsigned int block_size, int64_t len); 4328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 4428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross/** 4528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * sparse_file_destroy - destroy a sparse file cookie 4628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 4728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @s - sparse file cookie 4828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 4928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Destroys a sparse file cookie. After destroy, all memory passed in to 5028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * sparse_file_add_data can be freed by the caller 5128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross */ 5228fa5bc347390480fe190294c6c385b6a9f0d68bColin Crossvoid sparse_file_destroy(struct sparse_file *s); 5328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 5428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross/** 5528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * sparse_file_add_data - associate a data chunk with a sparse file 5628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 5728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @s - sparse file cookie 5828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @data - pointer to data block 5928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @len - length of the data block 6028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @block - offset in blocks into the sparse file to place the data chunk 6128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 6228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Associates a data chunk with a sparse file cookie. The region 6328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * [block * block_size : block * block_size + len) must not already be used in 6428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * the sparse file. If len is not a multiple of the block size the data 6528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * will be padded with zeros. 6628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 6728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * The data pointer must remain valid until the sparse file is closed or the 6828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * data block is removed from the sparse file. 6928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 7028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Returns 0 on success, negative errno on error. 7128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross */ 7228fa5bc347390480fe190294c6c385b6a9f0d68bColin Crossint sparse_file_add_data(struct sparse_file *s, 7328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross void *data, unsigned int len, unsigned int block); 7428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 7528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross/** 7628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * sparse_file_add_fill - associate a fill chunk with a sparse file 7728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 7828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @s - sparse file cookie 7928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @fill_val - 32 bit fill data 8028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @len - length of the fill block 8128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @block - offset in blocks into the sparse file to place the fill chunk 8228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 8328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Associates a chunk filled with fill_val with a sparse file cookie. 8428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * The region [block * block_size : block * block_size + len) must not already 8528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * be used in the sparse file. If len is not a multiple of the block size the 8628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * data will be padded with zeros. 8728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 8828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Returns 0 on success, negative errno on error. 8928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross */ 9028fa5bc347390480fe190294c6c385b6a9f0d68bColin Crossint sparse_file_add_fill(struct sparse_file *s, 9128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross uint32_t fill_val, unsigned int len, unsigned int block); 9228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 9328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross/** 9428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * sparse_file_add_file - associate a chunk of a file with a sparse file 9528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 9628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @s - sparse file cookie 9728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @filename - filename of the file to be copied 9828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @file_offset - offset into the copied file 9928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @len - length of the copied block 10028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @block - offset in blocks into the sparse file to place the file chunk 10128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 10228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Associates a chunk of an existing file with a sparse file cookie. 10328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * The region [block * block_size : block * block_size + len) must not already 10428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * be used in the sparse file. If len is not a multiple of the block size the 10528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * data will be padded with zeros. 10628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 10728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Allows adding large amounts of data to a sparse file without needing to keep 10828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * it all mapped. File size is limited by available virtual address space, 10928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * exceptionally large files may need to be added in multiple chunks. 11028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 11128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Returns 0 on success, negative errno on error. 11228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross */ 11328fa5bc347390480fe190294c6c385b6a9f0d68bColin Crossint sparse_file_add_file(struct sparse_file *s, 11428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross const char *filename, int64_t file_offset, unsigned int len, 11528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross unsigned int block); 11628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 11728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross/** 1189e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * sparse_file_add_file - associate a chunk of a file with a sparse file 1199e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * 1209e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * @s - sparse file cookie 1219e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * @filename - filename of the file to be copied 1229e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * @file_offset - offset into the copied file 1239e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * @len - length of the copied block 1249e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * @block - offset in blocks into the sparse file to place the file chunk 1259e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * 1269e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * Associates a chunk of an existing fd with a sparse file cookie. 1279e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * The region [block * block_size : block * block_size + len) must not already 1289e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * be used in the sparse file. If len is not a multiple of the block size the 1299e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * data will be padded with zeros. 1309e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * 1319e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * Allows adding large amounts of data to a sparse file without needing to keep 1329e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * it all mapped. File size is limited by available virtual address space, 1339e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * exceptionally large files may need to be added in multiple chunks. 1349e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * 1359e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * The fd must remain open until the sparse file is closed or the fd block is 1369e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * removed from the sparse file. 1379e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * 1389e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross * Returns 0 on success, negative errno on error. 1399e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross */ 1409e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Crossint sparse_file_add_fd(struct sparse_file *s, 1419e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross int fd, int64_t file_offset, unsigned int len, unsigned int block); 1429e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross 1439e1f17e926fa20255c5f4b4d2f68aa98a964253aColin Cross/** 14428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * sparse_file_write - write a sparse file to a file 14528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 14628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @s - sparse file cookie 14728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @fd - file descriptor to write to 14828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @gz - write a gzipped file 14928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @sparse - write in the Android sparse file format 15028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * @crc - append a crc chunk 15128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 15228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Writes a sparse file to a file. If gz is true, the data will be passed 15328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * through zlib. If sparse is true, the file will be written in the Android 15428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * sparse file format. If sparse is false, the file will be written by seeking 15528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * over unused chunks, producing a smaller file if the filesystem supports 15628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * sparse files. If crc is true, the crc of the expanded data will be 15728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * calculated and appended in a crc chunk. 15828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 15928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Returns 0 on success, negative errno on error. 16028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross */ 16128fa5bc347390480fe190294c6c385b6a9f0d68bColin Crossint sparse_file_write(struct sparse_file *s, int fd, bool gz, bool sparse, 16228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross bool crc); 163317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross 164317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross/** 165317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross * sparse_file_len - return the length of a sparse file if written to disk 166317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross * 167317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross * @s - sparse file cookie 168317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross * @sparse - write in the Android sparse file format 169317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross * @crc - append a crc chunk 170317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross * 171317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross * Returns the size a sparse file would be on disk if it were written in the 172317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross * specified format. If sparse is true, this is the size of the data in the 173317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross * sparse format. If sparse is false, this is the size of the normal 174317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross * non-sparse file. 175317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Cross */ 176317a09e2d47257df5e0972c85f14c2a6ffdbbfd2Colin Crossint64_t sparse_file_len(struct sparse_file *s, bool sparse, bool crc); 17728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 178a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross/** 179a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * sparse_file_block_size 180a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * 181a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * @s - sparse file cookie 182a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht */ 183a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknechtunsigned int sparse_file_block_size(struct sparse_file *s); 184a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht 185a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht/** 1861e17b313a6257b7b5081e178e81435c09d60378eColin Cross * sparse_file_callback - call a callback for blocks in sparse file 1871e17b313a6257b7b5081e178e81435c09d60378eColin Cross * 1881e17b313a6257b7b5081e178e81435c09d60378eColin Cross * @s - sparse file cookie 1891e17b313a6257b7b5081e178e81435c09d60378eColin Cross * @sparse - write in the Android sparse file format 1901e17b313a6257b7b5081e178e81435c09d60378eColin Cross * @crc - append a crc chunk 1911e17b313a6257b7b5081e178e81435c09d60378eColin Cross * @write - function to call for each block 1921e17b313a6257b7b5081e178e81435c09d60378eColin Cross * @priv - value that will be passed as the first argument to write 1931e17b313a6257b7b5081e178e81435c09d60378eColin Cross * 1941e17b313a6257b7b5081e178e81435c09d60378eColin Cross * Writes a sparse file by calling a callback function. If sparse is true, the 1951e17b313a6257b7b5081e178e81435c09d60378eColin Cross * file will be written in the Android sparse file format. If crc is true, the 1961e17b313a6257b7b5081e178e81435c09d60378eColin Cross * crc of the expanded data will be calculated and appended in a crc chunk. 1971e17b313a6257b7b5081e178e81435c09d60378eColin Cross * The callback 'write' will be called with data and length for each data, 1981e17b313a6257b7b5081e178e81435c09d60378eColin Cross * and with data==NULL to skip over a region (only used for non-sparse format). 1991e17b313a6257b7b5081e178e81435c09d60378eColin Cross * The callback should return negative on error, 0 on success. 2001e17b313a6257b7b5081e178e81435c09d60378eColin Cross * 2011e17b313a6257b7b5081e178e81435c09d60378eColin Cross * Returns 0 on success, negative errno on error. 2021e17b313a6257b7b5081e178e81435c09d60378eColin Cross */ 2031e17b313a6257b7b5081e178e81435c09d60378eColin Crossint sparse_file_callback(struct sparse_file *s, bool sparse, bool crc, 2041e17b313a6257b7b5081e178e81435c09d60378eColin Cross int (*write)(void *priv, const void *data, int len), void *priv); 2051e17b313a6257b7b5081e178e81435c09d60378eColin Cross 2061e17b313a6257b7b5081e178e81435c09d60378eColin Cross/** 207a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * sparse_file_foreach_chunk - call a callback for data blocks in sparse file 208a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * 209a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * @s - sparse file cookie 210a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * @sparse - write in the Android sparse file format 211a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * @crc - append a crc chunk 212a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * @write - function to call for each block 213a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * @priv - value that will be passed as the first argument to write 214a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * 215a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * The function has the same behavior as 'sparse_file_callback', except it only 216a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * iterates on blocks that contain data. 217a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * 218a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht * Returns 0 on success, negative errno on error. 219a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht */ 220a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknechtint sparse_file_foreach_chunk(struct sparse_file *s, bool sparse, bool crc, 221a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht int (*write)(void *priv, const void *data, int len, unsigned int block, 222a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht unsigned int nr_blocks), 223a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht void *priv); 224a26a6bd6f36d29cdc959f746b495f79f74c7fad7Adrien Schildknecht/** 2250c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * sparse_file_read - read a file into a sparse file cookie 2260c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * 2270c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * @s - sparse file cookie 2280c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * @fd - file descriptor to read from 2290c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * @sparse - read a file in the Android sparse file format 2300c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * @crc - verify the crc of a file in the Android sparse file format 2310c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * 2320c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * Reads a file into a sparse file cookie. If sparse is true, the file is 2330c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * assumed to be in the Android sparse file format. If sparse is false, the 2340c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * file will be sparsed by looking for block aligned chunks of all zeros or 2350c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * another 32 bit value. If crc is true, the crc of the sparse file will be 2360c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * verified. 2370c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * 2380c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * Returns 0 on success, negative errno on error. 2390c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross */ 2400c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Crossint sparse_file_read(struct sparse_file *s, int fd, bool sparse, bool crc); 2410c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross 2420c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross/** 2430c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * sparse_file_import - import an existing sparse file 2440c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * 2450c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * @s - sparse file cookie 2460c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * @verbose - print verbose errors while reading the sparse file 2470c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * @crc - verify the crc of a file in the Android sparse file format 2480c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * 2490c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * Reads an existing sparse file into a sparse file cookie, recreating the same 2500c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * sparse cookie that was used to write it. If verbose is true, prints verbose 2510c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * errors when the sparse file is formatted incorrectly. 2520c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * 2530c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * Returns a new sparse file cookie on success, NULL on error. 2540c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross */ 2550c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Crossstruct sparse_file *sparse_file_import(int fd, bool verbose, bool crc); 2560c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross 2570c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross/** 2580c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * sparse_file_import_auto - import an existing sparse or normal file 2590c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * 2600c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * @fd - file descriptor to read from 2610c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * @crc - verify the crc of a file in the Android sparse file format 26280cc1f6864288f166b786a61ad57f12081114225Mohamad Ayyash * @verbose - whether to use verbose logging 2630c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * 2640c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * Reads an existing sparse or normal file into a sparse file cookie. 2650c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * Attempts to determine if the file is sparse or not by looking for the sparse 2660c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * file magic number in the first 4 bytes. If the file is not sparse, the file 2670c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * will be sparsed by looking for block aligned chunks of all zeros or another 2680c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * 32 bit value. If crc is true, the crc of the sparse file will be verified. 2690c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * 2700c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross * Returns a new sparse file cookie on success, NULL on error. 2710c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross */ 27280cc1f6864288f166b786a61ad57f12081114225Mohamad Ayyashstruct sparse_file *sparse_file_import_auto(int fd, bool crc, bool verbose); 2730c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross 274bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross/** sparse_file_resparse - rechunk an existing sparse file into smaller files 275bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross * 276bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross * @in_s - sparse file cookie of the existing sparse file 277bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross * @max_len - maximum file size 278bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross * @out_s - array of sparse file cookies 279bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross * @out_s_count - size of out_s array 280bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross * 281bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross * Splits chunks of an existing sparse file into smaller sparse files such that 282bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross * each sparse file is less than max_len. Returns the number of sparse_files 283bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross * that would have been written to out_s if out_s were big enough. 284bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross */ 285bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Crossint sparse_file_resparse(struct sparse_file *in_s, unsigned int max_len, 286bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross struct sparse_file **out_s, int out_s_count); 287bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross 2880c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross/** 289a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross * sparse_file_verbose - set a sparse file cookie to print verbose errors 290a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross * 291a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross * @s - sparse file cookie 292a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross * 293a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross * Print verbose sparse file errors whenever using the sparse file cookie. 294a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross */ 295a21930b6b0dbb04a52948566d58fb48c6db58babColin Crossvoid sparse_file_verbose(struct sparse_file *s); 296a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross 297a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross/** 298a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross * sparse_print_verbose - function called to print verbose errors 299a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross * 300a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross * By default, verbose errors will print to standard error. 301a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross * sparse_print_verbose may be overridden to log verbose errors somewhere else. 302a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross * 303a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross */ 304a21930b6b0dbb04a52948566d58fb48c6db58babColin Crossextern void (*sparse_print_verbose)(const char *fmt, ...); 305a21930b6b0dbb04a52948566d58fb48c6db58babColin Cross 306099824cce31853a0680723e70151d866416a5c78Colin Cross#ifdef __cplusplus 307099824cce31853a0680723e70151d866416a5c78Colin Cross} 308099824cce31853a0680723e70151d866416a5c78Colin Cross#endif 309099824cce31853a0680723e70151d866416a5c78Colin Cross 31028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#endif 311