]> wimlib.net Git - wimlib/blobdiff - src/lookup_table.c
Support for encrypted restore
[wimlib] / src / lookup_table.c
index 89b57b4e65ee757dc0485c61903750b866319091..c6b45fed3d5d20fd3ef113a8353a8166773a2e4d 100644 (file)
@@ -89,15 +89,16 @@ clone_lookup_table_entry(const struct wim_lookup_table_entry *old)
 #ifdef __WIN32__
        case RESOURCE_WIN32:
        case RESOURCE_WIN32_ENCRYPTED:
+#else
+       case RESOURCE_IN_FILE_ON_DISK:
 #endif
 #ifdef WITH_FUSE
        case RESOURCE_IN_STAGING_FILE:
-#endif
-       case RESOURCE_IN_FILE_ON_DISK:
                BUILD_BUG_ON((void*)&old->file_on_disk !=
                             (void*)&old->staging_file_name);
-               new->staging_file_name = TSTRDUP(old->staging_file_name);
-               if (!new->staging_file_name)
+#endif
+               new->file_on_disk = TSTRDUP(old->file_on_disk);
+               if (!new->file_on_disk)
                        goto out_free;
                break;
        case RESOURCE_IN_ATTACHED_BUFFER:
@@ -144,14 +145,18 @@ free_lookup_table_entry(struct wim_lookup_table_entry *lte)
 {
        if (lte) {
                switch (lte->resource_location) {
-               case RESOURCE_IN_STAGING_FILE:
-               case RESOURCE_IN_ATTACHED_BUFFER:
-               case RESOURCE_IN_FILE_ON_DISK:
-#ifdef __WIN32__
+       #ifdef __WIN32__
                case RESOURCE_WIN32:
-#endif
+               case RESOURCE_WIN32_ENCRYPTED:
+       #else
+               case RESOURCE_IN_FILE_ON_DISK:
+       #endif
+       #ifdef WITH_FUSE
+               case RESOURCE_IN_STAGING_FILE:
                        BUILD_BUG_ON((void*)&lte->file_on_disk !=
                                     (void*)&lte->staging_file_name);
+       #endif
+               case RESOURCE_IN_ATTACHED_BUFFER:
                        BUILD_BUG_ON((void*)&lte->file_on_disk !=
                                     (void*)&lte->attached_buffer);
                        FREE(lte->file_on_disk);
@@ -668,15 +673,18 @@ print_lookup_table_entry(const struct wim_lookup_table_entry *lte, FILE *out)
 #ifdef __WIN32__
        case RESOURCE_WIN32:
        case RESOURCE_WIN32_ENCRYPTED:
-#endif
+#else
        case RESOURCE_IN_FILE_ON_DISK:
+#endif
                tfprintf(out, T("File on Disk      = `%"TS"'\n"),
                         lte->file_on_disk);
                break;
+#ifdef WITH_FUSE
        case RESOURCE_IN_STAGING_FILE:
                tfprintf(out, T("Staging File      = `%"TS"'\n"),
                                lte->staging_file_name);
                break;
+#endif
        default:
                break;
        }
@@ -857,6 +865,34 @@ inode_stream_lte(const struct wim_inode *inode, unsigned stream_idx,
                return inode_stream_lte_unresolved(inode, stream_idx, table);
 }
 
+struct wim_lookup_table_entry *
+inode_unnamed_lte_resolved(const struct wim_inode *inode)
+{
+       wimlib_assert(inode->i_resolved);
+       for (unsigned i = 0; i <= inode->i_num_ads; i++) {
+               if (inode_stream_name_nbytes(inode, i) == 0 &&
+                   !is_zero_hash(inode_stream_hash_resolved(inode, i)))
+               {
+                       return inode_stream_lte_resolved(inode, i);
+               }
+       }
+       return NULL;
+}
+
+struct wim_lookup_table_entry *
+inode_unnamed_lte_unresolved(const struct wim_inode *inode,
+                            const struct wim_lookup_table *table)
+{
+       wimlib_assert(!inode->i_resolved);
+       for (unsigned i = 0; i <= inode->i_num_ads; i++) {
+               if (inode_stream_name_nbytes(inode, i) == 0 &&
+                   !is_zero_hash(inode_stream_hash_unresolved(inode, i)))
+               {
+                       return inode_stream_lte_unresolved(inode, i, table);
+               }
+       }
+       return NULL;
+}
 
 /* Return the lookup table entry for the unnamed data stream of an inode, or
  * NULL if there is none.