+struct print_dentry_options {
+ bool detailed;
+};
+
+static void
+print_dentry_full_path(const struct wimlib_dir_entry *dentry)
+{
+ tprintf(T("%"TS"\n"), dentry->full_path);
+}
+
+static const struct {
+ uint32_t flag;
+ const tchar *name;
+} file_attr_flags[] = {
+ {WIMLIB_FILE_ATTRIBUTE_READONLY, T("READONLY")},
+ {WIMLIB_FILE_ATTRIBUTE_HIDDEN, T("HIDDEN")},
+ {WIMLIB_FILE_ATTRIBUTE_SYSTEM, T("SYSTEM")},
+ {WIMLIB_FILE_ATTRIBUTE_DIRECTORY, T("DIRECTORY")},
+ {WIMLIB_FILE_ATTRIBUTE_ARCHIVE, T("ARCHIVE")},
+ {WIMLIB_FILE_ATTRIBUTE_DEVICE, T("DEVICE")},
+ {WIMLIB_FILE_ATTRIBUTE_NORMAL, T("NORMAL")},
+ {WIMLIB_FILE_ATTRIBUTE_TEMPORARY, T("TEMPORARY")},
+ {WIMLIB_FILE_ATTRIBUTE_SPARSE_FILE, T("SPARSE_FILE")},
+ {WIMLIB_FILE_ATTRIBUTE_REPARSE_POINT, T("REPARSE_POINT")},
+ {WIMLIB_FILE_ATTRIBUTE_COMPRESSED, T("COMPRESSED")},
+ {WIMLIB_FILE_ATTRIBUTE_OFFLINE, T("OFFLINE")},
+ {WIMLIB_FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, T("NOT_CONTENT_INDEXED")},
+ {WIMLIB_FILE_ATTRIBUTE_ENCRYPTED, T("ENCRYPTED")},
+ {WIMLIB_FILE_ATTRIBUTE_VIRTUAL, T("VIRTUAL")},
+};
+
+#define TIMESTR_MAX 100
+
+static void
+timespec_to_string(const struct timespec *spec, tchar *buf)
+{
+ time_t t = spec->tv_sec;
+ struct tm tm;
+ gmtime_r(&t, &tm);
+ tstrftime(buf, TIMESTR_MAX, T("%a %b %d %H:%M:%S %Y UTC"), &tm);
+ buf[TIMESTR_MAX - 1] = '\0';
+}
+
+static void
+print_time(const tchar *type, const struct timespec *spec)
+{
+ tchar timestr[TIMESTR_MAX];
+
+ timespec_to_string(spec, timestr);
+
+ tprintf(T("%-20"TS"= %"TS"\n"), type, timestr);
+}
+
+static void print_byte_field(const uint8_t field[], size_t len)
+{
+ while (len--)
+ tprintf(T("%02hhx"), *field++);
+}
+
+static void
+print_wim_information(const tchar *wimfile, const struct wimlib_wim_info *info)
+{
+ tchar attr_string[256];
+ tchar *p;
+
+ tputs(T("WIM Information:"));
+ tputs(T("----------------"));
+ tprintf(T("Path: %"TS"\n"), wimfile);
+ tprintf(T("GUID: 0x"));
+ print_byte_field(info->guid, sizeof(info->guid));
+ tputchar(T('\n'));
+ tprintf(T("Version: %u\n"), info->wim_version);
+ tprintf(T("Image Count: %d\n"), info->image_count);
+ tprintf(T("Compression: %"TS"\n"),
+ wimlib_get_compression_type_string(info->compression_type));
+ tprintf(T("Chunk Size: %"PRIu32" bytes\n"),
+ info->chunk_size);
+ tprintf(T("Part Number: %d/%d\n"), info->part_number, info->total_parts);
+ tprintf(T("Boot Index: %d\n"), info->boot_index);
+ tprintf(T("Size: %"PRIu64" bytes\n"), info->total_bytes);
+
+ attr_string[0] = T('\0');
+
+ if (info->pipable)
+ tstrcat(attr_string, T("Pipable, "));
+
+ if (info->has_integrity_table)
+ tstrcat(attr_string, T("Integrity info, "));
+
+ if (info->has_rpfix)
+ tstrcat(attr_string, T("Relative path junction, "));
+
+ if (info->resource_only)
+ tstrcat(attr_string, T("Resource only, "));
+
+ if (info->metadata_only)
+ tstrcat(attr_string, T("Metadata only, "));
+
+ if (info->is_marked_readonly)
+ tstrcat(attr_string, T("Readonly, "));
+
+ p = tstrchr(attr_string, T('\0'));
+ if (p >= &attr_string[2] && p[-1] == T(' ') && p[-2] == T(','))
+ p[-2] = T('\0');
+
+ tprintf(T("Attributes: %"TS"\n\n"), attr_string);
+}
+