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.

Reviewed by:	brooks
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D17650
This commit is contained in:
Ed Maste 2018-10-23 13:07:03 +00:00
parent 1f3de6dce9
commit ccd8660b86
4 changed files with 15 additions and 12 deletions

View File

@ -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)

View File

@ -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)
/*

View File

@ -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));
}
}

View File

@ -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;