summaryrefslogtreecommitdiff
path: root/libarchive/archive_read_disk_windows.c
diff options
context:
space:
mode:
authorMartin Matuska <martin@matuska.org>2019-05-09 00:06:46 +0200
committerMartin Matuska <martin@matuska.org>2019-05-09 22:15:25 +0200
commitac00875f8dbb636a714722ffed6bc9ec59039d1b (patch)
treececb3e00345e33c6cad25ebad4d119f9dbeabafc /libarchive/archive_read_disk_windows.c
parentee645d6bbfa5d1ad769865a262fd95b398919e08 (diff)
downloadlibarchive-ac00875f8dbb636a714722ffed6bc9ec59039d1b.tar.gz
Add support for Windows file attributes readonly, hidden and system
Diffstat (limited to 'libarchive/archive_read_disk_windows.c')
-rw-r--r--libarchive/archive_read_disk_windows.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/libarchive/archive_read_disk_windows.c b/libarchive/archive_read_disk_windows.c
index ff79cc05..4a5421f8 100644
--- a/libarchive/archive_read_disk_windows.c
+++ b/libarchive/archive_read_disk_windows.c
@@ -1047,6 +1047,19 @@ next_entry(struct archive_read_disk *a, struct tree *t,
}
/*
+ * File attributes
+ */
+ if ((a->flags & ARCHIVE_READDISK_NO_FFLAGS) == 0) {
+ const int supported_attrs =
+ FILE_ATTRIBUTE_READONLY |
+ FILE_ATTRIBUTE_HIDDEN |
+ FILE_ATTRIBUTE_SYSTEM;
+ DWORD file_attrs = st->dwFileAttributes & supported_attrs;
+ if (file_attrs != 0)
+ archive_entry_set_fflags(entry, file_attrs, 0);
+ }
+
+ /*
* Invoke a meta data filter callback.
*/
if (a->metadata_filter_func) {
@@ -2301,6 +2314,19 @@ archive_read_disk_entry_from_file(struct archive *_a,
archive_entry_copy_gname(entry, name);
/*
+ * File attributes
+ */
+ if ((a->flags & ARCHIVE_READDISK_NO_FFLAGS) == 0) {
+ const int supported_attrs =
+ FILE_ATTRIBUTE_READONLY |
+ FILE_ATTRIBUTE_HIDDEN |
+ FILE_ATTRIBUTE_SYSTEM;
+ DWORD file_attrs = fileAttributes & supported_attrs;
+ if (file_attrs != 0)
+ archive_entry_set_fflags(entry, file_attrs, 0);
+ }
+
+ /*
* Can this file be sparse file ?
*/
if (archive_entry_filetype(entry) != AE_IFREG