]> wimlib.net Git - wimlib/blobdiff - src/ntfs-capture.c
Remove link_dentry()
[wimlib] / src / ntfs-capture.c
index 2c478b104bef1be1960216e4cb059f3e0e437ed7..b47f437e19e392bd8e21ac9b206dfb9b868d5136 100644 (file)
  * 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 {
@@ -87,12 +87,12 @@ static void insert_sd_node(struct sd_node *new, struct sd_node *root)
        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);
@@ -100,7 +100,7 @@ static void insert_sd_node(struct sd_node *new, struct sd_node *root)
 }
 
 /* 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)
@@ -191,7 +191,7 @@ static inline ntfschar *attr_record_name(ATTR_RECORD *ar)
        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.
@@ -250,7 +250,6 @@ static int capture_ntfs_streams(struct dentry *dentry, ntfs_inode *ni,
                                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;
@@ -272,12 +271,11 @@ static int capture_ntfs_streams(struct dentry *dentry, ntfs_inode *ni,
                                 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);
@@ -329,7 +327,7 @@ static int capture_ntfs_streams(struct dentry *dentry, ntfs_inode *ni,
                                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;
@@ -348,14 +346,14 @@ static int capture_ntfs_streams(struct dentry *dentry, ntfs_inode *ni,
                }
                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 */
@@ -366,13 +364,13 @@ static int capture_ntfs_streams(struct dentry *dentry, ntfs_inode *ni,
                                                         &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;
                }
        }
@@ -451,7 +449,7 @@ static int wim_ntfs_capture_filldir(void *dirent, const ntfschar *name,
        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)
@@ -465,7 +463,7 @@ static int wim_ntfs_capture_filldir(void *dirent, const ntfschar *name,
                                               ctx->flags);
 
        if (child)
-               link_dentry(child, ctx->parent);
+               dentry_add_child(ctx->parent, child);
 
        ntfs_inode_close(ni);
 out_free_utf8_name:
@@ -491,8 +489,6 @@ static int change_dentry_short_name(struct dentry *dentry,
        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.
@@ -511,15 +507,11 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p,
 {
        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;
@@ -531,7 +523,6 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p,
                                 path);
                return WIMLIB_ERR_NTFS_3G;
        }
-#endif
 
        if (exclude_path(path, config, false)) {
                if (flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE) {
@@ -550,7 +541,7 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p,
        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;
@@ -567,20 +558,22 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p,
                        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 */
@@ -616,41 +609,6 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p,
        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;
@@ -663,23 +621,22 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p,
                                                 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;
 }
 
@@ -701,7 +658,7 @@ static int build_dentry_tree_ntfs(struct dentry **root_p,
        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",