]> wimlib.net Git - wimlib/blobdiff - src/ntfs-apply.c
Make different threads use different FILE*'s
[wimlib] / src / ntfs-apply.c
index 9628e25edafa0bb890f1b473f002be2d1f0ae9a2..9b880a3dd6e047209f33aab0de76138469f0b723 100644 (file)
@@ -54,14 +54,7 @@ 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.
  */
 static int
@@ -79,7 +72,7 @@ extract_wim_resource_to_ntfs_attr(const struct lookup_table_entry *lte,
 
        while (bytes_remaining) {
                u64 to_read = min(bytes_remaining, WIM_CHUNK_SIZE);
-               ret = read_wim_resource(lte, buf, to_read, offset, false);
+               ret = read_wim_resource(lte, buf, to_read, offset, 0);
                if (ret != 0)
                        break;
                sha1_update(&ctx, buf, to_read);
@@ -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,
@@ -248,11 +241,11 @@ 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;
        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,
@@ -264,20 +257,20 @@ apply_file_attributes_and_security_data(ntfs_inode *ni,
                       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 = (const char *)sd->descriptors[dentry->d_inode->security_id];
                DEBUG("Applying security descriptor %d to `%s'",
-                     dentry->inode->security_id, dentry->full_path_utf8);
+                     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);
-                               
+                                                sd->sizes[dentry->d_inode->security_id], 0);
+
                if (ret != 0) {
                        ERROR_WITH_ERRNO("Failed to set security data on `%s'",
                                        dentry->full_path_utf8);
@@ -293,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);
 
@@ -313,11 +306,11 @@ 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 */
 
-       ret = read_full_wim_resource(lte, p);
+       ret = read_full_wim_resource(lte, p, 0);
        if (ret != 0)
                return ret;
 
@@ -334,7 +327,7 @@ static int apply_reparse_data(ntfs_inode *ni, const struct dentry *dentry,
 static int do_wim_apply_dentry_ntfs(struct dentry *dentry, ntfs_inode *dir_ni,
                                    WIMStruct *w);
 
-/* 
+/*
  * If @dentry is part of a hard link group, search for hard-linked dentries in
  * the same directory that have a nonempty DOS (short) filename.  There should
  * be exactly 0 or 1 such dentries.  If there is 1, extract that dentry first,
@@ -350,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)
                {
@@ -397,7 +390,7 @@ static int preapply_dentry_with_dos_name(struct dentry *dentry,
        return 0;
 }
 
-/* 
+/*
  * Applies a WIM dentry to a NTFS filesystem.
  *
  * @dentry:  The WIM dentry to apply
@@ -414,14 +407,12 @@ 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;
        } else {
-               struct dentry *other;
-
                /* Apply hard-linked directory in same directory with DOS name
                 * (if there is one) before this dentry */
                if (dentry->short_name_len == 0) {
@@ -449,12 +440,14 @@ 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;
+                       }
                }
        }
 
-       /* 
+       /*
         * Create a directory or file.
         *
         * Note: For symbolic links that are not directory junctions, pass
@@ -663,9 +656,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'",
@@ -694,7 +687,7 @@ static int do_wim_apply_image_ntfs(WIMStruct *w, const char *device, int extract
        int ret;
        struct dentry *root;
        struct ntfs_apply_args args;
-       
+
        DEBUG("Mounting NTFS volume `%s'", device);
        vol = ntfs_mount(device, 0);
        if (!vol) {
@@ -734,7 +727,7 @@ out:
 }
 
 
-/* 
+/*
  * API entry point for applying a WIM image to a NTFS volume.
  *
  * Please note that this is a NTFS *volume* and not a directory.  The intention
@@ -779,7 +772,7 @@ WIMLIBAPI int wimlib_apply_image_to_ntfs_volume(WIMStruct *w, int image,
                w->lookup_table = joined_tab;
        }
 
-       ret = wimlib_select_image(w, image);
+       ret = select_wim_image(w, image);
        if (ret != 0)
                goto out;