* along with wimlib; if not, see http://www.gnu.org/licenses/.
*/
+
#include "config.h"
+
+#ifdef WITH_NTFS_3G
+#include <ntfs-3g/endians.h>
+#include <ntfs-3g/types.h>
+#endif
+
#include "wimlib_internal.h"
#include <unistd.h>
#include <errno.h>
-#if 0
-extern int ntfs_get_inode_security(ntfs_inode *ni, u32 selection, char *buf,
- u32 buflen, u32 *psize);
-
-extern u32 ntfs_get_inode_attributes(ntfs_inode *ni);
-#endif
-
/* Structure that allows searching the security descriptors by SHA1 message
* digest. */
struct sd_set {
if (cmp < 0) {
if (root->left)
insert_sd_node(new, root->left);
- else
+ else
root->left = new;
} else if (cmp > 0) {
if (root->right)
insert_sd_node(new, root->right);
- else
+ else
root->right = new;
} else {
wimlib_assert(0);
}
/* Returns the security ID of the security data having a SHA1 message digest of
- * @hash in the security descriptor index tree rooted at @root.
+ * @hash in the security descriptor index tree rooted at @root.
*
* If not found, return -1. */
static int lookup_sd(const u8 hash[SHA1_HASH_SIZE], struct sd_node *root)
return (ntfschar*)((u8*)ar + le16_to_cpu(ar->name_offset));
}
-/* Calculates the SHA1 message digest of a NTFS attribute.
+/* Calculates the SHA1 message digest of a NTFS attribute.
*
* @ni: The NTFS inode containing the attribute.
* @ar: The ATTR_RECORD describing the attribute.
ntfs_volume **ntfs_vol_p,
ATTR_TYPES type)
{
-
ntfs_attr_search_ctx *actx;
u8 attr_hash[SHA1_HASH_SIZE];
struct ntfs_location *ntfs_loc = NULL;
CASE_SENSITIVE, 0, NULL, 0, actx))
{
char *stream_name_utf8;
- size_t stream_name_utf16_len;
u32 reparse_tag;
u64 data_size = ntfs_get_attribute_value_length(actx->attr);
u64 name_length = actx->attr->name_length;
- if (data_size == 0) {
+ if (data_size == 0) {
if (errno != 0) {
ERROR_WITH_ERRNO("Failed to get size of attribute of "
"`%s'", path);
lte->ntfs_loc = ntfs_loc;
lte->resource_location = RESOURCE_IN_NTFS_VOLUME;
if (type == AT_REPARSE_POINT) {
- dentry->reparse_tag = reparse_tag;
+ dentry->d_inode->reparse_tag = reparse_tag;
ntfs_loc->is_reparse_point = true;
lte->resource_entry.original_size = data_size - 8;
lte->resource_entry.size = data_size - 8;
}
if (name_length == 0) {
/* Unnamed data stream. Put the reference to it in the
- * dentry. */
- if (dentry->lte) {
+ * dentry's inode. */
+ if (dentry->d_inode->lte) {
ERROR("Found two un-named data streams for "
"`%s'", path);
ret = WIMLIB_ERR_NTFS_3G;
goto out_free_lte;
}
- dentry->lte = lte;
+ dentry->d_inode->lte = lte;
} else {
/* Named data stream. Put the reference to it in the
* alternate data stream entries */
&stream_name_utf8_len);
if (!stream_name_utf8)
goto out_free_lte;
- new_ads_entry = dentry_add_ads(dentry, stream_name_utf8);
+ new_ads_entry = inode_add_ads(dentry->d_inode, stream_name_utf8);
FREE(stream_name_utf8);
if (!new_ads_entry)
goto out_free_lte;
wimlib_assert(new_ads_entry->stream_name_len == name_length * 2);
-
+
new_ads_entry->lte = lte;
}
}
ntfs_inode *ni = ntfs_inode_open(ctx->dir_ni->vol, mref);
if (!ni) {
ERROR_WITH_ERRNO("Failed to open NTFS inode");
- ret = 1;
+ goto out_free_utf8_name;
}
path_len = ctx->path_len;
if (path_len != 1)
ctx->flags);
if (child)
- link_dentry(child, ctx->parent);
+ dentry_add_child(ctx->parent, child);
ntfs_inode_close(ni);
out_free_utf8_name:
return 0;
}
-/*#define HAVE_NTFS_INODE_FUNCTIONS*/
-
/* Recursively build a WIM dentry tree corresponding to a NTFS volume.
* At the same time, update the WIM lookup table with lookup table entries for
* the NTFS streams, and build an array of security descriptors.
{
u32 attributes;
int mrec_flags;
- u32 sd_size = 0;
int ret;
char dos_name_utf8[64];
struct dentry *root;
mrec_flags = ni->mrec->flags;
-#ifdef HAVE_NTFS_INODE_FUNCTIONS
- attributes = ntfs_get_inode_attributes(ni);
-#else
struct SECURITY_CONTEXT ctx;
memset(&ctx, 0, sizeof(ctx));
ctx.vol = ni->vol;
path);
return WIMLIB_ERR_NTFS_3G;
}
-#endif
if (exclude_path(path, config, false)) {
if (flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE) {
if (flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE)
printf("Scanning `%s'\n", path);
- root = new_dentry(path_basename(path));
+ root = new_dentry_with_timeless_inode(path_basename(path));
if (!root)
return WIMLIB_ERR_NOMEM;
*root_p = root;
if (ret != 0)
return ret;
} else {
+ #ifdef ENODATA
if (errno != ENODATA) {
ERROR_WITH_ERRNO("Error getting DOS name "
"of `%s'", path);
return WIMLIB_ERR_NTFS_3G;
}
+ #endif
}
}
- root->creation_time = le64_to_cpu(ni->creation_time);
- root->last_write_time = le64_to_cpu(ni->last_data_change_time);
- root->last_access_time = le64_to_cpu(ni->last_access_time);
- root->attributes = le32_to_cpu(attributes);
- root->link_group_id = ni->mft_no;
- root->resolved = true;
+ root->d_inode->creation_time = le64_to_cpu(ni->creation_time);
+ root->d_inode->last_write_time = le64_to_cpu(ni->last_data_change_time);
+ root->d_inode->last_access_time = le64_to_cpu(ni->last_access_time);
+ root->d_inode->attributes = le32_to_cpu(attributes);
+ root->d_inode->ino = ni->mft_no;
+ root->d_inode->resolved = true;
if (attributes & FILE_ATTR_REPARSE_POINT) {
/* Junction point, symbolic link, or other reparse point */
if (ret != 0)
return ret;
-#ifdef HAVE_NTFS_INODE_FUNCTIONS
- ret = ntfs_get_inode_security(ni,
- OWNER_SECURITY_INFORMATION |
- GROUP_SECURITY_INFORMATION |
- DACL_SECURITY_INFORMATION |
- SACL_SECURITY_INFORMATION,
- NULL, 0, &sd_size);
- char sd[sd_size];
- ret = ntfs_get_inode_security(ni,
- OWNER_SECURITY_INFORMATION |
- GROUP_SECURITY_INFORMATION |
- DACL_SECURITY_INFORMATION |
- SACL_SECURITY_INFORMATION,
- sd, sd_size, &sd_size);
- if (ret == 0) {
- ERROR_WITH_ERRNO("Failed to get security information from "
- "`%s'", path);
- ret = WIMLIB_ERR_NTFS_3G;
- } else {
- if (ret > 0) {
- /*print_security_descriptor(sd, sd_size);*/
- root->security_id = sd_set_add_sd(sd_set, sd, ret);
- if (root->security_id == -1) {
- ERROR("Out of memory");
- return WIMLIB_ERR_NOMEM;
- }
- DEBUG("Added security ID = %u for `%s'",
- root->security_id, path);
- } else {
- root->security_id = -1;
- DEBUG("No security ID for `%s'", path);
- }
- ret = 0;
- }
-#else
char _sd[1];
char *sd = _sd;
errno = 0;
ni, dir_ni, sd, ret);
}
if (ret > 0) {
- root->security_id = sd_set_add_sd(sd_set, sd, ret);
- if (root->security_id == -1) {
+ root->d_inode->security_id = sd_set_add_sd(sd_set, sd, ret);
+ if (root->d_inode->security_id == -1) {
ERROR("Out of memory");
return WIMLIB_ERR_NOMEM;
}
DEBUG("Added security ID = %u for `%s'",
- root->security_id, path);
+ root->d_inode->security_id, path);
ret = 0;
} else if (ret < 0) {
ERROR_WITH_ERRNO("Failed to get security information from "
"`%s'", path);
ret = WIMLIB_ERR_NTFS_3G;
} else {
- root->security_id = -1;
+ root->d_inode->security_id = -1;
DEBUG("No security ID for `%s'", path);
}
-#endif
return ret;
}
ntfs_volume **ntfs_vol_p = extra_arg;
DEBUG("Mounting NTFS volume `%s' read-only", device);
-
+
vol = ntfs_mount(device, MS_RDONLY);
if (!vol) {
ERROR_WITH_ERRNO("Failed to mount NTFS volume `%s' read-only",