FREE(from_dentry);
return -ENOMEM;
}
- if (calculate_dentry_full_path(from_dentry, to_dentry) != 0) {
- FREE(from_dentry->file_name);
- FREE(from_dentry->file_name_utf8);
- FREE(from_dentry);
- return -ENOMEM;
- }
list_add(&from_dentry->link_group_list, &to_dentry->link_group_list);
link_dentry(from_dentry, from_dentry_parent);
return 0;
if (!dentry)
return -ENOMEM;
- if (!change_dentry_name(dentry, link_name)) {
- FREE(dentry);
- return -ENOMEM;
- }
-
- if (calculate_dentry_full_path(dentry, NULL) != 0)
- goto out_free_dentry;
-
dentry->attributes = FILE_ATTRIBUTE_REPARSE_POINT;
dentry->reparse_tag = WIM_IO_REPARSE_TAG_SYMLINK;
void *buf = MALLOC(len);
if (!buf)
goto out;
+ /* XXX Fix absolute paths */
u8 *p = buf;
p = put_u16(p, 0); /* Substitute name offset */
p = put_u16(p, utf16_len); /* Substitute name length */
p = put_u16(p, utf16_len); /* Print name offset */
p = put_u16(p, utf16_len); /* Print name length */
- p = put_u32(p, (symlink_target[0] == '/') ? 0 : 1);
+ p = put_u32(p, 1);
p = put_bytes(p, utf16_len, name_utf16);
p = put_bytes(p, utf16_len, name_utf16);
/*DEBUG("utf16_len = %zu, len = %zu", utf16_len, len);*/
if (res_entry->original_size > 10000)
return -EIO;
- char res_buf[res_entry->original_size];
- if (read_full_resource(w->fp, res_entry->size,
- res_entry->original_size,
- res_entry->offset,
- wim_resource_compression_type(w, res_entry),
- res_buf) != 0)
- return -EIO;
+ char __res_buf[res_entry->original_size];
+ const char *res_buf;
+ if (lte->is_symlink && lte->symlink_buf) {
+ res_buf = lte->symlink_buf;
+ } else {
+ res_buf = __res_buf;
+ if (read_full_resource(w->fp, res_entry->size,
+ res_entry->original_size,
+ res_entry->offset,
+ wim_resource_compression_type(w, res_entry),
+ __res_buf) != 0)
+ return -EIO;
+ res_buf = __res_buf;
+ }
return get_symlink_name(res_buf, res_entry->original_size, buf,
buf_len, dentry->reparse_tag);
}