diff options
author | Colin Cross <ccross@android.com> | 2012-04-25 18:31:39 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2012-07-09 22:09:37 -0700 |
commit | 9e1f17e926fa20255c5f4b4d2f68aa98a964253a (patch) | |
tree | 142907cdec91851c3e162bdfc23638df9a0d675b /libsparse/output_file.c | |
parent | b55dceea986ab24f8b836b5116b389ed619c816e (diff) | |
download | system_core-9e1f17e926fa20255c5f4b4d2f68aa98a964253a.tar.gz system_core-9e1f17e926fa20255c5f4b4d2f68aa98a964253a.tar.bz2 system_core-9e1f17e926fa20255c5f4b4d2f68aa98a964253a.zip |
libsparse: add support for including fds
Add sparse_file_add_fd to include all or part of the contents
of an fd in the output file. Will be useful for re-sparsing files
where fd will point to the input sparse file.
Change-Id: I5d4ab07fb37231e8e9c1912f62a2968c8b0a00ef
Diffstat (limited to 'libsparse/output_file.c')
-rw-r--r-- | libsparse/output_file.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/libsparse/output_file.c b/libsparse/output_file.c index f911f8cc5..4193fd17d 100644 --- a/libsparse/output_file.c +++ b/libsparse/output_file.c @@ -511,38 +511,28 @@ int write_fill_chunk(struct output_file *out, unsigned int len, return out->sparse_ops->write_fill_chunk(out, len, fill_val); } -/* 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 write_fd_chunk(struct output_file *out, unsigned int len, + int fd, int64_t offset) { int ret; int64_t aligned_offset; int aligned_diff; int buffer_size; - int file_fd = open(file, O_RDONLY | O_BINARY); - if (file_fd < 0) { - return -errno; - } - aligned_offset = offset & ~(4096 - 1); aligned_diff = offset - aligned_offset; buffer_size = len + aligned_diff; #ifndef USE_MINGW - char *data = mmap64(NULL, buffer_size, PROT_READ, MAP_SHARED, file_fd, + char *data = mmap64(NULL, buffer_size, PROT_READ, MAP_SHARED, fd, aligned_offset); if (data == MAP_FAILED) { - ret = -errno; - close(file_fd); - return ret; + return -errno; } #else char *data = malloc(buffer_size); if (!data) { - ret = -errno; - close(file_fd); - return ret; + return -errno; } memset(data, 0, buffer_size); #endif @@ -554,6 +544,23 @@ int write_file_chunk(struct output_file *out, unsigned int len, #else free(data); #endif + + return ret; +} + +/* 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; |