Dont unlink when testing !
Always preserve creation date
Disable the -p option its for modification date
Remove some cpio header debugging noise
Syncronise file listing behaviour with upstream.
diff --git a/archival/libunarchive/data_extract_all.c b/archival/libunarchive/data_extract_all.c
index c6ace2c..05bd2f0 100644
--- a/archival/libunarchive/data_extract_all.c
+++ b/archival/libunarchive/data_extract_all.c
@@ -39,6 +39,31 @@
free(name);
}
+ /* Check if the file already exists */
+ if (archive_handle->flags & ARCHIVE_EXTRACT_UNCONDITIONAL) {
+ /* Remove the existing entry if it exists */
+ if ((unlink(file_header->name) == -1) && (errno != ENOENT)) {
+ bb_perror_msg_and_die("Couldnt remove old file");
+ }
+ }
+ else if (archive_handle->flags & ARCHIVE_EXTRACT_NEWER) {
+ /* Remove the existing entry if its older than the extracted entry */
+ struct stat statbuf;
+ if ((lstat(file_header->name, &statbuf) == -1) && (errno != ENOENT)) {
+ bb_perror_msg_and_die("Couldnt stat old file");
+ }
+ if (statbuf.st_mtime <= file_header->mtime) {
+ if (!(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
+ bb_error_msg("%s not created: newer or same age file exists", file_header->name);
+ }
+ data_skip(archive_handle);
+ return;
+ }
+ if ((unlink(file_header->name) == -1) && (errno != ENOENT)) {
+ bb_perror_msg_and_die("Couldnt remove old file");
+ }
+ }
+
/* Handle hard links seperately */
if (!S_ISLNK(file_header->mode) && (file_header->link_name) && (file_header->size == 0)) {
/* hard link */