]> wimlib.net Git - wimlib/blobdiff - src/symlink.c
Make different threads use different FILE*'s
[wimlib] / src / symlink.c
index 3b8ed4351fc282c45b78262c1c2c59f14198fd5f..b1c5b5d388b4703cf96c6b26d2af7d8dbdb00dbb 100644 (file)
@@ -105,7 +105,7 @@ static ssize_t get_symlink_name(const u8 *resource, size_t resource_len,
                translated_target += 4;
                link_target_len -= 4;
                /* There's a drive letter, so just leave the backslashes since
-                * it won't go anyhwere on UNIX anyway... 
+                * it won't go anyhwere on UNIX anyway...
                 *
                 * XXX
                 * NTFS-3g tries to re-map these links to actually point to
@@ -133,8 +133,8 @@ void *make_symlink_reparse_data_buf(const char *symlink_target, size_t *len_ret)
                return NULL;
        /*DEBUG("utf16_len = %zu", utf16_len);*/
        for (size_t i = 0; i < utf16_len / 2; i++)
-               if (((u16*)name_utf16)[i] == to_le16('/'))
-                       ((u16*)name_utf16)[i] = to_le16('\\');
+               if (((u16*)name_utf16)[i] == cpu_to_le16('/'))
+                       ((u16*)name_utf16)[i] = cpu_to_le16('\\');
        size_t len = 12 + utf16_len * 2 + 4;
        void *buf = MALLOC(len);
        if (!buf)
@@ -162,15 +162,15 @@ out:
  *
  * The dentry may be either "real" symlink or a junction point.
  */
-ssize_t dentry_readlink(const struct dentry *dentry, char *buf, size_t buf_len,
-                       const WIMStruct *w)
+ssize_t inode_readlink(const struct inode *inode, char *buf, size_t buf_len,
+                      const WIMStruct *w, int read_resource_flags)
 {
        const struct lookup_table_entry *lte;
        int ret;
 
-       wimlib_assert(dentry_is_symlink(dentry));
+       wimlib_assert(inode_is_symlink(inode));
 
-       lte = dentry_unnamed_lte(dentry, w->lookup_table);
+       lte = inode_unnamed_lte(inode, w->lookup_table);
        if (!lte)
                return -EIO;
 
@@ -178,35 +178,15 @@ ssize_t dentry_readlink(const struct dentry *dentry, char *buf, size_t buf_len,
                return -EIO;
 
        u8 res_buf[wim_resource_size(lte)];
-       ret = read_full_wim_resource(lte, res_buf);
+       ret = read_full_wim_resource(lte, res_buf, read_resource_flags);
        if (ret != 0)
                return -EIO;
        return get_symlink_name(res_buf, wim_resource_size(lte), buf,
-                               buf_len, dentry->reparse_tag);
+                               buf_len, inode->reparse_tag);
 }
 
-static int dentry_set_symlink_buf(struct dentry *dentry,
-                                 struct lookup_table_entry *lte)
-{
-       struct ads_entry *ads_entries;
-
-       ads_entries = CALLOC(2, sizeof(struct ads_entry));
-       if (!ads_entries)
-               return WIMLIB_ERR_NOMEM;
-
-       wimlib_assert(dentry->num_ads == 0);
-       wimlib_assert(dentry->ads_entries == NULL);
-
-       ads_entries[0].lte = lte;
-
-       /*dentry_free_ads_entries(dentry);*/
-       dentry->num_ads = 2;
-       dentry->ads_entries = ads_entries;
-       return 0;
-}
-
-/* 
- * Sets @dentry to be a symbolic link pointing to @target.
+/*
+ * Sets @inode to be a symbolic link pointing to @target.
  *
  * A lookup table entry for the symbolic link data buffer is created and
  * inserted into @lookup_table, unless there is an existing lookup table entry
@@ -216,9 +196,9 @@ static int dentry_set_symlink_buf(struct dentry *dentry,
  *
  * On failure @dentry and @lookup_table are not modified.
  */
-int dentry_set_symlink(struct dentry *dentry, const char *target,
-                      struct lookup_table *lookup_table,
-                      struct lookup_table_entry **lte_ret)
+int inode_set_symlink(struct inode *inode, const char *target,
+                     struct lookup_table *lookup_table,
+                     struct lookup_table_entry **lte_ret)
 
 {
        int ret;
@@ -226,14 +206,14 @@ int dentry_set_symlink(struct dentry *dentry, const char *target,
        struct lookup_table_entry *lte = NULL, *existing_lte;
        u8 symlink_buf_hash[SHA1_HASH_SIZE];
        void *symlink_buf;
-       
+
        symlink_buf = make_symlink_reparse_data_buf(target, &symlink_buf_len);
        if (!symlink_buf)
                return WIMLIB_ERR_NOMEM;
 
        DEBUG("Made symlink reparse data buf (len = %zu, name len = %zu)",
                        symlink_buf_len, symlink_buf_len);
-       
+
        sha1_buffer(symlink_buf, symlink_buf_len, symlink_buf_hash);
 
        existing_lte = __lookup_resource(lookup_table, symlink_buf_hash);
@@ -253,16 +233,11 @@ int dentry_set_symlink(struct dentry *dentry, const char *target,
                lte->attached_buffer              = symlink_buf;
                lte->resource_entry.original_size = symlink_buf_len;
                lte->resource_entry.size          = symlink_buf_len;
-               lte->resource_entry.flags         = 0;
                copy_hash(lte->hash, symlink_buf_hash);
        }
 
-       ret = dentry_set_symlink_buf(dentry, lte);
-
-       if (ret != 0)
-               goto out_free_lte;
-
-       dentry->resolved = true;
+       inode->lte = lte;
+       inode->resolved = true;
 
        DEBUG("Loaded symlink buf");
 
@@ -273,9 +248,6 @@ int dentry_set_symlink(struct dentry *dentry, const char *target,
        if (lte_ret)
                *lte_ret = lte;
        return 0;
-out_free_lte:
-       if (lte != existing_lte)
-               FREE(lte);
 out_free_symlink_buf:
        FREE(symlink_buf);
        return ret;