Relative file exclusion
authorEric Biggers <ebiggers3@gmail.com>
Mon, 27 Aug 2012 03:45:27 +0000 (22:45 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Mon, 27 Aug 2012 03:45:27 +0000 (22:45 -0500)
File exclusion patterns are now intepreted relative to the directory of capture.

src/modify.c
src/ntfs-capture.c
src/wimlib_internal.h

index e6e9f2cd8c58be61f2ecfc61fd6180dce99946ab..799f6150a6bb25522a31abab44d6e89e98402aeb 100644 (file)
@@ -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;
 
        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);
+               *root_ret = NULL;
                return 0;
        }
 
                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);
                        ret = build_dentry_tree(&child, name, lookup_table,
                                                sd, config,
                                                add_flags, extra_arg);
-                       link_dentry(child, root);
                        if (ret != 0)
                                break;
                        if (ret != 0)
                                break;
+                       if (child)
+                               link_dentry(child, root);
                }
                closedir(dir);
        } else if (dentry_is_symlink(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);
        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));
 }
 
        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,
 }
 
 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 *config_str;
+       char *prefix;
        char *p;
        char *eol;
        char *next_p;
        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;
        }
                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;
@@ -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);
 {
        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);
 
@@ -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);
        }
                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);
index 8d1fe0e6409023cb4386c7dbbb0558f844eaa231..a9ad174a3ef278a214b9304f21c97c2e4ee8e380 100644 (file)
@@ -435,7 +435,7 @@ static int __build_dentry_tree_ntfs(struct dentry **root_p, ntfs_inode *ni,
        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;
        }
index b6a90bab71d16769f8c3fb84597859f253805b66..a8ef2dc1e3addd9ccaf8f3ca1857f19e9d2ff05f 100644 (file)
@@ -324,6 +324,8 @@ struct capture_config {
        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;
 };
 
 /* hardlink.c */
 };
 
 /* 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,
 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,