From ec67fe1ec87788368e81481ecd5a5b523fcbb17c Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Mon, 18 Jan 2010 12:55:30 -0500 Subject: [PATCH] Return proper errors from archive_read_disk_entry_from_file() if you're asked for information about a non-existent file. Update cpio to actually use this properly to report errors for nonexistent files and exit with a delayed error if there were files that could not be read. SVN-Revision: 1833 --- cpio/cpio.c | 14 +++++++---- .../archive_read_disk_entry_from_file.c | 23 +++++++++++++------ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/cpio/cpio.c b/cpio/cpio.c index 5c61fba34..7d5031bbc 100644 --- a/cpio/cpio.c +++ b/cpio/cpio.c @@ -374,7 +374,7 @@ main(int argc, char *argv[]) free_cache(cpio->gname_cache); free_cache(cpio->uname_cache); - return (0); + return (cpio->return_value); } static void @@ -564,10 +564,16 @@ file_to_archive(struct cpio *cpio, const char *srcpath) archive_entry_copy_sourcepath(entry, srcpath); r = archive_read_disk_entry_from_file(cpio->archive_read_disk, entry, -1, NULL); - if (r < ARCHIVE_WARN) - lafe_errc(1, 0, "%s", archive_error_string(cpio->archive)); + if (r < ARCHIVE_FAILED) + lafe_errc(1, 0, "%s", + archive_error_string(cpio->archive_read_disk)); if (r < ARCHIVE_OK) - lafe_warnc(0, "%s", archive_error_string(cpio->archive)); + lafe_warnc(0, "%s", + archive_error_string(cpio->archive_read_disk)); + if (r <= ARCHIVE_FAILED) { + cpio->return_value = 1; + return (r); + } if (cpio->uid_override >= 0) archive_entry_set_uid(entry, cpio->uid_override); diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index cb4e31ddf..e3795dec0 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -121,18 +121,27 @@ archive_read_disk_entry_from_file(struct archive *_a, */ #if HAVE_FSTAT if (fd >= 0) { - if (fstat(fd, &s) != 0) - return (ARCHIVE_FATAL); + if (fstat(fd, &s) != 0) { + archive_set_error(&a->archive, errno, + "Can't fstat"); + return (ARCHIVE_FAILED); + } } else #endif #if HAVE_LSTAT if (!a->follow_symlinks) { - if (lstat(path, &s) != 0) - return (ARCHIVE_FATAL); + if (lstat(path, &s) != 0) { + archive_set_error(&a->archive, errno, + "Can't lstat %s", path); + return (ARCHIVE_FAILED); + } } else #endif - if (stat(path, &s) != 0) - return (ARCHIVE_FATAL); + if (stat(path, &s) != 0) { + archive_set_error(&a->archive, errno, + "Can't lstat %s", path); + return (ARCHIVE_FAILED); + } st = &s; } archive_entry_copy_stat(entry, st); @@ -159,7 +168,7 @@ archive_read_disk_entry_from_file(struct archive *_a, if (lnklen < 0) { archive_set_error(&a->archive, errno, "Couldn't read link data"); - return (ARCHIVE_WARN); + return (ARCHIVE_FAILED); } linkbuffer[lnklen] = 0; archive_entry_set_symlink(entry, linkbuffer); -- 2.47.3