X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib%2Fcapture.h;h=7b352dc50bad2c4e7eae6cdc75ad15cbea0eea27;hb=173bcff7f6950a89ee398d6058b4df8e67cf8675;hp=b60c5c85a348bfc6aaea477fb72d294f5e9e2b33;hpb=e8c3ca2d1d0cac3d64985b45a9f654d2029a7518;p=wimlib diff --git a/include/wimlib/capture.h b/include/wimlib/capture.h index b60c5c85..7b352dc5 100644 --- a/include/wimlib/capture.h +++ b/include/wimlib/capture.h @@ -2,112 +2,100 @@ #define _WIMLIB_CAPTURE_H #include "wimlib.h" +#include "wimlib/inode_table.h" #include "wimlib/list.h" +#include "wimlib/progress.h" #include "wimlib/security.h" +#include "wimlib/textfile.h" #include "wimlib/util.h" -struct wim_lookup_table; +struct blob_table; struct wim_dentry; +struct wim_inode; -/* Hash table to find inodes, given an inode number (in the case of reading - * a WIM images), or both an inode number and a device number (in the case of - * capturing a WIM image). */ -struct wim_inode_table { - /* Fields for the hash table */ - struct hlist_head *array; - u64 num_entries; - u64 capacity; - - /* - * Linked list of "extra" inodes. These may be: - * - * - inodes with link count 1, which are all allowed to have 0 for their - * inode number, meaning we cannot insert them into the hash table. - * - * - Groups we create ourselves by splitting a nominal inode due to - * inconsistencies in the dentries. These inodes will share an inode - * number with some other inode until assign_inode_numbers() is - * called. - */ - struct list_head extra_inodes; +struct capture_config { + struct string_set exclusion_pats; + struct string_set exclusion_exception_pats; + void *buf; }; /* Common parameters to implementations of building an in-memory dentry tree * from an on-disk directory structure. */ -struct add_image_params { - /* Pointer to the lookup table of the WIM. */ - struct wim_lookup_table *lookup_table; +struct capture_params { + /* Pointer to the blob table of the WIM. */ + struct blob_table *blob_table; + + /* List of blobs that have been added so far, but without their SHA-1 + * message digests being calculated (as a shortcut). */ + struct list_head *unhashed_blobs; /* Hash table of inodes that have been captured for this tree so far. */ - struct wim_inode_table inode_table; + struct wim_inode_table *inode_table; /* The set of security descriptors that have been captured for this * image so far. */ - struct wim_sd_set sd_set; + struct wim_sd_set *sd_set; - /* Pointer to the capture configuration, which indicates whether any - * files should be excluded from capture or not. */ - const struct wimlib_capture_config *config; + /* Pointer to the capture configuration. */ + struct capture_config *config; /* Flags that affect the capture operation (WIMLIB_ADD_FLAG_*) */ int add_flags; - /* If non-NULL, the user-supplied progress function. */ - wimlib_progress_func_t progress_func; - /* Extra argument; set to point to a pointer to the ntfs_volume for * libntfs-3g capture. */ void *extra_arg; + /* If non-NULL, the user-supplied progress function. */ + wimlib_progress_func_t progfunc; + void *progctx; + + /* Progress data. */ + union wimlib_progress_info progress; + + /* The capture implementation must set this to the number of characters + * that try_exclude() will strip from the path before testing exclusion + * patterns from the capture configuration file. */ + size_t capture_root_nchars; + + /* Can be used by the capture implementation. */ u64 capture_root_ino; u64 capture_root_dev; }; - /* capture_common.c */ -extern bool -exclude_path(const tchar *path, size_t path_len, - const struct wimlib_capture_config *config, - bool exclude_prefix); - -extern struct wimlib_capture_config * -copy_capture_config(const struct wimlib_capture_config *config); - extern int -copy_and_canonicalize_capture_config(const struct wimlib_capture_config *config, - struct wimlib_capture_config **config_copy_ret); - -extern void -free_capture_config(struct wimlib_capture_config *config); - -/* hardlink.c */ +do_capture_progress(struct capture_params *params, int status, + const struct wim_inode *inode); extern int -init_inode_table(struct wim_inode_table *table, size_t capacity); +mangle_pat(tchar *pat, const tchar *path, unsigned long line_no); extern int -inode_table_new_dentry(struct wim_inode_table *table, const tchar *name, - u64 ino, u64 devno, bool noshare, - struct wim_dentry **dentry_ret); +read_capture_config(const tchar *config_file, const void *buf, + size_t bufsize, struct capture_config *config); extern void -inode_table_prepare_inode_list(struct wim_inode_table *table, - struct list_head *head); +destroy_capture_config(struct capture_config *config); -static inline void -destroy_inode_table(struct wim_inode_table *table) -{ - FREE(table->array); -} +extern bool +match_pattern_list(const tchar *path, size_t path_nchars, + const struct string_set *list); +extern int +try_exclude(const tchar *full_path, size_t full_path_nchars, + const struct capture_params *params); + +typedef int (*capture_tree_t)(struct wim_dentry **, const tchar *, + struct capture_params *); #ifdef WITH_NTFS_3G /* ntfs-3g_capture.c */ extern int build_dentry_tree_ntfs(struct wim_dentry **root_p, const tchar *device, - struct add_image_params *params); + struct capture_params *params); #endif #ifdef __WIN32__ @@ -115,15 +103,24 @@ build_dentry_tree_ntfs(struct wim_dentry **root_p, extern int win32_build_dentry_tree(struct wim_dentry **root_ret, const tchar *root_disk_path, - struct add_image_params *params); + struct capture_params *params); +#define platform_default_capture_tree win32_build_dentry_tree #else /* unix_capture.c */ extern int unix_build_dentry_tree(struct wim_dentry **root_ret, const tchar *root_disk_path, - struct add_image_params *params); + struct capture_params *params); +#define platform_default_capture_tree unix_build_dentry_tree #endif #define WIMLIB_ADD_FLAG_ROOT 0x80000000 +static inline int +report_capture_error(struct capture_params *params, int error_code, + const tchar *path) +{ + return report_error(params->progfunc, params->progctx, error_code, path); +} + #endif /* _WIMLIB_CAPTURE_H */