+struct lookup_table_entry *
+clone_lookup_table_entry(const struct lookup_table_entry *old)
+{
+ struct lookup_table_entry *new;
+
+ new = MALLOC(sizeof(*new));
+ if (!new)
+ return NULL;
+
+ memcpy(new, old, sizeof(*old));
+ new->extracted_file = NULL;
+ switch (new->resource_location) {
+ case RESOURCE_IN_STAGING_FILE:
+ case RESOURCE_IN_FILE_ON_DISK:
+ wimlib_assert((void*)&old->file_on_disk ==
+ (void*)&old->staging_file_name);
+ new->staging_file_name = STRDUP(old->staging_file_name);
+ if (!new->staging_file_name)
+ goto out_free;
+ break;
+ case RESOURCE_IN_ATTACHED_BUFFER:
+ new->attached_buffer = MALLOC(wim_resource_size(old));
+ if (!new->attached_buffer)
+ goto out_free;
+ memcpy(new->attached_buffer, old->attached_buffer,
+ wim_resource_size(old));
+ break;
+#ifdef WITH_NTFS_3G
+ case RESOURCE_IN_NTFS_VOLUME:
+ if (old->ntfs_loc) {
+ struct ntfs_location *loc;
+ loc = MALLOC(sizeof(*loc));
+ if (!loc)
+ goto out_free;
+ memcpy(loc, old->ntfs_loc, sizeof(*loc));
+ loc->path_utf8 = NULL;
+ loc->stream_name_utf16 = NULL;
+ new->ntfs_loc = loc;
+ loc->path_utf8 = STRDUP(old->ntfs_loc->path_utf8);
+ if (!loc->path_utf8)
+ goto out_free;
+ loc->stream_name_utf16 = MALLOC(loc->stream_name_utf16_num_chars * 2);
+ if (!loc->stream_name_utf16)
+ goto out_free;
+ memcpy(loc->stream_name_utf16,
+ old->ntfs_loc->stream_name_utf16,
+ loc->stream_name_utf16_num_chars * 2);
+ }
+ break;
+#endif
+ default:
+ break;
+ }
+ return new;
+out_free:
+ free_lookup_table_entry(new);
+ return NULL;
+}
+