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