struct ads_entry *ads_entries;
struct ads_entry *new_entry;
+ DEBUG("Add alternate data stream %s:%s",
+ dentry->file_name_utf8, stream_name);
+
if (dentry->num_ads == 0xffff)
return NULL;
num_ads = dentry->num_ads + 1;
cur->next->prev = cur;
}
}
- dentry->ads_entries = ads_entries;
new_entry = &ads_entries[num_ads - 1];
+ ads_entry_init(new_entry);
if (change_ads_name(new_entry, stream_name) != 0)
return NULL;
+ dentry->ads_entries = ads_entries;
dentry->num_ads = num_ads;
- ads_entry_init(new_entry);
return new_entry;
}
return get_names(&entry->stream_name, &entry->stream_name_utf8,
&entry->stream_name_len,
&entry->stream_name_utf8_len,
- new_name);
+ new_name);
}
/* Parameters for calculate_dentry_statistics(). */
if (p - orig_p < dentry->length)
p = put_zeroes(p, dentry->length - (p - orig_p));
- p = put_zeroes(p, (8 - (p - orig_p) % 8) % 8);
+ p = put_zeroes(p, (8 - dentry->length % 8) % 8);
for (u16 i = 0; i < dentry->num_ads; i++) {
p = put_u64(p, ads_entry_length(&dentry->ads_entries[i]));
p = put_u16(p, dentry->ads_entries[i].stream_name_len);
p = put_bytes(p, dentry->ads_entries[i].stream_name_len,
(u8*)dentry->ads_entries[i].stream_name);
+ p = put_u16(p, 0);
p = put_zeroes(p, (8 - (p - orig_p) % 8) % 8);
}
return p;
struct dentry *dentry;
struct lookup_table_entry *lte;
unsigned stream_idx;
+ const char *stream_name;
+ char *p = NULL;
+
+ if (lookup_flags & LOOKUP_FLAG_ADS_OK) {
+ stream_name = path_stream_name(path);
+ if (stream_name) {
+ p = (char*)stream_name - 1;
+ *p = '\0';
+ }
+ }
+
dentry = get_dentry(w, path);
+ if (p)
+ *p = ':';
if (!dentry)
return -ENOENT;
&& dentry_is_directory(dentry))
return -EISDIR;
stream_idx = 0;
- if (lookup_flags & LOOKUP_FLAG_ADS_OK) {
- const char *stream_name = path_stream_name(path);
- if (stream_name) {
- size_t stream_name_len = strlen(stream_name);
- for (u16 i = 0; i < dentry->num_ads; i++) {
- if (ads_entry_has_name(&dentry->ads_entries[i],
- stream_name,
- stream_name_len))
- {
- stream_idx = i + 1;
- lte = dentry->ads_entries[i].lte;
- goto out;
- }
+ if (stream_name) {
+ size_t stream_name_len = strlen(stream_name);
+ for (u16 i = 0; i < dentry->num_ads; i++) {
+ if (ads_entry_has_name(&dentry->ads_entries[i],
+ stream_name,
+ stream_name_len))
+ {
+ stream_idx = i + 1;
+ lte = dentry->ads_entries[i].lte;
+ goto out;
}
- return -ENOENT;
}
+ return -ENOENT;
}
out:
if (dentry_ret)
*/
static int wimfs_getattr(const char *path, struct stat *stbuf)
{
- struct dentry *dentry = get_dentry(w, path);
- if (!dentry)
- return -ENOENT;
+ const char *stream_name;
+ char *p = NULL;
+ struct dentry *dentry;
+ int ret;
+
+ ret = lookup_resource(w, path, get_lookup_flags(), &dentry, NULL, NULL);
+ if (ret != 0)
+ return ret;
return dentry_to_stbuf(dentry, stbuf);
}
static int wimfs_mknod(const char *path, mode_t mode, dev_t rdev)
{
const char *stream_name;
+ const char *file_name;
if ((mount_flags & WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS)
&& (stream_name = path_stream_name(path))) {
/* Make an alternate data stream */
struct ads_entry *new_entry;
struct dentry *dentry;
+ char *p = (char*)stream_name - 1;
+ wimlib_assert(*p == ':');
+ *p = '\0';
+
dentry = get_dentry(w, path);
if (!dentry || !dentry_is_regular_file(dentry))
return -ENOENT;
root = wim_root_dentry(w);
- struct wim_security_data *sd = wim_security_data(w);
- if (sd)
- subdir_offset = sd->total_length + root->length + 8;
- else
- subdir_offset = 8 + root->length + 8;
+ const struct wim_security_data *sd = wim_security_data(w);
+ wimlib_assert(sd);
+ subdir_offset = sd->total_length + root->length + 8;
calculate_subdir_offsets(root, &subdir_offset);
metadata_original_size = subdir_offset + random_tail_len;
buf = MALLOC(metadata_original_size);
lookup_table_unlink(w->lookup_table, lte);
lookup_table_insert(w->lookup_table, lte);
wimlib_assert(lte->out_refcnt == 0);
- lte->out_refcnt++;
+ lte->out_refcnt = 1;
lte->output_resource_entry.flags |= WIM_RESHDR_FLAG_METADATA;
out:
FREE(buf);