static void free_wimlib_dentry(struct wimlib_dir_entry *wdentry) { utf16le_put_tstr(wdentry->filename); utf16le_put_tstr(wdentry->dos_name); for (unsigned i = 1; i <= wdentry->num_named_streams; i++) utf16le_put_tstr(wdentry->streams[i].stream_name); FREE(wdentry); }
/* Restore the DOS name of the @dentry. * This closes both @ni and @dir_ni. * If either is NULL, then they are opened temporarily. */ static int ntfs_3g_restore_dos_name(ntfs_inode *ni, ntfs_inode *dir_ni, struct wim_dentry *dentry, ntfs_volume *vol) { int ret; const char *dos_name; size_t dos_name_nbytes; /* Note: ntfs_set_ntfs_dos_name() closes both inodes (even if it fails). * And it takes in a multibyte string, even though it translates it to * UTF-16LE internally... which is annoying because we currently have * the UTF-16LE string but not the multibyte string. */ ret = utf16le_get_tstr(dentry->short_name, dentry->short_name_nbytes, &dos_name, &dos_name_nbytes); if (ret) goto out_close; if (!dir_ni) dir_ni = ntfs_inode_open(vol, dentry->d_parent->d_inode->i_mft_no); if (!ni) ni = ntfs_inode_open(vol, dentry->d_inode->i_mft_no); if (dir_ni && ni) { ret = ntfs_set_ntfs_dos_name(ni, dir_ni, dos_name, dos_name_nbytes, 0); dir_ni = NULL; ni = NULL; } else { ret = -1; } utf16le_put_tstr(dos_name); if (ret) { ERROR_WITH_ERRNO("Failed to set DOS name of \"%s\" in NTFS " "volume", dentry_full_path(dentry)); ret = WIMLIB_ERR_SET_SHORT_NAME; goto out_close; } /* Unlike most other NTFS-3g functions, ntfs_set_ntfs_dos_name() * changes the directory's last modification timestamp... * Change it back. */ return ntfs_3g_restore_timestamps(vol, dentry->d_parent->d_inode); out_close: /* ntfs_inode_close() can take a NULL argument, but it's probably best * not to rely on this behavior. */ if (ni) ntfs_inode_close(ni); if (dir_ni) ntfs_inode_close(dir_ni); return ret; }