X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fdentry.c;h=4ff86029e3e73967f2f752b83815bc13241dd7f8;hb=942bf22cf6306daf53df4b59ec589f8e294a57d0;hp=0e8d81f40cb798b6a05ce5866b0f1714f4008424;hpb=0541069de2f74283d44ebb02372b60fb608795f2;p=wimlib diff --git a/src/dentry.c b/src/dentry.c index 0e8d81f4..4ff86029 100644 --- a/src/dentry.c +++ b/src/dentry.c @@ -756,49 +756,37 @@ int print_dentry(struct dentry *dentry, void *lookup_table) const u8 *hash; struct lookup_table_entry *lte; const struct inode *inode = dentry->d_inode; - time_t time; - char *p; + char buf[50]; printf("[DENTRY]\n"); printf("Length = %"PRIu64"\n", dentry->length); printf("Attributes = 0x%x\n", inode->attributes); - for (unsigned i = 0; i < ARRAY_LEN(file_attr_flags); i++) + for (size_t i = 0; i < ARRAY_LEN(file_attr_flags); i++) if (file_attr_flags[i].flag & inode->attributes) printf(" FILE_ATTRIBUTE_%s is set\n", file_attr_flags[i].name); printf("Security ID = %d\n", inode->security_id); printf("Subdir offset = %"PRIu64"\n", dentry->subdir_offset); - /* Translate the timestamps into something readable */ - time = wim_timestamp_to_unix(inode->creation_time); - p = asctime(gmtime(&time)); - *(strrchr(p, '\n')) = '\0'; - printf("Creation Time = %s UTC\n", p); + wim_timestamp_to_str(inode->creation_time, buf, sizeof(buf)); + printf("Creation Time = %s\n", buf); - time = wim_timestamp_to_unix(inode->last_access_time); - p = asctime(gmtime(&time)); - *(strrchr(p, '\n')) = '\0'; - printf("Last Access Time = %s UTC\n", p); + wim_timestamp_to_str(inode->last_access_time, buf, sizeof(buf)); + printf("Last Access Time = %s\n", buf); - time = wim_timestamp_to_unix(inode->last_write_time); - p = asctime(gmtime(&time)); - *(strrchr(p, '\n')) = '\0'; - printf("Last Write Time = %s UTC\n", p); + wim_timestamp_to_str(inode->last_write_time, buf, sizeof(buf)); + printf("Last Write Time = %s\n", buf); printf("Reparse Tag = 0x%"PRIx32"\n", inode->reparse_tag); printf("Hard Link Group = 0x%"PRIx64"\n", inode->ino); printf("Hard Link Group Size = %"PRIu32"\n", inode->link_count); printf("Number of Alternate Data Streams = %hu\n", inode->num_ads); - printf("Filename = \""); - print_string(dentry->file_name, dentry->file_name_len); - puts("\""); - printf("Filename Length = %hu\n", dentry->file_name_len); printf("Filename (UTF-8) = \"%s\"\n", dentry->file_name_utf8); - printf("Filename (UTF-8) Length = %hu\n", dentry->file_name_utf8_len); - printf("Short Name = \""); + /*printf("Filename (UTF-8) Length = %hu\n", dentry->file_name_utf8_len);*/ + printf("Short Name (UTF-16LE) = \""); print_string(dentry->short_name, dentry->short_name_len); puts("\""); - printf("Short Name Length = %hu\n", dentry->short_name_len); + /*printf("Short Name Length = %hu\n", dentry->short_name_len);*/ printf("Full Path (UTF-8) = \"%s\"\n", dentry->full_path_utf8); lte = inode_stream_lte(dentry->d_inode, 0, lookup_table); if (lte) { @@ -965,8 +953,7 @@ void free_inode(struct inode *inode) * */ static void put_inode(struct inode *inode) { - wimlib_assert(inode); - wimlib_assert(inode->link_count); + wimlib_assert(inode->link_count != 0); if (--inode->link_count == 0) { #ifdef WITH_FUSE if (inode->num_opened_fds == 0) @@ -983,7 +970,6 @@ static void put_inode(struct inode *inode) */ void free_dentry(struct dentry *dentry) { - wimlib_assert(dentry != NULL); FREE(dentry->file_name); FREE(dentry->file_name_utf8); FREE(dentry->short_name); @@ -995,9 +981,7 @@ void free_dentry(struct dentry *dentry) void put_dentry(struct dentry *dentry) { - wimlib_assert(dentry != NULL); wimlib_assert(dentry->refcnt != 0); - if (--dentry->refcnt == 0) free_dentry(dentry); } @@ -1014,7 +998,7 @@ static int do_free_dentry(struct dentry *dentry, void *__lookup_table) if (lookup_table) { struct lookup_table_entry *lte; struct inode *inode = dentry->d_inode; - wimlib_assert(inode->link_count); + wimlib_assert(inode->link_count != 0); for (i = 0; i <= inode->num_ads; i++) { lte = inode_stream_lte(inode, i, lookup_table); if (lte) @@ -1138,7 +1122,15 @@ static int verify_inode(struct inode *inode, const WIMStruct *w) "%u of dentry `%s'", i, first_dentry->full_path_utf8); goto out; } - if (lte && (lte->real_refcnt += inode->link_count) > lte->refcnt) + if (lte) + lte->real_refcnt += inode->link_count; + + /* The following is now done when required by + * wim_run_full_verifications(). */ + + #if 0 + if (lte && !w->full_verification_in_progress && + lte->real_refcnt > lte->refcnt) { #ifdef ENABLE_ERROR_MESSAGES WARNING("The following lookup table entry " @@ -1152,9 +1144,9 @@ static int verify_inode(struct inode *inode, const WIMStruct *w) print_lookup_table_entry(lte); #endif /* Guess what! install.wim for Windows 8 - * contains a stream with 2 dentries referencing - * it, but the lookup table entry has reference - * count of 1. So we will need to handle this + * contains many streams referenced by more + * dentries than the refcnt stated in the lookup + * table entry. So we will need to handle this * case and not just make it be an error... I'm * just setting the reference count to the * number of references we found. @@ -1169,6 +1161,7 @@ static int verify_inode(struct inode *inode, const WIMStruct *w) goto out; #endif } + #endif } } @@ -1498,11 +1491,11 @@ out_free_ads_entries: * @offset: Offset of this directory entry in the metadata resource. * @dentry: A `struct dentry' that will be filled in by this function. * - * Return 0 on success or nonzero on failure. On failure, @dentry have been - * modified, bu it will be left with no pointers to any allocated buffers. - * On success, the dentry->length field must be examined. If zero, this was a - * special "end of directory" dentry and not a real dentry. If nonzero, this - * was a real dentry. + * Return 0 on success or nonzero on failure. On failure, @dentry will have + * been modified, but it will not be left with pointers to any allocated + * buffers. On success, the dentry->length field must be examined. If zero, + * this was a special "end of directory" dentry and not a real dentry. If + * nonzero, this was a real dentry. */ int read_dentry(const u8 metadata_resource[], u64 metadata_resource_len, u64 offset, struct dentry *dentry)