From 4c0b550db9af85d0f1da1cb0d8ae738498a6e9e5 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sun, 26 Aug 2012 22:45:27 -0500 Subject: [PATCH] Relative file exclusion File exclusion patterns are now intepreted relative to the directory of capture. --- src/modify.c | 31 ++++++++++++++++++++++++------- src/ntfs-capture.c | 2 +- src/wimlib_internal.h | 5 ++++- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/modify.c b/src/modify.c index e6e9f2cd..799f6150 100644 --- a/src/modify.c +++ b/src/modify.c @@ -85,12 +85,11 @@ static int build_dentry_tree(struct dentry **root_ret, const char *root_disk_pat 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; } @@ -158,9 +157,10 @@ static int build_dentry_tree(struct dentry **root_ret, const char *root_disk_pat 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)) { @@ -539,6 +539,7 @@ static void destroy_capture_config(struct capture_config *config) 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)); } @@ -559,9 +560,10 @@ static int pattern_list_add_pattern(struct pattern_list *list, } 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; @@ -579,9 +581,17 @@ static int init_capture_config(const char *_config_str, size_t config_len, 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; @@ -682,9 +692,16 @@ static void print_capture_config(const struct capture_config *config) } } -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); @@ -732,7 +749,7 @@ int do_add_image(WIMStruct *w, const char *dir, const char *name, 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); diff --git a/src/ntfs-capture.c b/src/ntfs-capture.c index 8d1fe0e6..a9ad174a 100644 --- a/src/ntfs-capture.c +++ b/src/ntfs-capture.c @@ -435,7 +435,7 @@ static int __build_dentry_tree_ntfs(struct dentry **root_p, ntfs_inode *ni, 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; } diff --git a/src/wimlib_internal.h b/src/wimlib_internal.h index b6a90bab..a8ef2dc1 100644 --- a/src/wimlib_internal.h +++ b/src/wimlib_internal.h @@ -324,6 +324,8 @@ struct capture_config { struct pattern_list compression_exclusion_list; struct pattern_list alignment_list; char *config_str; + char *prefix; + size_t prefix_len; }; /* hardlink.c */ @@ -351,7 +353,8 @@ extern int check_wim_integrity(WIMStruct *w, int show_progress, int *status); 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, -- 2.43.0