X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fresource.c;h=f7a7916e5f0cc0ed94bcae2b30673b500f80db4b;hb=d3a6c0b6414f880a9cea4d8655570d9f556f319d;hp=167901c9f7ae79f00398617a90f624a17bba60b1;hpb=67f45cecd793345416d5d85fbe37ec54b1bb6ef8;p=wimlib diff --git a/src/resource.c b/src/resource.c index 167901c9..f7a7916e 100644 --- a/src/resource.c +++ b/src/resource.c @@ -1013,7 +1013,7 @@ int extract_wim_resource_to_fd(const struct lookup_table_entry *lte, int fd, if (ret != 0) break; sha1_update(&ctx, buf, to_read); - if (full_write(fd, buf, to_read) < 0) { + if (full_write(fd, buf, to_read) < to_read) { ERROR_WITH_ERRNO("Error extracting WIM resource"); return WIMLIB_ERR_WRITE; } @@ -1092,8 +1092,8 @@ int write_dentry_resources(struct dentry *dentry, void *wim_p) printf("Writing streams for `%s'\n", dentry->full_path_utf8); } - for (unsigned i = 0; i <= dentry->inode->num_ads; i++) { - lte = inode_stream_lte(dentry->inode, i, w->lookup_table); + for (unsigned i = 0; i <= dentry->d_inode->num_ads; i++) { + lte = inode_stream_lte(dentry->d_inode, i, w->lookup_table); if (lte && ++lte->out_refcnt == 1) { ret = write_wim_resource(lte, w->out_fp, ctype, <e->output_resource_entry); @@ -1128,7 +1128,7 @@ int read_metadata_resource(WIMStruct *w, struct image_metadata *imd) u32 dentry_offset; int ret; struct dentry *dentry; - struct inode_table *inode_tab; + struct inode_table inode_tab; const struct lookup_table_entry *metadata_lte; u64 metadata_len; u64 metadata_offset; @@ -1204,6 +1204,7 @@ int read_metadata_resource(WIMStruct *w, struct image_metadata *imd) dentry->prev = dentry; if (ret != 0) goto out_free_dentry_tree; + inode_add_dentry(dentry, dentry->d_inode); /* Now read the entire directory entry tree into memory. */ DEBUG("Reading dentry tree"); @@ -1219,25 +1220,28 @@ int read_metadata_resource(WIMStruct *w, struct image_metadata *imd) /* Build hash table that maps hard link group IDs to dentry sets */ DEBUG("Building link group table"); - inode_tab = new_inode_table(9001); - if (!inode_tab) + ret = init_inode_table(&inode_tab, 9001); + if (ret != 0) goto out_free_dentry_tree; - for_dentry_in_tree(dentry, inode_table_insert, inode_tab); - DEBUG("Fixing inconsistencies in the link groups"); - ret = fix_inodes(inode_tab, &inode_list); - free_inode_table(inode_tab); + for_dentry_in_tree(dentry, inode_table_insert, &inode_tab); + + DEBUG("Fixing inconsistencies in the hard link groups"); + ret = fix_inodes(&inode_tab, &inode_list); + destroy_inode_table(&inode_tab); if (ret != 0) goto out_free_dentry_tree; DEBUG("Running miscellaneous verifications on the dentry tree"); + for_lookup_table_entry(w->lookup_table, lte_zero_real_refcnt, NULL); ret = for_dentry_in_tree(dentry, verify_dentry, w); if (ret != 0) goto out_free_dentry_tree; DEBUG("Done reading image metadata"); - imd->root_dentry = dentry; + imd->root_dentry = dentry; + imd->inode_list = inode_list; goto out_free_buf; out_free_dentry_tree: free_dentry_tree(dentry, NULL); @@ -1330,8 +1334,9 @@ int write_metadata_resource(WIMStruct *w) if (ret != 0) goto out; - /* It's very likely the SHA1 message digest of the metadata resource, so - * re-insert the lookup table entry into the lookup table. */ + /* It's very likely the SHA1 message digest of the metadata resource + * changed, so re-insert the lookup table entry into the lookup table. + * */ lookup_table_unlink(w->lookup_table, lte); lookup_table_insert(w->lookup_table, lte);