+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)
+{
+ 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);
+ tprintf(T("Integrity Info: %"TS"\n"),
+ info->has_integrity_table ? T("yes") : T("no"));
+ tprintf(T("Relative path junction: %"TS"\n"),
+ info->has_rpfix ? T("yes") : T("no"));
+ tprintf(T("Pipable: %"TS"\n"),
+ info->pipable ? T("yes") : T("no"));
+ tputchar(T('\n'));
+}
+