#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 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 capture_params {
+ /* Pointer to the lookup table of the WIM. */
struct wim_lookup_table *lookup_table;
+ /* List of streams that have been added so far, but without their SHA1
+ * message digests being calculated (as a shortcut). */
+ struct list_head *unhashed_streams;
+
/* 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. */
- 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__
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 */