]> wimlib.net Git - wimlib/blobdiff - src/ntfs-capture.c
ads entries
[wimlib] / src / ntfs-capture.c
index 2c478b104bef1be1960216e4cb059f3e0e437ed7..bc7bc954c66ba6767de9871ce676a2767bf55c51 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 {
@@ -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;
@@ -329,7 +328,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->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 +347,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->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->inode->lte = lte;
                } else {
                        /* Named data stream.  Put the reference to it in the
                         * alternate data stream entries */
@@ -366,7 +365,7 @@ 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->inode, stream_name_utf8);
                        FREE(stream_name_utf8);
                        if (!new_ads_entry)
                                goto out_free_lte;
@@ -451,7 +450,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)
@@ -491,8 +490,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.
@@ -517,9 +514,6 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p,
        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 +525,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 +543,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 +560,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->inode->creation_time    = le64_to_cpu(ni->creation_time);
+       root->inode->last_write_time  = le64_to_cpu(ni->last_data_change_time);
+       root->inode->last_access_time = le64_to_cpu(ni->last_access_time);
+       root->inode->attributes       = le32_to_cpu(attributes);
+       root->inode->ino              = ni->mft_no;
+       root->inode->resolved         = true;
 
        if (attributes & FILE_ATTR_REPARSE_POINT) {
                /* Junction point, symbolic link, or other reparse point */
@@ -616,41 +611,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 +623,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->inode->security_id = sd_set_add_sd(sd_set, sd, ret);
+               if (root->inode->security_id == -1) {
                        ERROR("Out of memory");
                        return WIMLIB_ERR_NOMEM;
                }
                DEBUG("Added security ID = %u for `%s'",
-                     root->security_id, path);
+                     root->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->inode->security_id = -1;
                DEBUG("No security ID for `%s'", path);
        }
-#endif
        return ret;
 }