From 9dc6eec37c2f71cd5a9e2fc680c90f2ce73530fd Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Sat, 17 Apr 2010 21:20:13 -0400 Subject: [PATCH] Introduce a shared __archive_write_nulls() method and remove the duplicate copies of this function. SVN-Revision: 2262 --- libarchive/archive_write.c | 16 ++++++++++++ libarchive/archive_write_private.h | 1 + libarchive/archive_write_set_format_cpio.c | 13 +--------- .../archive_write_set_format_cpio_newc.c | 13 +--------- libarchive/archive_write_set_format_pax.c | 25 +++---------------- libarchive/archive_write_set_format_ustar.c | 21 ++-------------- 6 files changed, 25 insertions(+), 64 deletions(-) diff --git a/libarchive/archive_write.c b/libarchive/archive_write.c index 8c8aca57e..08d2b1ffa 100644 --- a/libarchive/archive_write.c +++ b/libarchive/archive_write.c @@ -267,6 +267,22 @@ __archive_write_output(struct archive_write *a, const void *buff, size_t length) return (__archive_write_filter(a->filter_first, buff, length)); } +int +__archive_write_nulls(struct archive_write *a, size_t length) +{ + if (length == 0) + return (ARCHIVE_OK); + + while (length > 0) { + size_t to_write = length < a->null_length ? length : a->null_length; + int r = __archive_write_output(a, a->nulls, to_write); + if (r < ARCHIVE_OK) + return (r); + length -= to_write; + } + return (ARCHIVE_OK); +} + static int archive_write_client_open(struct archive_write_filter *f) { diff --git a/libarchive/archive_write_private.h b/libarchive/archive_write_private.h index 687ff67b7..0fb447cb6 100644 --- a/libarchive/archive_write_private.h +++ b/libarchive/archive_write_private.h @@ -62,6 +62,7 @@ void __archive_write_filters_free(struct archive *); struct archive_write_filter *__archive_write_allocate_filter(struct archive *); int __archive_write_output(struct archive_write *, const void *, size_t); +int __archive_write_nulls(struct archive_write *, size_t); int __archive_write_filter(struct archive_write_filter *, const void *, size_t); int __archive_write_open_filter(struct archive_write_filter *); int __archive_write_close_filter(struct archive_write_filter *); diff --git a/libarchive/archive_write_set_format_cpio.c b/libarchive/archive_write_set_format_cpio.c index 8cbef96a1..1339f4f22 100644 --- a/libarchive/archive_write_set_format_cpio.c +++ b/libarchive/archive_write_set_format_cpio.c @@ -328,18 +328,7 @@ static int archive_write_cpio_finish_entry(struct archive_write *a) { struct cpio *cpio; - size_t to_write; - int ret; cpio = (struct cpio *)a->format_data; - ret = ARCHIVE_OK; - while (cpio->entry_bytes_remaining > 0) { - to_write = cpio->entry_bytes_remaining < a->null_length ? - cpio->entry_bytes_remaining : a->null_length; - ret = __archive_write_output(a, a->nulls, to_write); - if (ret != ARCHIVE_OK) - return (ret); - cpio->entry_bytes_remaining -= to_write; - } - return (ret); + return (__archive_write_nulls(a, cpio->entry_bytes_remaining)); } diff --git a/libarchive/archive_write_set_format_cpio_newc.c b/libarchive/archive_write_set_format_cpio_newc.c index 1049cb680..3bda18797 100644 --- a/libarchive/archive_write_set_format_cpio_newc.c +++ b/libarchive/archive_write_set_format_cpio_newc.c @@ -279,18 +279,7 @@ static int archive_write_newc_finish_entry(struct archive_write *a) { struct cpio *cpio; - size_t to_write; - int ret; cpio = (struct cpio *)a->format_data; - while (cpio->entry_bytes_remaining > 0) { - to_write = cpio->entry_bytes_remaining < a->null_length ? - cpio->entry_bytes_remaining : a->null_length; - ret = __archive_write_output(a, a->nulls, to_write); - if (ret != ARCHIVE_OK) - return (ret); - cpio->entry_bytes_remaining -= to_write; - } - ret = __archive_write_output(a, a->nulls, cpio->padding); - return (ret); + return (__archive_write_nulls(a, cpio->entry_bytes_remaining + cpio->padding)); } diff --git a/libarchive/archive_write_set_format_pax.c b/libarchive/archive_write_set_format_pax.c index 249f2b593..3992d92f5 100644 --- a/libarchive/archive_write_set_format_pax.c +++ b/libarchive/archive_write_set_format_pax.c @@ -85,7 +85,6 @@ static int has_non_ASCII(const wchar_t *); static void sparse_list_clear(struct pax *); static int sparse_list_add(struct pax *, int64_t, int64_t); static char *url_encode(const char *in); -static int write_nulls(struct archive_write *, size_t); /* * Set output format to 'restricted pax' format. @@ -1079,7 +1078,7 @@ archive_write_pax_header(struct archive_write *a, return (ARCHIVE_FATAL); } /* Pad out the end of the entry. */ - r = write_nulls(a, pax->entry_padding); + r = __archive_write_nulls(a, pax->entry_padding); if (r != ARCHIVE_OK) { /* If a write fails, we're pretty much toast. */ return (ARCHIVE_FATAL); @@ -1379,7 +1378,7 @@ build_gnu_sparse_name(char *dest, const char *src) static int archive_write_pax_close(struct archive_write *a) { - return (write_nulls(a, 512 * 2)); + return (__archive_write_nulls(a, 512 * 2)); } static int @@ -1417,27 +1416,11 @@ archive_write_pax_finish_entry(struct archive_write *a) pax->sparse_list = sb; } } - ret = write_nulls(a, remaining + pax->entry_padding); + ret = __archive_write_nulls(a, remaining + pax->entry_padding); pax->entry_bytes_remaining = pax->entry_padding = 0; return (ret); } -static int -write_nulls(struct archive_write *a, size_t padding) -{ - int ret; - size_t to_write; - - while (padding > 0) { - to_write = padding < a->null_length ? padding : a->null_length; - ret = __archive_write_output(a, a->nulls, to_write); - if (ret != ARCHIVE_OK) - return (ret); - padding -= to_write; - } - return (ARCHIVE_OK); -} - static ssize_t archive_write_pax_data(struct archive_write *a, const void *buff, size_t s) { @@ -1457,7 +1440,7 @@ archive_write_pax_data(struct archive_write *a, const void *buff, size_t s) archive_strlen(&(pax->sparse_map))); if (ret != ARCHIVE_OK) return (ret); - ret = write_nulls(a, pax->sparse_map_padding); + ret = __archive_write_nulls(a, pax->sparse_map_padding); if (ret != ARCHIVE_OK) return (ret); archive_string_empty(&(pax->sparse_map)); diff --git a/libarchive/archive_write_set_format_ustar.c b/libarchive/archive_write_set_format_ustar.c index 12de03e08..f17aa3ae1 100644 --- a/libarchive/archive_write_set_format_ustar.c +++ b/libarchive/archive_write_set_format_ustar.c @@ -151,7 +151,6 @@ static int archive_write_ustar_header(struct archive_write *, static int format_256(int64_t, char *, int); static int format_number(int64_t, char *, int size, int max, int strict); static int format_octal(int64_t, char *, int); -static int write_nulls(struct archive_write *a, size_t); /* * Set output format to 'ustar' format. @@ -522,7 +521,7 @@ format_octal(int64_t v, char *p, int s) static int archive_write_ustar_close(struct archive_write *a) { - return (write_nulls(a, 512*2)); + return (__archive_write_nulls(a, 512*2)); } static int @@ -543,28 +542,12 @@ archive_write_ustar_finish_entry(struct archive_write *a) int ret; ustar = (struct ustar *)a->format_data; - ret = write_nulls(a, + ret = __archive_write_nulls(a, ustar->entry_bytes_remaining + ustar->entry_padding); ustar->entry_bytes_remaining = ustar->entry_padding = 0; return (ret); } -static int -write_nulls(struct archive_write *a, size_t padding) -{ - int ret; - size_t to_write; - - while (padding > 0) { - to_write = padding < a->null_length ? padding : a->null_length; - ret = __archive_write_output(a, a->nulls, to_write); - if (ret != ARCHIVE_OK) - return (ret); - padding -= to_write; - } - return (ARCHIVE_OK); -} - static ssize_t archive_write_ustar_data(struct archive_write *a, const void *buff, size_t s) { -- 2.47.3