X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fcapture_common.c;h=ffdc7a88dfd202f6b285c95d5d4948ab0fe9570a;hp=e6b5baa45b521b3bbcd225e0fe4f119daebe3bb9;hb=027518fa61bd9232ff7fa7ecd270546d920c912f;hpb=e8c3ca2d1d0cac3d64985b45a9f654d2029a7518 diff --git a/src/capture_common.c b/src/capture_common.c index e6b5baa4..ffdc7a88 100644 --- a/src/capture_common.c +++ b/src/capture_common.c @@ -27,34 +27,31 @@ #include "wimlib/assert.h" #include "wimlib/capture.h" +#include "wimlib/dentry.h" #include "wimlib/error.h" +#include "wimlib/lookup_table.h" #include "wimlib/paths.h" +#include "wimlib/wildcard.h" -#ifdef __WIN32__ -# include "wimlib/win32.h" /* for fnmatch() equivalent */ -#else -# include -#endif #include - static int canonicalize_pattern(const tchar *pat, tchar **canonical_pat_ret) { tchar *canonical_pat; - if (pat[0] != T('/') && pat[0] != T('\\') && + if (!is_any_path_separator(pat[0]) && pat[0] != T('\0') && pat[1] == T(':')) { /* Pattern begins with drive letter */ - if (pat[2] != T('/') && pat[2] != T('\\')) { + if (!is_any_path_separator(pat[2])) { /* Something like c:file, which is actually a path * relative to the current working directory on the c: * drive. We require paths with drive letters to be * absolute. */ ERROR("Invalid path \"%"TS"\"; paths including drive letters " "must be absolute!", pat); - ERROR("Maybe try \"%"TC":/%"TS"\"?", + ERROR("Maybe try \"%"TC":\\%"TS"\"?", pat[0], pat + 2); return WIMLIB_ERR_INVALID_CAPTURE_CONFIG; } @@ -67,6 +64,12 @@ canonicalize_pattern(const tchar *pat, tchar **canonical_pat_ret) canonical_pat = canonicalize_fs_path(pat); if (!canonical_pat) return WIMLIB_ERR_NOMEM; + + /* Translate all possible path separators into the operating system's + * preferred path separator. */ + for (tchar *p = canonical_pat; *p; p++) + if (is_any_path_separator(*p)) + *p = OS_PREFERRED_PATH_SEPARATOR; *canonical_pat_ret = canonical_pat; return 0; } @@ -145,11 +148,11 @@ match_pattern(const tchar *path, const tchar *pat = list->pats[i]; const tchar *string; - if (*pat == T('/')) { + if (*pat == OS_PREFERRED_PATH_SEPARATOR) { /* Absolute path from root of capture */ string = path; } else { - if (tstrchr(pat, T('/'))) + if (tstrchr(pat, OS_PREFERRED_PATH_SEPARATOR)) /* Relative path from root of capture */ string = path + 1; else @@ -161,7 +164,7 @@ match_pattern(const tchar *path, * replacement function in win32.c. */ if (fnmatch(pat, string, FNM_PATHNAME | FNM_NOESCAPE #ifdef FNM_CASEFOLD - | FNM_CASEFOLD + | FNM_CASEFOLD #endif ) == 0) { @@ -169,13 +172,46 @@ match_pattern(const tchar *path, string, pat); return true; } else { - DEBUG2("\"%"TS"\" does not match the pattern \"%"TS"\"", - string, pat); + DEBUG("\"%"TS"\" does not match the pattern \"%"TS"\"", + string, pat); } } return false; } +void +do_capture_progress(struct add_image_params *params, int status, + const struct wim_inode *inode) +{ + switch (status) { + case WIMLIB_SCAN_DENTRY_OK: + if (!(params->add_flags & WIMLIB_ADD_FLAG_VERBOSE)) + return; + case WIMLIB_SCAN_DENTRY_UNSUPPORTED: + case WIMLIB_SCAN_DENTRY_EXCLUDED: + case WIMLIB_SCAN_DENTRY_EXCLUDED_SYMLINK: + if (!(params->add_flags & WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE)) + return; + } + params->progress.scan.status = status; + if (status == WIMLIB_SCAN_DENTRY_OK && inode->i_nlink == 1) { + const struct wim_lookup_table_entry *lte; + for (unsigned i = 0; i <= inode->i_num_ads; i++) { + lte = inode_stream_lte_resolved(inode, i); + if (lte != NULL) + params->progress.scan.num_bytes_scanned += lte->size; + } + if (inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY) + params->progress.scan.num_dirs_scanned++; + else + params->progress.scan.num_nondirs_scanned++; + } + if (params->progress_func) { + params->progress_func(WIMLIB_PROGRESS_MSG_SCAN_DENTRY, + ¶ms->progress); + } +} + /* Return true if the image capture configuration file indicates we should * exclude the filename @path from capture. * @@ -195,7 +231,7 @@ exclude_path(const tchar *path, size_t path_len, if (exclude_prefix) { wimlib_assert(path_len >= config->_prefix_num_tchars); if (!tmemcmp(config->_prefix, path, config->_prefix_num_tchars) && - path[config->_prefix_num_tchars] == T('/')) + path[config->_prefix_num_tchars] == OS_PREFERRED_PATH_SEPARATOR) { path += config->_prefix_num_tchars; }