]> wimlib.net Git - wimlib/blobdiff - src/ntfs-apply.c
Fix up calculation of image XML statistics
[wimlib] / src / ntfs-apply.c
index 5e36469f4b41ac75a64688ca5cbafbd7bf76377e..d6271f79094795d12a4788ee646f8aca0be814a0 100644 (file)
@@ -54,13 +54,6 @@ struct ntfs_apply_args {
        WIMStruct *w;
 };
 
-
-#if 0
-extern int ntfs_set_inode_security(ntfs_inode *ni, u32 selection,
-                                  const char *attr);
-extern int ntfs_set_inode_attributes(ntfs_inode *ni, u32 attrib);
-#endif
-
 /* 
  * Extracts a WIM resource to a NTFS attribute.
  */
@@ -116,7 +109,7 @@ static int write_ntfs_data_streams(ntfs_inode *ni, const struct dentry *dentry,
        unsigned stream_idx = 0;
        ntfschar *stream_name = AT_UNNAMED;
        u32 stream_name_len = 0;
-       const struct inode *inode = dentry->inode;
+       const struct inode *inode = dentry->d_inode;
 
        DEBUG("Writing %u NTFS data stream%s for `%s'",
              inode->num_ads + 1,
@@ -162,8 +155,8 @@ static int write_ntfs_data_streams(ntfs_inode *ni, const struct dentry *dentry,
                }
                if (stream_idx == inode->num_ads)
                        break;
-               stream_name = (ntfschar*)inode->ads_entries[stream_idx]->stream_name;
-               stream_name_len = inode->ads_entries[stream_idx]->stream_name_len / 2;
+               stream_name = (ntfschar*)inode->ads_entries[stream_idx].stream_name;
+               stream_name_len = inode->ads_entries[stream_idx].stream_name_len / 2;
                stream_idx++;
        }
        return ret;
@@ -241,8 +234,6 @@ static int wim_apply_hardlink_ntfs(const struct dentry *from_dentry,
        return ret;
 }
 
-/*#define HAVE_NTFS_INODE_FUNCTIONS*/
-
 static int
 apply_file_attributes_and_security_data(ntfs_inode *ni,
                                        ntfs_inode *dir_ni,
@@ -250,47 +241,35 @@ apply_file_attributes_and_security_data(ntfs_inode *ni,
                                        const WIMStruct *w)
 {
        DEBUG("Setting NTFS file attributes on `%s' to %#"PRIx32,
-             dentry->full_path_utf8, dentry->inode->attributes);
+             dentry->full_path_utf8, dentry->d_inode->attributes);
        int ret;
-#ifdef HAVE_NTFS_INODE_FUNCTIONS
-       ret = ntfs_set_inode_attributes(ni, dentry->inode->attributes);
-#else
        struct SECURITY_CONTEXT ctx;
        u32 attributes_le32;
-       attributes_le32 = cpu_to_le32(dentry->inode->attributes);
+       attributes_le32 = cpu_to_le32(dentry->d_inode->attributes);
        memset(&ctx, 0, sizeof(ctx));
        ctx.vol = ni->vol;
        ret = ntfs_xattr_system_setxattr(&ctx, XATTR_NTFS_ATTRIB,
                                         ni, dir_ni,
                                         (const char*)&attributes_le32,
                                         sizeof(u32), 0);
-#endif
        if (ret != 0) {
                ERROR("Failed to set NTFS file attributes on `%s'",
                       dentry->full_path_utf8);
                return WIMLIB_ERR_NTFS_3G;
        }
-       if (dentry->inode->security_id != -1) {
+       if (dentry->d_inode->security_id != -1) {
                const struct wim_security_data *sd;
                const char *descriptor;
                
                sd = wim_const_security_data(w);
-               wimlib_assert(dentry->inode->security_id < sd->num_entries);
-               descriptor = sd->descriptors[dentry->inode->security_id];
+               wimlib_assert(dentry->d_inode->security_id < sd->num_entries);
+               descriptor = sd->descriptors[dentry->d_inode->security_id];
                DEBUG("Applying security descriptor %d to `%s'",
-                     dentry->inode->security_id, dentry->full_path_utf8);
-
-       #ifdef HAVE_NTFS_INODE_FUNCTIONS
-               u32 selection = OWNER_SECURITY_INFORMATION |
-                               GROUP_SECURITY_INFORMATION |
-                               DACL_SECURITY_INFORMATION  |
-                               SACL_SECURITY_INFORMATION;
-               ret = ntfs_set_inode_security(ni, selection, descriptor);
-       #else
+                     dentry->d_inode->security_id, dentry->full_path_utf8);
+
                ret = ntfs_xattr_system_setxattr(&ctx, XATTR_NTFS_ACL,
                                                 ni, dir_ni, descriptor,
-                                                sd->sizes[dentry->inode->security_id], 0);
-       #endif
+                                                sd->sizes[dentry->d_inode->security_id], 0);
                                
                if (ret != 0) {
                        ERROR_WITH_ERRNO("Failed to set security data on `%s'",
@@ -307,9 +286,9 @@ static int apply_reparse_data(ntfs_inode *ni, const struct dentry *dentry,
        struct lookup_table_entry *lte;
        int ret = 0;
 
-       wimlib_assert(dentry->inode->attributes & FILE_ATTRIBUTE_REPARSE_POINT);
+       wimlib_assert(dentry->d_inode->attributes & FILE_ATTRIBUTE_REPARSE_POINT);
 
-       lte = inode_unnamed_lte(dentry->inode, w->lookup_table);
+       lte = inode_unnamed_lte(dentry->d_inode, w->lookup_table);
 
        DEBUG("Applying reparse data to `%s'", dentry->full_path_utf8);
 
@@ -327,7 +306,7 @@ static int apply_reparse_data(ntfs_inode *ni, const struct dentry *dentry,
 
        u8 reparse_data_buf[8 + wim_resource_size(lte)];
        u8 *p = reparse_data_buf;
-       p = put_u32(p, dentry->inode->reparse_tag); /* ReparseTag */
+       p = put_u32(p, dentry->d_inode->reparse_tag); /* ReparseTag */
        p = put_u16(p, wim_resource_size(lte)); /* ReparseDataLength */
        p = put_u16(p, 0); /* Reserved */
 
@@ -364,7 +343,7 @@ static int preapply_dentry_with_dos_name(struct dentry *dentry,
        struct dentry *dentry_with_dos_name;
 
        dentry_with_dos_name = NULL;
-       inode_for_each_dentry(other, dentry->inode) {
+       inode_for_each_dentry(other, dentry->d_inode) {
                if (other != dentry && (dentry->parent == other->parent)
                    && other->short_name_len)
                {
@@ -378,9 +357,7 @@ static int preapply_dentry_with_dos_name(struct dentry *dentry,
                }
        }
        /* If there's a dentry with a DOS name, extract it first */
-       if (dentry_with_dos_name
-           && !dentry_with_dos_name->inode->extracted_file)
-       {
+       if (dentry_with_dos_name && !dentry_is_extracted(dentry)) {
                char *p;
                const char *dir_name;
                char orig;
@@ -430,7 +407,8 @@ static int do_wim_apply_dentry_ntfs(struct dentry *dentry, ntfs_inode *dir_ni,
        ntfs_inode *ni = NULL;
        bool is_hardlink = false;
        ntfs_volume *vol = dir_ni->vol;
-       struct inode *inode = dentry->inode;
+       struct inode *inode = dentry->d_inode;
+       dentry->is_extracted = true;
 
        if (inode->attributes & FILE_ATTRIBUTE_DIRECTORY) {
                type = S_IFDIR;
@@ -464,8 +442,10 @@ static int do_wim_apply_dentry_ntfs(struct dentry *dentry, ntfs_inode *dir_ni,
                        /* Can't make a hard link; extract the file itself */
                        FREE(inode->extracted_file);
                        inode->extracted_file = STRDUP(dentry->full_path_utf8);
-                       if (!inode->extracted_file)
-                               return WIMLIB_ERR_NOMEM;
+                       if (!inode->extracted_file) {
+                               ret = WIMLIB_ERR_NOMEM;
+                               goto out_close_dir_ni;
+                       }
                }
        }
 
@@ -678,9 +658,9 @@ static int wim_apply_dentry_timestamps(struct dentry *dentry, void *arg)
        }
 
        p = buf;
-       p = put_u64(p, dentry->inode->creation_time);
-       p = put_u64(p, dentry->inode->last_write_time);
-       p = put_u64(p, dentry->inode->last_access_time);
+       p = put_u64(p, dentry->d_inode->creation_time);
+       p = put_u64(p, dentry->d_inode->last_write_time);
+       p = put_u64(p, dentry->d_inode->last_access_time);
        ret = ntfs_inode_set_times(ni, (const char*)buf, 3 * sizeof(u64), 0);
        if (ret != 0) {
                ERROR_WITH_ERRNO("Failed to set NTFS timestamps on `%s'",