Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 317a09e2 authored by Colin Cross's avatar Colin Cross
Browse files

libsparse: add sparse_file_len

Add sparse_file_len, which will compute the size of data that would
be produced if sparse_file_write was called.  Useful combined with
sparse_file_callback.

Change-Id: I1a156d1071760f5559483954a5c62ffc20298703
parent bdc6d39e
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -157,6 +157,20 @@ int sparse_file_add_fd(struct sparse_file *s,
int sparse_file_write(struct sparse_file *s, int fd, bool gz, bool sparse,
		bool crc);

/**
 * sparse_file_len - return the length of a sparse file if written to disk
 *
 * @s - sparse file cookie
 * @sparse - write in the Android sparse file format
 * @crc - append a crc chunk
 *
 * Returns the size a sparse file would be on disk if it were written in the
 * specified format.  If sparse is true, this is the size of the data in the
 * sparse format.  If sparse is false, this is the size of the normal
 * non-sparse file.
 */
int64_t sparse_file_len(struct sparse_file *s, bool sparse, bool crc);

/**
 * sparse_file_callback - call a callback for blocks in sparse file
 *
+24 −0
Original line number Diff line number Diff line
@@ -196,6 +196,30 @@ static int out_counter_write(void *priv, const void *data, int len)
	return 0;
}

int64_t sparse_file_len(struct sparse_file *s, bool sparse, bool crc)
{
	int ret;
	int chunks = sparse_count_chunks(s);
	int64_t count = 0;
	struct output_file *out;

	out = open_output_callback(out_counter_write, &count,
			s->block_size, s->len, false, sparse, chunks, crc);
	if (!out) {
		return -1;
	}

	ret = write_all_blocks(s, out);

	close_output_file(out);

	if (ret < 0) {
		return -1;
	}

	return count;
}

static struct backed_block *move_chunks_up_to_len(struct sparse_file *from,
		struct sparse_file *to, unsigned int len)
{