71 lines
2.2 KiB
Diff
71 lines
2.2 KiB
Diff
From 2c7a42b63913c05326cb66253960517ea0343c6a Mon Sep 17 00:00:00 2001
|
|
From: Ondrej Holy <oholy@redhat.com>
|
|
Date: Thu, 25 Feb 2021 14:10:26 +0100
|
|
Subject: [PATCH] extractor: Detect conflict also for directories
|
|
|
|
Current logic doesn't detect conflics when extracting directory. This
|
|
is ok, but only for the case when the conflic is caused by directory.
|
|
Otherwise, the conflic should be detected and AutoarExtractor should
|
|
try to delete the file before creating new directory.
|
|
---
|
|
gnome-autoar/autoar-extractor.c | 27 ++++++++-------------------
|
|
1 file changed, 8 insertions(+), 19 deletions(-)
|
|
|
|
diff --git a/gnome-autoar/autoar-extractor.c b/gnome-autoar/autoar-extractor.c
|
|
index f1f49cf..376c864 100644
|
|
--- a/gnome-autoar/autoar-extractor.c
|
|
+++ b/gnome-autoar/autoar-extractor.c
|
|
@@ -897,7 +897,6 @@ autoar_extractor_check_file_conflict (GFile *file,
|
|
mode_t extracted_filetype)
|
|
{
|
|
GFileType file_type;
|
|
- gboolean conflict = FALSE;
|
|
|
|
file_type = g_file_query_file_type (file,
|
|
G_FILE_QUERY_INFO_NONE,
|
|
@@ -907,26 +906,13 @@ autoar_extractor_check_file_conflict (GFile *file,
|
|
return FALSE;
|
|
}
|
|
|
|
- switch (extracted_filetype) {
|
|
- case AE_IFDIR:
|
|
- break;
|
|
- case AE_IFREG:
|
|
- case AE_IFLNK:
|
|
-#if defined HAVE_MKFIFO || defined HAVE_MKNOD
|
|
- case AE_IFIFO:
|
|
-#endif
|
|
-#ifdef HAVE_MKNOD
|
|
- case AE_IFSOCK:
|
|
- case AE_IFBLK:
|
|
- case AE_IFCHR:
|
|
-#endif
|
|
- conflict = TRUE;
|
|
- break;
|
|
- default:
|
|
- break;
|
|
+ /* It is not problem if the directory already exists */
|
|
+ if (file_type == G_FILE_TYPE_DIRECTORY &&
|
|
+ extracted_filetype == AE_IFDIR) {
|
|
+ return FALSE;
|
|
}
|
|
|
|
- return conflict;
|
|
+ return TRUE;
|
|
}
|
|
|
|
static void
|
|
@@ -1850,6 +1836,9 @@ autoar_extractor_step_extract (AutoarExtractor *self) {
|
|
case AUTOAR_CONFLICT_OVERWRITE:
|
|
break;
|
|
case AUTOAR_CONFLICT_CHANGE_DESTINATION:
|
|
+ /* FIXME: If the destination is changed for directory, it should be
|
|
+ * changed also for its children...
|
|
+ */
|
|
g_assert_nonnull (new_extracted_filename);
|
|
g_clear_object (&extracted_filename);
|
|
extracted_filename = new_extracted_filename;
|
|
--
|
|
2.31.1
|
|
|