summaryrefslogtreecommitdiffstats
path: root/libsparse/output_file.c
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2012-04-25 18:31:39 -0700
committerColin Cross <ccross@android.com>2012-07-09 22:09:37 -0700
commit9e1f17e926fa20255c5f4b4d2f68aa98a964253a (patch)
tree142907cdec91851c3e162bdfc23638df9a0d675b /libsparse/output_file.c
parentb55dceea986ab24f8b836b5116b389ed619c816e (diff)
downloadsystem_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.c37
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;