summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
28e195e)
File exclusion patterns are now intepreted relative to the directory of capture.
int (*stat_fn)(const char *restrict, struct stat *restrict);
struct dentry *root;
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);
if (add_flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE)
printf("Excluding file `%s' from capture\n",
root_disk_path);
ret = build_dentry_tree(&child, name, lookup_table,
sd, config,
add_flags, extra_arg);
ret = build_dentry_tree(&child, name, lookup_table,
sd, config,
add_flags, extra_arg);
- link_dentry(child, root);
+ if (child)
+ link_dentry(child, root);
}
closedir(dir);
} else if (dentry_is_symlink(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);
destroy_pattern_list(&config->compression_exclusion_list);
destroy_pattern_list(&config->alignment_list);
FREE(config->config_str);
memset(config, 0, sizeof(*config));
}
memset(config, 0, sizeof(*config));
}
}
static int init_capture_config(const char *_config_str, size_t config_len,
}
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 *p;
char *eol;
char *next_p;
char *p;
char *eol;
char *next_p;
ERROR("Could not duplicate capture config string");
return WIMLIB_ERR_NOMEM;
}
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;
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;
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);
{
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);
return match_pattern(path, basename, &config->exclusion_list) &&
!match_pattern(path, basename, &config->exclusion_exception);
config_str = default_config;
config_len = strlen(default_config);
}
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);
if (ret != 0)
return ret;
print_capture_config(&config);
int ret = 0;
struct dentry *root;
int ret = 0;
struct dentry *root;
- if (exclude_path(path, config)) {
+ if (exclude_path(path, config, false)) {
DEBUG("Excluding `%s' from capture", path);
return 0;
}
DEBUG("Excluding `%s' from capture", path);
return 0;
}
struct pattern_list compression_exclusion_list;
struct pattern_list alignment_list;
char *config_str;
struct pattern_list compression_exclusion_list;
struct pattern_list alignment_list;
char *config_str;
+ char *prefix;
+ size_t prefix_len;
extern void destroy_image_metadata(struct image_metadata *imd,
struct lookup_table *lt);
extern bool exclude_path(const char *path,
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,
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,