]> wimlib.net Git - wimlib/blobdiff - src/lookup_table.c
w -> wim
[wimlib] / src / lookup_table.c
index ba832453e6750517aba7b98014426329db594ba5..d155ceb0dfece101c11b55654ee57d754d9461a9 100644 (file)
@@ -375,7 +375,7 @@ struct wim_lookup_table_entry_disk {
  * image_metadata array).
  */
 int
-read_lookup_table(WIMStruct *w)
+read_lookup_table(WIMStruct *wim)
 {
        int ret;
        size_t num_entries;
@@ -393,16 +393,16 @@ read_lookup_table(WIMStruct *w)
        const struct wim_lookup_table_entry_disk *disk_entry;
 
        DEBUG("Reading lookup table: offset %"PRIu64", size %"PRIu64"",
-             w->hdr.lookup_table_res_entry.offset,
-             w->hdr.lookup_table_res_entry.original_size);
+             wim->hdr.lookup_table_res_entry.offset,
+             wim->hdr.lookup_table_res_entry.original_size);
 
-       if (resource_is_compressed(&w->hdr.lookup_table_res_entry)) {
+       if (resource_is_compressed(&wim->hdr.lookup_table_res_entry)) {
                ERROR("Didn't expect a compressed lookup table!");
                ERROR("Ask the author to implement support for this.");
                return WIMLIB_ERR_COMPRESSED_LOOKUP_TABLE;
        }
 
-       num_entries = w->hdr.lookup_table_res_entry.size /
+       num_entries = wim->hdr.lookup_table_res_entry.size /
                      sizeof(struct wim_lookup_table_entry_disk);
        table = new_lookup_table(num_entries * 2 + 1);
        if (!table) {
@@ -411,8 +411,8 @@ read_lookup_table(WIMStruct *w)
                return WIMLIB_ERR_NOMEM;
        }
 
-       w->current_image = 0;
-       offset = w->hdr.lookup_table_res_entry.offset;
+       wim->current_image = 0;
+       offset = wim->hdr.lookup_table_res_entry.offset;
        buf_entries_remaining = 0;
        for (; num_entries != 0;
             num_entries--, buf_entries_remaining--, disk_entry++)
@@ -422,7 +422,7 @@ read_lookup_table(WIMStruct *w)
 
                        entries_to_read = min(ARRAY_LEN(table_buf), num_entries);
                        bytes_to_read = entries_to_read * sizeof(struct wim_lookup_table_entry_disk);
-                       if (full_pread(w->in_fd, table_buf,
+                       if (full_pread(wim->in_fd, table_buf,
                                       bytes_to_read, offset) != bytes_to_read)
                        {
                                ERROR_WITH_ERRNO("Error reading lookup table "
@@ -440,7 +440,7 @@ read_lookup_table(WIMStruct *w)
                        goto out_free_lookup_table;
                }
 
-               cur_entry->wim = w;
+               cur_entry->wim = wim;
                cur_entry->resource_location = RESOURCE_IN_WIM;
                get_resource_entry(&disk_entry->resource_entry, &cur_entry->resource_entry);
                cur_entry->part_number = le16_to_cpu(disk_entry->part_number);
@@ -448,14 +448,14 @@ read_lookup_table(WIMStruct *w)
                copy_hash(cur_entry->hash, disk_entry->hash);
 
                if (cur_entry->resource_entry.flags & WIM_RESHDR_FLAG_COMPRESSED)
-                       cur_entry->compression_type = w->compression_type;
+                       cur_entry->compression_type = wim->compression_type;
                else
                        BUILD_BUG_ON(WIMLIB_COMPRESSION_TYPE_NONE != 0);
 
-               if (cur_entry->part_number != w->hdr.part_number) {
+               if (cur_entry->part_number != wim->hdr.part_number) {
                        WARNING("A lookup table entry in part %hu of the WIM "
                                "points to part %hu (ignoring it)",
-                               w->hdr.part_number, cur_entry->part_number);
+                               wim->hdr.part_number, cur_entry->part_number);
                        free_lookup_table_entry(cur_entry);
                        continue;
                }
@@ -500,17 +500,17 @@ read_lookup_table(WIMStruct *w)
                                goto out_free_cur_entry;
                        }
 
-                       if (w->hdr.part_number != 1) {
+                       if (wim->hdr.part_number != 1) {
                                WARNING("Ignoring metadata resource found in a "
                                        "non-first part of the split WIM");
                                free_lookup_table_entry(cur_entry);
                                continue;
                        }
-                       if (w->current_image == w->hdr.image_count) {
+                       if (wim->current_image == wim->hdr.image_count) {
                                WARNING("The WIM header says there are %u images "
                                        "in the WIM, but we found more metadata "
                                        "resources than this (ignoring the extra)",
-                                       w->hdr.image_count);
+                                       wim->hdr.image_count);
                                free_lookup_table_entry(cur_entry);
                                continue;
                        }
@@ -524,10 +524,10 @@ read_lookup_table(WIMStruct *w)
                         * written in the XML data. */
                        DEBUG("Found metadata resource for image %u at "
                              "offset %"PRIu64".",
-                             w->current_image + 1,
+                             wim->current_image + 1,
                              cur_entry->resource_entry.offset);
-                       w->image_metadata[
-                               w->current_image++]->metadata_lte = cur_entry;
+                       wim->image_metadata[
+                               wim->current_image++]->metadata_lte = cur_entry;
                } else {
                        /* Lookup table entry for a stream that is not a
                         * metadata resource */
@@ -549,16 +549,18 @@ read_lookup_table(WIMStruct *w)
                }
        }
 
-       if (w->hdr.part_number == 1 && w->current_image != w->hdr.image_count)
-       {
-               ERROR("The WIM header says there are %u images "
-                     "in the WIM, but we only found %d metadata "
-                     "resources!", w->hdr.image_count, w->current_image);
-               ret = WIMLIB_ERR_IMAGE_COUNT;
-               goto out_free_lookup_table;
+       if (wim->hdr.part_number == 1 && wim->current_image != wim->hdr.image_count) {
+               WARNING("The header of \"%"TS"\" says there are %u images in\n"
+                       "          the WIM, but we only found %d metadata resources!  Acting as if\n"
+                       "          the header specified only %d images instead.",
+                       wim->filename, wim->hdr.image_count,
+                       wim->current_image, wim->current_image);
+               for (int i = wim->current_image; i < wim->hdr.image_count; i++)
+                       put_image_metadata(wim->image_metadata[i], NULL);
+               wim->hdr.image_count = wim->current_image;
        }
        DEBUG("Done reading lookup table.");
-       w->lookup_table = table;
+       wim->lookup_table = table;
        ret = 0;
        goto out;
 out_free_cur_entry:
@@ -566,7 +568,7 @@ out_free_cur_entry:
 out_free_lookup_table:
        free_lookup_table(table);
 out:
-       w->current_image = 0;
+       wim->current_image = 0;
        return ret;
 }
 
@@ -644,7 +646,7 @@ append_lookup_table_entry(struct wim_lookup_table_entry *lte, void *_list)
 
 /* Writes the WIM lookup table to the output file. */
 int
-write_lookup_table(WIMStruct *w, int image, struct resource_entry *out_res_entry)
+write_lookup_table(WIMStruct *wim, int image, struct resource_entry *out_res_entry)
 {
        LIST_HEAD(stream_list);
        int start_image;
@@ -652,7 +654,7 @@ write_lookup_table(WIMStruct *w, int image, struct resource_entry *out_res_entry
 
        if (image == WIMLIB_ALL_IMAGES) {
                start_image = 1;
-               end_image = w->hdr.image_count;
+               end_image = wim->hdr.image_count;
        } else {
                start_image = image;
                end_image = image;
@@ -661,16 +663,16 @@ write_lookup_table(WIMStruct *w, int image, struct resource_entry *out_res_entry
        for (int i = start_image; i <= end_image; i++) {
                struct wim_lookup_table_entry *metadata_lte;
 
-               metadata_lte = w->image_metadata[i - 1]->metadata_lte;
+               metadata_lte = wim->image_metadata[i - 1]->metadata_lte;
                metadata_lte->out_refcnt = 1;
                metadata_lte->output_resource_entry.flags |= WIM_RESHDR_FLAG_METADATA;
                append_lookup_table_entry(metadata_lte, &stream_list);
        }
-       for_lookup_table_entry(w->lookup_table,
+       for_lookup_table_entry(wim->lookup_table,
                               append_lookup_table_entry,
                               &stream_list);
        return write_lookup_table_from_stream_list(&stream_list,
-                                                  w->out_fd,
+                                                  wim->out_fd,
                                                   out_res_entry);
 }
 
@@ -765,6 +767,58 @@ print_lookup_table_entry(const struct wim_lookup_table_entry *lte, FILE *out)
        tputc(T('\n'), out);
 }
 
+void
+lte_to_wimlib_resource_entry(const struct wim_lookup_table_entry *lte,
+                            struct wimlib_resource_entry *wentry)
+{
+       wentry->uncompressed_size = lte->resource_entry.original_size;
+       wentry->compressed_size = lte->resource_entry.size;
+       wentry->offset = lte->resource_entry.offset;
+       copy_hash(wentry->sha1_hash, lte->hash);
+       wentry->part_number = lte->part_number;
+       wentry->reference_count = lte->refcnt;
+       wentry->is_compressed = (lte->resource_entry.flags & WIM_RESHDR_FLAG_COMPRESSED) != 0;
+       wentry->is_metadata = (lte->resource_entry.flags & WIM_RESHDR_FLAG_METADATA) != 0;
+       wentry->is_free = (lte->resource_entry.flags & WIM_RESHDR_FLAG_FREE) != 0;
+       wentry->is_spanned = (lte->resource_entry.flags & WIM_RESHDR_FLAG_SPANNED) != 0;
+}
+
+struct iterate_lte_context {
+       wimlib_iterate_lookup_table_callback_t cb;
+       void *user_ctx;
+};
+
+static int
+do_iterate_lte(struct wim_lookup_table_entry *lte, void *_ctx)
+{
+       struct iterate_lte_context *ctx = _ctx;
+       struct wimlib_resource_entry entry;
+
+       lte_to_wimlib_resource_entry(lte, &entry);
+       return (*ctx->cb)(&entry, ctx->user_ctx);
+}
+
+WIMLIBAPI int
+wimlib_iterate_lookup_table(WIMStruct *wim, int flags,
+                           wimlib_iterate_lookup_table_callback_t cb,
+                           void *user_ctx)
+{
+       struct iterate_lte_context ctx = {
+               .cb = cb,
+               .user_ctx = user_ctx,
+       };
+       if (wim->hdr.part_number == 1) {
+               int ret;
+               for (int i = 0; i < wim->hdr.image_count; i++) {
+                       ret = do_iterate_lte(wim->image_metadata[i]->metadata_lte,
+                                            &ctx);
+                       if (ret)
+                               return ret;
+               }
+       }
+       return for_lookup_table_entry(wim->lookup_table, do_iterate_lte, &ctx);
+}
+
 static int
 do_print_lookup_table_entry(struct wim_lookup_table_entry *lte, void *fp)
 {
@@ -773,7 +827,7 @@ do_print_lookup_table_entry(struct wim_lookup_table_entry *lte, void *fp)
 }
 
 /*
- * Prints the lookup table of a WIM file.
+ * Deprecated
  */
 WIMLIBAPI void
 wimlib_print_lookup_table(WIMStruct *wim)
@@ -812,7 +866,7 @@ __lookup_resource(const struct wim_lookup_table *table, const u8 hash[])
  * This is only for pre-resolved inodes.
  */
 int
-lookup_resource(WIMStruct *w,
+lookup_resource(WIMStruct *wim,
                const tchar *path,
                int lookup_flags,
                struct wim_dentry **dentry_ret,
@@ -834,7 +888,7 @@ lookup_resource(WIMStruct *w,
                }
        }
 
-       dentry = get_dentry(w, path);
+       dentry = get_dentry(wim, path);
        if (p)
                *p = T(':');
        if (!dentry)
@@ -843,7 +897,7 @@ lookup_resource(WIMStruct *w,
        inode = dentry->d_inode;
 
        if (!inode->i_resolved)
-               if (inode_resolve_ltes(inode, w->lookup_table))
+               if (inode_resolve_ltes(inode, wim->lookup_table))
                        return -EIO;
 
        if (!(lookup_flags & LOOKUP_FLAG_DIRECTORY_OK)
@@ -1115,4 +1169,3 @@ hash_unhashed_stream(struct wim_lookup_table_entry *lte,
                *lte_ret = lte;
        return 0;
 }
-