]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Return proper errors from archive_read_disk_entry_from_file() if
authorTim Kientzle <kientzle@gmail.com>
Mon, 18 Jan 2010 17:55:30 +0000 (12:55 -0500)
committerTim Kientzle <kientzle@gmail.com>
Mon, 18 Jan 2010 17:55:30 +0000 (12:55 -0500)
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
libarchive/archive_read_disk_entry_from_file.c

index 5c61fba3451e0f7991eddecfe3e92cea5c1bbd01..7d5031bbcd8fc7477048947e717416547133ea93 100644 (file)
@@ -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);
index cb4e31ddf0e23272a029d442e6784fb6edfa6e45..e3795dec0a449d5422de4b448d401fcba66cd9e7 100644 (file)
@@ -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);