X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fiterate_dir.c;h=940fc24b8e2c96d3635c6eb31e4d4b8407a1ec34;hb=38bd45bb7e08f2072e256afd5bcc21ceb0d97b8e;hp=9fed454ab6b45d63477e8ee1897820088b031eea;hpb=7bc9a01d5260f39f5d8c14a5478e3eada7d08ddd;p=wimlib diff --git a/src/iterate_dir.c b/src/iterate_dir.c index 9fed454a..940fc24b 100644 --- a/src/iterate_dir.c +++ b/src/iterate_dir.c @@ -6,7 +6,7 @@ */ /* - * Copyright (C) 2013, 2015 Eric Biggers + * Copyright (C) 2013-2016 Eric Biggers * * This file is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free @@ -31,6 +31,7 @@ #include "wimlib/dentry.h" #include "wimlib/encoding.h" #include "wimlib/metadata.h" +#include "wimlib/object_id.h" #include "wimlib/paths.h" #include "wimlib/security.h" #include "wimlib/timestamp.h" @@ -49,12 +50,11 @@ stream_to_wimlib_stream_entry(const struct wim_inode *inode, const u8 *hash; if (stream_is_named(strm)) { - size_t dummy; int ret; ret = utf16le_get_tstr(strm->stream_name, utf16le_len_bytes(strm->stream_name), - &wstream->stream_name, &dummy); + &wstream->stream_name, NULL); if (ret) return ret; } @@ -86,18 +86,19 @@ init_wimlib_dentry(struct wimlib_dir_entry *wdentry, struct wim_dentry *dentry, WIMStruct *wim, int flags) { int ret; - size_t dummy; const struct wim_inode *inode = dentry->d_inode; const struct wim_inode_stream *strm; struct wimlib_unix_data unix_data; + const void *object_id; + u32 object_id_len; ret = utf16le_get_tstr(dentry->d_name, dentry->d_name_nbytes, - &wdentry->filename, &dummy); + &wdentry->filename, NULL); if (ret) return ret; ret = utf16le_get_tstr(dentry->d_short_name, dentry->d_short_name_nbytes, - &wdentry->dos_name, &dummy); + &wdentry->dos_name, NULL); if (ret) return ret; @@ -120,15 +121,30 @@ init_wimlib_dentry(struct wimlib_dir_entry *wdentry, struct wim_dentry *dentry, wdentry->num_links = inode->i_nlink; wdentry->attributes = inode->i_attributes; wdentry->hard_link_group_id = inode->i_ino; - wdentry->creation_time = wim_timestamp_to_timespec(inode->i_creation_time); - wdentry->last_write_time = wim_timestamp_to_timespec(inode->i_last_write_time); - wdentry->last_access_time = wim_timestamp_to_timespec(inode->i_last_access_time); + + wim_timestamp_to_wimlib_timespec(inode->i_creation_time, + &wdentry->creation_time, + &wdentry->creation_time_high); + + wim_timestamp_to_wimlib_timespec(inode->i_last_write_time, + &wdentry->last_write_time, + &wdentry->last_write_time_high); + + wim_timestamp_to_wimlib_timespec(inode->i_last_access_time, + &wdentry->last_access_time, + &wdentry->last_access_time_high); + if (inode_get_unix_data(inode, &unix_data)) { wdentry->unix_uid = unix_data.uid; wdentry->unix_gid = unix_data.gid; wdentry->unix_mode = unix_data.mode; wdentry->unix_rdev = unix_data.rdev; } + object_id = inode_get_object_id(inode, &object_id_len); + if (unlikely(object_id != NULL)) { + memcpy(&wdentry->object_id, object_id, + min(object_id_len, sizeof(wdentry->object_id))); + } strm = inode_get_unnamed_stream(inode, get_default_stream_type(inode)); if (strm) { @@ -200,22 +216,12 @@ do_iterate_dir_tree(WIMStruct *wim, struct wim_dentry *child; ret = 0; - if (default_ignore_case) { - for_dentry_child_case_insensitive(child, dentry) { - ret = do_iterate_dir_tree(wim, child, - flags & ~WIMLIB_ITERATE_DIR_TREE_FLAG_CHILDREN, - cb, user_ctx); - if (ret) - break; - } - } else { - for_dentry_child(child, dentry) { - ret = do_iterate_dir_tree(wim, child, - flags & ~WIMLIB_ITERATE_DIR_TREE_FLAG_CHILDREN, - cb, user_ctx); - if (ret) - break; - } + for_dentry_child(child, dentry) { + ret = do_iterate_dir_tree(wim, child, + flags & ~WIMLIB_ITERATE_DIR_TREE_FLAG_CHILDREN, + cb, user_ctx); + if (ret) + break; } } out_free_wimlib_dentry: