/*
* Copyright (C) 2012, 2013, 2014 Eric Biggers
*
- * This file is part of wimlib, a library for working with WIM files.
- *
- * wimlib is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3 of the License, or (at your option) any later
- * version.
- *
- * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * wimlib; if not, see http://www.gnu.org/licenses/.
+ * 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
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version.
+ *
+ * This file is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this file; if not, see http://www.gnu.org/licenses/.
*/
/*
# include "config.h"
#endif
-#include "wimlib/case.h"
+#include <errno.h>
+
+#include "wimlib/assert.h"
#include "wimlib/dentry.h"
+#include "wimlib/inode.h"
#include "wimlib/encoding.h"
#include "wimlib/endianness.h"
-#include "wimlib/error.h"
-#include "wimlib/lookup_table.h"
#include "wimlib/metadata.h"
#include "wimlib/paths.h"
-#include "wimlib/resource.h"
-#include "wimlib/security.h"
-#include "wimlib/sha1.h"
-#include "wimlib/timestamp.h"
-
-#include <errno.h>
/* On-disk format of a WIM dentry (directory entry), located in the metadata
* resource for a WIM image. */
* indices. For dentries that are currently linked into the tree, use
* rename_wim_path().
*
- * Returns 0 or an error code resulting from string conversion.
+ * Returns 0 or an error code resulting from a failed string conversion.
*/
int
dentry_set_name(struct wim_dentry *dentry, const tchar *name)
* Whenever possible, use dentry_full_path() instead of calling this and
* accessing _full_path directly.
*
- * Returns 0 or an error code resulting from string conversion.
+ * Returns 0 or an error code resulting from a failed string conversion.
*/
int
calculate_dentry_full_path(struct wim_dentry *dentry)
*
* On success, returns 0 and a pointer to the new, allocated dentry is stored in
* *dentry_ret. On failure, returns WIMLIB_ERR_NOMEM or an error code resulting
- * from string conversion.
+ * from a failed string conversion.
*/
int
new_dentry(const tchar *name, struct wim_dentry **dentry_ret)
ret = dentry_set_name(dentry, name);
if (ret) {
FREE(dentry);
- ERROR("Failed to set name on new dentry with name \"%"TS"\"",
- name);
return ret;
}
}
bool timeless)
{
struct wim_dentry *dentry;
+ struct wim_inode *inode;
int ret;
ret = new_dentry(name, &dentry);
return ret;
if (timeless)
- dentry->d_inode = new_timeless_inode();
+ inode = new_timeless_inode();
else
- dentry->d_inode = new_inode();
- if (dentry->d_inode == NULL) {
+ inode = new_inode();
+ if (!inode) {
free_dentry(dentry);
return WIMLIB_ERR_NOMEM;
}
- inode_add_dentry(dentry, dentry->d_inode);
+ d_associate(dentry, inode);
+
*dentry_ret = dentry;
return 0;
}
/*
* Free a WIM dentry.
*
- * In addition to freeing the dentry itself, this decrements the link count of
- * the corresponding inode (if any). If the inode's link count reaches 0, the
- * inode is freed as well.
+ * In addition to freeing the dentry itself, this disassociates the dentry from
+ * its inode. If the inode is no longer in use, it will be freed as well.
*/
void
free_dentry(struct wim_dentry *dentry)
{
if (dentry) {
+ d_disassociate(dentry);
FREE(dentry->file_name);
FREE(dentry->short_name);
FREE(dentry->_full_path);
- if (dentry->d_inode)
- put_inode(dentry->d_inode);
FREE(dentry);
}
}
/* Read the filename if present. Note: if the filename is empty, there
* is no null terminator following it. */
if (file_name_nbytes) {
- dentry->file_name = utf16le_dupz((const utf16lechar *)p,
- file_name_nbytes);
+ dentry->file_name = utf16le_dupz(p, file_name_nbytes);
if (dentry->file_name == NULL) {
ret = WIMLIB_ERR_NOMEM;
goto err_free_dentry;
/* Read the short filename if present. Note: if there is no short
* filename, there is no null terminator following it. */
if (short_name_nbytes) {
- dentry->short_name = utf16le_dupz((const utf16lechar *)p,
- short_name_nbytes);
+ dentry->short_name = utf16le_dupz(p, short_name_nbytes);
if (dentry->short_name == NULL) {
ret = WIMLIB_ERR_NOMEM;
goto err_free_dentry;