int (*stat_fn)(const char *restrict, struct stat *restrict);
struct dentry *root;
- DEBUG("%s", root_disk_path);
-
- if (exclude_path(root_disk_path, config)) {
+ if (exclude_path(root_disk_path, config, true)) {
if (add_flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE)
printf("Excluding file `%s' from capture\n",
root_disk_path);
+ *root_ret = NULL;
return 0;
}
ret = build_dentry_tree(&child, name, lookup_table,
sd, config,
add_flags, extra_arg);
- link_dentry(child, root);
if (ret != 0)
break;
+ if (child)
+ link_dentry(child, root);
}
closedir(dir);
} else if (dentry_is_symlink(root)) {
destroy_pattern_list(&config->compression_exclusion_list);
destroy_pattern_list(&config->alignment_list);
FREE(config->config_str);
+ FREE(config->prefix);
memset(config, 0, sizeof(*config));
}
}
static int init_capture_config(const char *_config_str, size_t config_len,
- struct capture_config *config)
+ const char *_prefix, struct capture_config *config)
{
char *config_str;
+ char *prefix;
char *p;
char *eol;
char *next_p;
ERROR("Could not duplicate capture config string");
return WIMLIB_ERR_NOMEM;
}
+ prefix = STRDUP(_prefix);
+ if (!prefix) {
+ FREE(config_str);
+ return WIMLIB_ERR_NOMEM;
+ }
+
memcpy(config_str, _config_str, config_len);
next_p = config_str;
config->config_str = config_str;
+ config->prefix = prefix;
+ config->prefix_len = strlen(prefix);
while (bytes_remaining) {
line_no++;
p = next_p;
}
}
-bool exclude_path(const char *path, const struct capture_config *config)
+bool exclude_path(const char *path, const struct capture_config *config,
+ bool exclude_prefix)
{
const char *basename = path_basename(path);
+ if (exclude_prefix) {
+ wimlib_assert(strlen(path) >= config->prefix_len);
+ if (memcmp(config->prefix, path, config->prefix_len) == 0
+ && path[config->prefix_len] == '/')
+ path += config->prefix_len;
+ }
return match_pattern(path, basename, &config->exclusion_list) &&
!match_pattern(path, basename, &config->exclusion_exception);
config_str = default_config;
config_len = strlen(default_config);
}
- ret = init_capture_config(config_str, config_len, &config);
+ ret = init_capture_config(config_str, config_len, dir, &config);
if (ret != 0)
return ret;
print_capture_config(&config);
struct pattern_list compression_exclusion_list;
struct pattern_list alignment_list;
char *config_str;
+ char *prefix;
+ size_t prefix_len;
};
/* hardlink.c */
extern void destroy_image_metadata(struct image_metadata *imd,
struct lookup_table *lt);
extern bool exclude_path(const char *path,
- const struct capture_config *config);
+ const struct capture_config *config,
+ bool exclude_prefix);
extern int do_add_image(WIMStruct *w, const char *dir, const char *name,
const char *description, const char *flags_element,
const char *config_str, size_t config_len,