diff options
Diffstat (limited to 'lib/tar')
-rw-r--r-- | lib/tar/Makemodule.am | 3 | ||||
-rw-r--r-- | lib/tar/padd_file.c | 6 | ||||
-rw-r--r-- | lib/tar/write_header.c | 30 | ||||
-rw-r--r-- | lib/tar/write_retry.c | 35 |
4 files changed, 19 insertions, 55 deletions
diff --git a/lib/tar/Makemodule.am b/lib/tar/Makemodule.am index fe18895..7ba0454 100644 --- a/lib/tar/Makemodule.am +++ b/lib/tar/Makemodule.am @@ -3,8 +3,7 @@ libtar_a_SOURCES += lib/tar/number.c lib/tar/checksum.c lib/tar/cleanup.c libtar_a_SOURCES += lib/tar/read_sparse_map.c lib/tar/read_sparse_map_old.c libtar_a_SOURCES += lib/tar/base64.c lib/tar/urldecode.c lib/tar/internal.h libtar_a_SOURCES += lib/tar/padd_file.c lib/tar/read_retry.c include/tar.h -libtar_a_SOURCES += lib/tar/write_retry.c lib/tar/pax_header.c -libtar_a_SOURCES += lib/tar/read_sparse_map_new.c +libtar_a_SOURCES += lib/tar/pax_header.c lib/tar/read_sparse_map_new.c libtar_a_CFLAGS = $(AM_CFLAGS) libtar_a_CPPFLAGS = $(AM_CPPFLAGS) diff --git a/lib/tar/padd_file.c b/lib/tar/padd_file.c index dd945a3..1173096 100644 --- a/lib/tar/padd_file.c +++ b/lib/tar/padd_file.c @@ -10,7 +10,7 @@ #include <stdlib.h> #include <stdio.h> -int padd_file(FILE *fp, sqfs_u64 size) +int padd_file(ostream_t *fp, sqfs_u64 size) { size_t padd_sz = size % TAR_RECORD_SIZE; int status = -1; @@ -25,10 +25,8 @@ int padd_file(FILE *fp, sqfs_u64 size) if (buffer == NULL) goto fail_errno; - if (write_retry("padding output file to block size", - fp, buffer, padd_sz)) { + if (ostream_append(fp, buffer, padd_sz)) goto out; - } status = 0; out: diff --git a/lib/tar/write_header.c b/lib/tar/write_header.c index aaf9f08..3caa1b3 100644 --- a/lib/tar/write_header.c +++ b/lib/tar/write_header.c @@ -53,7 +53,7 @@ static void write_number_signed(char *dst, sqfs_s64 value, int digits) } } -static int write_header(FILE *fp, const struct stat *sb, const char *name, +static int write_header(ostream_t *fp, const struct stat *sb, const char *name, const char *slink_target, int type) { int maj = 0, min = 0; @@ -88,10 +88,10 @@ static int write_header(FILE *fp, const struct stat *sb, const char *name, update_checksum(&hdr); - return write_retry("writing tar header record", fp, &hdr, sizeof(hdr)); + return ostream_append(fp, &hdr, sizeof(hdr)); } -static int write_gnu_header(FILE *fp, const struct stat *orig, +static int write_gnu_header(ostream_t *fp, const struct stat *orig, const char *payload, size_t payload_len, int type, const char *name) { @@ -104,10 +104,8 @@ static int write_gnu_header(FILE *fp, const struct stat *orig, if (write_header(fp, &sb, name, NULL, type)) return -1; - if (write_retry("writing GNU extension header", - fp, payload, payload_len)) { + if (ostream_append(fp, payload, payload_len)) return -1; - } return padd_file(fp, payload_len); } @@ -136,7 +134,7 @@ static size_t prefix_digit_len(size_t len) return ndigit; } -static int write_schily_xattr(FILE *fp, const struct stat *orig, +static int write_schily_xattr(ostream_t *fp, const struct stat *orig, const char *name, const tar_xattr_t *xattr) { static const char *prefix = "SCHILY.xattr."; @@ -161,15 +159,20 @@ static int write_schily_xattr(FILE *fp, const struct stat *orig, len = strlen(prefix) + strlen(it->key) + it->value_len + 3; len += prefix_digit_len(len); - fprintf(fp, PRI_SZ " %s%s=", len, prefix, it->key); - fwrite(it->value, 1, it->value_len, fp); - fputc('\n', fp); + if (ostream_printf(fp, PRI_SZ " %s%s=", + len, prefix, it->key) < 0) { + return -1; + } + if (ostream_append(fp, it->value, it->value_len)) + return -1; + if (ostream_append(fp, "\n", 1)) + return -1; } return padd_file(fp, total_size); } -int write_tar_header(FILE *fp, const struct stat *sb, const char *name, +int write_tar_header(ostream_t *fp, const struct stat *sb, const char *name, const char *slink_target, const tar_xattr_t *xattr, unsigned int counter) { @@ -228,7 +231,7 @@ out_skip: return 1; } -int write_hard_link(FILE *fp, const struct stat *sb, const char *name, +int write_hard_link(ostream_t *fp, const struct stat *sb, const char *name, const char *target, unsigned int counter) { tar_header_t hdr; @@ -274,6 +277,5 @@ int write_hard_link(FILE *fp, const struct stat *sb, const char *name, write_number(hdr.devminor, 0, sizeof(hdr.devminor)); update_checksum(&hdr); - return write_retry("writing tar hard link record", - fp, &hdr, sizeof(hdr)); + return ostream_append(fp, &hdr, sizeof(hdr)); } diff --git a/lib/tar/write_retry.c b/lib/tar/write_retry.c deleted file mode 100644 index f4f3166..0000000 --- a/lib/tar/write_retry.c +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-License-Identifier: LGPL-3.0-or-later */ -/* - * write_retry.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "config.h" - -#include <errno.h> -#include <stdio.h> - -#include "tar.h" - -int write_retry(const char *errstr, FILE *fp, const void *data, size_t size) -{ - size_t ret; - - while (size > 0) { - if (feof(fp)) { - fprintf(stderr, "%s: write truncated\n", errstr); - return -1; - } - - if (ferror(fp)) { - fprintf(stderr, "%s: error writing to file\n", errstr); - return -1; - } - - ret = fwrite(data, 1, size, fp); - data = (const char *)data + ret; - size -= ret; - } - - return 0; -} |