]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
RAR5 reader: use textual representation for entry file attributes
authorMartin Matuska <martin@matuska.org>
Thu, 9 May 2019 21:34:17 +0000 (23:34 +0200)
committerMartin Matuska <martin@matuska.org>
Thu, 9 May 2019 21:34:17 +0000 (23:34 +0200)
Add test_read_format_rar5_fileattr

libarchive/archive_read_support_format_rar5.c
libarchive/test/test_read_format_rar5.c
libarchive/test/test_read_format_rar5_fileattr.rar.uu [new file with mode: 0644]

index 619f94a0a3977f712841cb25cedf2672a2430899..9d3f42e6d9b5affc0c9178006c69b3806b00a544 100644 (file)
@@ -1673,7 +1673,6 @@ static int process_head_file(struct archive_read* a, struct rar5* rar,
                /* Host OS is Windows */
 
                __LA_MODE_T mode;
-               unsigned long fflags = 0;
 
                if(file_attr & ATTR_DIRECTORY) {
                        mode = 0755 | AE_IFDIR;
@@ -1687,38 +1686,33 @@ static int process_head_file(struct archive_read* a, struct rar5* rar,
 
                archive_entry_set_mode(entry, mode);
 
-#if defined(FILE_ATTRIBUTE_READONLY) || defined(UF_READONLY)
-               if (file_attr & ATTR_READONLY) {
-                       fflags |=
-#if defined(FILE_ATTRIBUTE_READONLY)
-                               FILE_ATTRIBUTE_READONLY;
-#else
-                               UF_READONLY;
-#endif
-               }
-#endif
-#if defined(FILE_ATTRIBUTE_HIDDEN) || defined(UF_HIDDEN)
-               if (file_attr & ATTR_HIDDEN) {
-                       fflags |=
-#if defined(FILE_ATTRIBUTE_HIDDEN)
-                               FILE_ATTRIBUTE_HIDDEN;
-#else
-                               UF_HIDDEN;      
-#endif
-               }
-#endif
-#if defined(FILE_ATTRIBUTE_SYSTEM) || defined(UF_SYSTEM)
-               if (file_attr & ATTR_SYSTEM) {
-                       fflags |=
-#if defined(FILE_ATTRIBUTE_SYSTEM)
-                               FILE_ATTRIBUTE_SYSTEM;
-#else
-                               UF_SYSTEM;
-#endif
+               if (file_attr & (ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM)) {
+                       char *fflags_text, *p;
+                       /* allocate for "rdonly,hidden,system," */
+                       fflags_text = malloc(22 * sizeof(char));
+                       if (fflags_text != NULL) {
+                               p = fflags_text;
+                               if (file_attr & ATTR_READONLY) {
+                                       strcpy(p, "rdonly,");
+                                       p = p + 7;
+                               }
+                               if (file_attr & ATTR_HIDDEN) {
+                                       p = strcpy(p, "hidden,");
+                                       p = p + 7;
+                               }
+                               if (file_attr & ATTR_SYSTEM) {
+                                       p = strcpy(p, "system,");
+                                       p = p + 7;
+                               }
+                               if (p > fflags_text) {
+                                       /* Delete trailing comma */
+                                       *(p - 1) = '\0';
+                                       archive_entry_copy_fflags_text(entry,
+                                           fflags_text);
+                               }
+                               free(fflags_text);
+                       }
                }
-#endif
-               if (fflags != 0)
-                       archive_entry_set_fflags(entry, fflags, 0);
        } else if(host_os == HOST_UNIX) {
                /* Host OS is Unix */
                archive_entry_set_mode(entry, (__LA_MODE_T) file_attr);
index 29af4ea61f7ad963f78770f7828662245d521c96..6e0b7a52f062740080a1aedf74c0fdffa2b4bc33 100644 (file)
@@ -1086,3 +1086,110 @@ DEFINE_TEST(test_read_format_rar5_nonempty_dir_stream)
 
        EPILOGUE();
 }
+
+DEFINE_TEST(test_read_format_rar5_fileattr)
+{
+       unsigned long set, clear, flag;
+
+       flag = 0;
+
+       PROLOGUE("test_read_format_rar5_fileattr.rar");
+
+       assertA(0 == archive_read_next_header(a, &ae));
+       assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+       assertEqualString("readonly.txt", archive_entry_pathname(ae));
+       assertEqualString("rdonly", archive_entry_fflags_text(ae));
+       archive_entry_fflags(ae, &set, &clear);
+#if defined(__FreeBSD__)
+       flag = UF_READONLY;
+#elif defined(__WIN32) && !defined(CYGWIN)
+       flag = FILE_ATTRIBUTE_READONLY;
+#endif
+       assertEqualInt(flag, set & flag);
+
+       assertA(0 == archive_read_next_header(a, &ae));
+       assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+       assertEqualString("hidden.txt", archive_entry_pathname(ae));
+       assertEqualString("hidden", archive_entry_fflags_text(ae));
+       archive_entry_fflags(ae, &set, &clear);
+#if defined(__FreeBSD__)
+       flag = UF_HIDDEN;
+#elif defined(__WIN32) && !defined(CYGWIN)
+       flag = FILE_ATTRIBUTE_HIDDEN;
+#endif
+       assertEqualInt(flag, set & flag);
+
+       assertA(0 == archive_read_next_header(a, &ae));
+       assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+       assertEqualString("system.txt", archive_entry_pathname(ae));
+       assertEqualString("system", archive_entry_fflags_text(ae));
+       archive_entry_fflags(ae, &set, &clear);
+#if defined(__FreeBSD__)
+       flag = UF_SYSTEM;;
+#elif defined(__WIN32) && !defined(CYGWIN)
+       flag = FILE_ATTRIBUTE_SYSTEM;
+#endif
+       assertEqualInt(flag, set & flag);
+
+       assertA(0 == archive_read_next_header(a, &ae));
+       assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+       assertEqualString("ro_hidden.txt", archive_entry_pathname(ae));
+       assertEqualString("rdonly,hidden", archive_entry_fflags_text(ae));
+       archive_entry_fflags(ae, &set, &clear);
+#if defined(__FreeBSD__)
+       flag = UF_READONLY | UF_HIDDEN;
+#elif defined(__WIN32) && !defined(CYGWIN)
+       flag = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN;
+#endif
+       assertEqualInt(flag, set & flag);
+
+       assertA(0 == archive_read_next_header(a, &ae));
+       assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualString("dir_readonly", archive_entry_pathname(ae));
+       assertEqualString("rdonly", archive_entry_fflags_text(ae));
+       archive_entry_fflags(ae, &set, &clear);
+#if defined(__FreeBSD__)
+       flag = UF_READONLY;
+#elif defined(__WIN32) && !defined(CYGWIN)
+       flag = FILE_ATTRIBUTE_READONLY;
+#endif
+       assertEqualInt(flag, set & flag);
+
+       assertA(0 == archive_read_next_header(a, &ae));
+       assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualString("dir_hidden", archive_entry_pathname(ae));
+       assertEqualString("hidden", archive_entry_fflags_text(ae));
+       archive_entry_fflags(ae, &set, &clear);
+#if defined(__FreeBSD__)
+       flag = UF_HIDDEN;
+#elif defined(__WIN32) && !defined(CYGWIN)
+       flag = FILE_ATTRIBUTE_HIDDEN;
+#endif
+       assertEqualInt(flag, set & flag);
+
+       assertA(0 == archive_read_next_header(a, &ae));
+       assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualString("dir_system", archive_entry_pathname(ae));
+       assertEqualString("system", archive_entry_fflags_text(ae));
+       archive_entry_fflags(ae, &set, &clear);
+#if defined(__FreeBSD__)
+       flag = UF_SYSTEM;
+#elif defined(__WIN32) && !defined(CYGWIN)
+       flag = FILE_ATTRIBUTE_SYSTEM;
+#endif
+       assertEqualInt(flag, set & flag);
+
+       assertA(0 == archive_read_next_header(a, &ae));
+       assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualString("dir_rohidden", archive_entry_pathname(ae));
+       assertEqualString("rdonly,hidden", archive_entry_fflags_text(ae));
+       archive_entry_fflags(ae, &set, &clear);
+#if defined(__FreeBSD__)
+       flag = UF_READONLY | UF_HIDDEN;
+#elif defined(__WIN32) && !defined(CYGWIN)
+       flag = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN;
+#endif
+       assertEqualInt(flag, set & flag);
+
+       EPILOGUE();
+}
diff --git a/libarchive/test/test_read_format_rar5_fileattr.rar.uu b/libarchive/test/test_read_format_rar5_fileattr.rar.uu
new file mode 100644 (file)
index 0000000..456b025
--- /dev/null
@@ -0,0 +1,13 @@
+begin 640 test_read_format_rar5_fileattr.rar
+M4F%R(1H'`0#SX8+K"P$%!P`&`0&`@(``-$;*1"@"`PN+``2+`"&+W8Z;@```
+M#')E861O;FQY+G1X=`H#`J*C5`BE!M4!,3(S-#4V-S@@#0JYZ,#-)@(#"XL`
+M!(L`(F^$/86````*:&ED9&5N+G1X=`H#`G(Q.0^E!M4!,C,T-38W.#D@#0H>
+M%_EV)@(#"XL`!(L`)"V,TBB````*<WES=&5M+G1X=`H#`F:K01.E!M4!,S0U
+M-C<X.3`@#0HQ>$42*0(#"XL`!(L`(RZ?$!V````-<F]?:&ED9&5N+G1X=`H#
+M`JIEBD2M!M4!-C<X.3`Q,C,@#0HQAL?6)@(#"P`%`!$`````@```#&1I<E]R
+M96%D;VYL>0H#`HS,%ABE!M4!Q!O^+"0"`PL`!0`2`````(````ID:7)?:&ED
+M9&5N"@,">JRV&:4&U0'&L*8=)`(#"P`%`!0`````@```"F1I<E]S>7-T96T*
+M`P(@+D4;I0;5`2YJ1$0F`@,+``4`$P````"````,9&ER7W)O:&ED9&5N"@,"
+0CW7S@JT&U0$==U91`P4$````
+`
+end