/* Host OS is Windows */
__LA_MODE_T mode;
- unsigned long fflags = 0;
if(file_attr & ATTR_DIRECTORY) {
mode = 0755 | AE_IFDIR;
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);
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();
+}