- if (dentry_is_symlink(dentry)) {
- ret = extract_symlink(dentry, output_path, w);
- } else if (dentry_is_directory(dentry)) {
- ret = extract_directory(output_path);
- } else {
- ret = extract_regular_file(w, dentry, args->output_dir,
- output_path, extract_flags);
+ if (dentry_is_symlink(dentry))
+ return extract_symlink(dentry, output_path, w);
+ else if (dentry_is_directory(dentry))
+ return extract_directory(output_path, dentry_is_root(dentry));
+ else
+ return extract_regular_file(w, dentry, args->output_dir,
+ output_path, extract_flags);
+}
+
+/* Apply timestamp to extracted file */
+static int apply_dentry_timestamps(struct dentry *dentry, void *arg)
+{
+ struct extract_args *args = arg;
+ size_t len = strlen(args->output_dir);
+ char output_path[len + dentry->full_path_utf8_len + 1];
+
+ memcpy(output_path, args->output_dir, len);
+ memcpy(output_path + len, dentry->full_path_utf8, dentry->full_path_utf8_len);
+ output_path[len + dentry->full_path_utf8_len] = '\0';
+
+ struct timeval tv[2];
+ wim_timestamp_to_timeval(dentry->d_inode->last_access_time, &tv[0]);
+ wim_timestamp_to_timeval(dentry->d_inode->last_write_time, &tv[1]);
+ if (lutimes(output_path, tv) != 0) {
+ WARNING("Failed to set timestamp on file `%s': %s",
+ output_path, strerror(errno));