extract: track READONLY attribute in supported_features
authorEric Biggers <ebiggers3@gmail.com>
Wed, 6 Jan 2016 02:19:52 +0000 (20:19 -0600)
committerEric Biggers <ebiggers3@gmail.com>
Wed, 6 Jan 2016 02:19:58 +0000 (20:19 -0600)
include/wimlib/apply.h
src/extract.c
src/ntfs-3g_apply.c
src/win32_apply.c

index f36f0b3..3174482 100644 (file)
 /* These can be treated as counts (for required_features) or booleans (for
  * supported_features).  */
 struct wim_features {
-       unsigned long archive_files;
+       unsigned long readonly_files;
        unsigned long hidden_files;
        unsigned long system_files;
+       unsigned long archive_files;
        unsigned long compressed_files;
        unsigned long encrypted_files;
        unsigned long encrypted_directories;
index 532d1b1..c1a5adb 100644 (file)
@@ -1073,12 +1073,14 @@ static void
 inode_tally_features(const struct wim_inode *inode,
                     struct wim_features *features)
 {
-       if (inode->i_attributes & FILE_ATTRIBUTE_ARCHIVE)
-               features->archive_files++;
+       if (inode->i_attributes & FILE_ATTRIBUTE_READONLY)
+               features->readonly_files++;
        if (inode->i_attributes & FILE_ATTRIBUTE_HIDDEN)
                features->hidden_files++;
        if (inode->i_attributes & FILE_ATTRIBUTE_SYSTEM)
                features->system_files++;
+       if (inode->i_attributes & FILE_ATTRIBUTE_ARCHIVE)
+               features->archive_files++;
        if (inode->i_attributes & FILE_ATTRIBUTE_COMPRESSED)
                features->compressed_files++;
        if (inode->i_attributes & FILE_ATTRIBUTE_ENCRYPTED) {
@@ -1156,9 +1158,11 @@ do_feature_check(const struct wim_features *required_features,
 
        /* File attributes.  */
        if (!(extract_flags & WIMLIB_EXTRACT_FLAG_NO_ATTRIBUTES)) {
-               /* Note: Don't bother the user about FILE_ATTRIBUTE_ARCHIVE.
-                * We're an archive program, so theoretically we can do what we
-                * want with it.  */
+
+               if (required_features->readonly_files &&
+                   !supported_features->readonly_files)
+                       WARNING("Ignoring FILE_ATTRIBUTE_READONLY of %lu files",
+                               required_features->readonly_files);
 
                if (required_features->hidden_files &&
                    !supported_features->hidden_files)
@@ -1170,6 +1174,10 @@ do_feature_check(const struct wim_features *required_features,
                        WARNING("Ignoring FILE_ATTRIBUTE_SYSTEM of %lu files",
                                required_features->system_files);
 
+               /* Note: Don't bother the user about FILE_ATTRIBUTE_ARCHIVE.
+                * We're an archive program, so theoretically we can do what we
+                * want with it.  */
+
                if (required_features->compressed_files &&
                    !supported_features->compressed_files)
                        WARNING("Ignoring FILE_ATTRIBUTE_COMPRESSED of %lu files",
index ccfd6fd..4b6bc39 100644 (file)
@@ -54,9 +54,10 @@ static int
 ntfs_3g_get_supported_features(const char *target,
                               struct wim_features *supported_features)
 {
-       supported_features->archive_files             = 1;
+       supported_features->readonly_files            = 1;
        supported_features->hidden_files              = 1;
        supported_features->system_files              = 1;
+       supported_features->archive_files             = 1;
        supported_features->compressed_files          = 1;
        supported_features->not_context_indexed_files = 1;
        supported_features->named_data_streams        = 1;
index ef0823a..faacd71 100644 (file)
@@ -267,9 +267,10 @@ win32_get_supported_features(const wchar_t *target,
 
        get_vol_flags(target, &vol_flags, &short_names_supported);
 
-       supported_features->archive_files = 1;
+       supported_features->readonly_files = 1;
        supported_features->hidden_files = 1;
        supported_features->system_files = 1;
+       supported_features->archive_files = 1;
 
        if (vol_flags & FILE_FILE_COMPRESSION)
                supported_features->compressed_files = 1;