From ffe34adc3f7819208a051c808d24d3655174d5b5 Mon Sep 17 00:00:00 2001 From: emaste Date: Mon, 29 Apr 2019 18:28:34 +0000 Subject: [PATCH] MFC r339648: ar: report errno on warning/error Previously ar would report an error like "ar: fatal: Write error" without including additional errno information. Change warnings and errors to include archive_errno() so that the user may have some idea of the reason for the failure. Sponsored by: The FreeBSD Foundation --- usr.bin/ar/acpyacc.y | 3 ++- usr.bin/ar/ar.h | 8 ++++---- usr.bin/ar/read.c | 7 ++++--- usr.bin/ar/write.c | 9 +++++---- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/usr.bin/ar/acpyacc.y b/usr.bin/ar/acpyacc.y index b335598c1f0..d238a21993c 100644 --- a/usr.bin/ar/acpyacc.y +++ b/usr.bin/ar/acpyacc.y @@ -254,7 +254,8 @@ arscp_open(char *fname) archive_read_support_format_ar(a); AC(archive_read_open_filename(a, fname, DEF_BLKSZ)); if ((r = archive_read_next_header(a, &entry))) - bsdar_warnc(bsdar, 0, "%s", archive_error_string(a)); + bsdar_warnc(bsdar, archive_errno(a), "%s", + archive_error_string(a)); AC(archive_read_close(a)); AC(archive_read_free(a)); if (r != ARCHIVE_OK) diff --git a/usr.bin/ar/ar.h b/usr.bin/ar/ar.h index 19668989e3c..abe74ec0365 100644 --- a/usr.bin/ar/ar.h +++ b/usr.bin/ar/ar.h @@ -52,10 +52,10 @@ /* * Convenient wrapper for general libarchive error handling. */ -#define AC(CALL) do { \ - if ((CALL)) \ - bsdar_errc(bsdar, EX_SOFTWARE, 0, "%s", \ - archive_error_string(a)); \ +#define AC(CALL) do { \ + if ((CALL)) \ + bsdar_errc(bsdar, EX_SOFTWARE, archive_errno(a), "%s", \ + archive_error_string(a)); \ } while (0) /* diff --git a/usr.bin/ar/read.c b/usr.bin/ar/read.c index 782505423d0..3dce3e6e766 100644 --- a/usr.bin/ar/read.c +++ b/usr.bin/ar/read.c @@ -96,7 +96,8 @@ read_archive(struct bsdar *bsdar, char mode) r = archive_read_next_header(a, &entry); if (r == ARCHIVE_WARN || r == ARCHIVE_RETRY || r == ARCHIVE_FATAL) - bsdar_warnc(bsdar, 0, "%s", archive_error_string(a)); + bsdar_warnc(bsdar, archive_errno(a), "%s", + archive_error_string(a)); if (r == ARCHIVE_EOF || r == ARCHIVE_FATAL) break; if (r == ARCHIVE_RETRY) { @@ -151,7 +152,7 @@ read_archive(struct bsdar *bsdar, char mode) if (r == ARCHIVE_WARN || r == ARCHIVE_RETRY || r == ARCHIVE_FATAL) { (void)fprintf(stdout, "\n"); - bsdar_warnc(bsdar, 0, "%s", + bsdar_warnc(bsdar, archive_errno(a), "%s", archive_error_string(a)); } @@ -205,7 +206,7 @@ read_archive(struct bsdar *bsdar, char mode) } if (r) - bsdar_warnc(bsdar, 0, "%s", + bsdar_warnc(bsdar, archive_errno(a), "%s", archive_error_string(a)); } } diff --git a/usr.bin/ar/write.c b/usr.bin/ar/write.c index 8862959b883..fc1746c3d33 100644 --- a/usr.bin/ar/write.c +++ b/usr.bin/ar/write.c @@ -291,12 +291,13 @@ read_objs(struct bsdar *bsdar, const char *archive, int checkargv) for (;;) { r = archive_read_next_header(a, &entry); if (r == ARCHIVE_FATAL) - bsdar_errc(bsdar, EX_DATAERR, 0, "%s", + bsdar_errc(bsdar, EX_DATAERR, archive_errno(a), "%s", archive_error_string(a)); if (r == ARCHIVE_EOF) break; if (r == ARCHIVE_WARN || r == ARCHIVE_RETRY) - bsdar_warnc(bsdar, 0, "%s", archive_error_string(a)); + bsdar_warnc(bsdar, archive_errno(a), "%s", + archive_error_string(a)); if (r == ARCHIVE_RETRY) { bsdar_warnc(bsdar, 0, "Retrying..."); continue; @@ -341,7 +342,7 @@ read_objs(struct bsdar *bsdar, const char *archive, int checkargv) bsdar_errc(bsdar, EX_SOFTWARE, errno, "malloc failed"); if (archive_read_data(a, buff, size) != (ssize_t)size) { - bsdar_warnc(bsdar, 0, "%s", + bsdar_warnc(bsdar, archive_errno(a), "%s", archive_error_string(a)); free(buff); continue; @@ -594,7 +595,7 @@ write_data(struct bsdar *bsdar, struct archive *a, const void *buf, size_t s) while (s > 0) { written = archive_write_data(a, buf, s); if (written < 0) - bsdar_errc(bsdar, EX_SOFTWARE, 0, "%s", + bsdar_errc(bsdar, EX_SOFTWARE, archive_errno(a), "%s", archive_error_string(a)); buf = (const char *)buf + written; s -= written; -- 2.45.0