]> wimlib.net Git - wimlib/blobdiff - src/capture_common.c
Add new helper function for attaching newly scanned dentry tree
[wimlib] / src / capture_common.c
index e088afcbd0cddcc5502bc15045df9a2a00dfb4dc..353ff2b67f64fabb134eae8150175a6f54ec27e8 100644 (file)
@@ -285,30 +285,19 @@ try_exclude(const tchar *full_path, const struct capture_params *params)
        }
 
        if (unlikely(params->add_flags & WIMLIB_ADD_FLAG_TEST_FILE_EXCLUSION)) {
+
                union wimlib_progress_info info;
+               tchar *cookie;
 
                info.test_file_exclusion.path = full_path;
                info.test_file_exclusion.will_exclude = false;
 
-       #ifdef __WIN32__
-               /* Hack for Windows...  */
-
-               wchar_t *p_question_mark = NULL;
-
-               if (!wcsncmp(full_path, L"\\??\\", 4)) {
-                       /* Trivial transformation:  NT namespace => Win32 namespace  */
-                       p_question_mark = (wchar_t *)&full_path[1];
-                       *p_question_mark = L'\\';
-               }
-       #endif
+               cookie = progress_get_win32_path(full_path);
 
                ret = call_progress(params->progfunc, WIMLIB_PROGRESS_MSG_TEST_FILE_EXCLUSION,
                                    &info, params->progctx);
 
-       #ifdef __WIN32__
-               if (p_question_mark)
-                       *p_question_mark = L'?';
-       #endif
+               progress_put_win32_path(cookie);
 
                if (ret)
                        return ret;
@@ -318,3 +307,51 @@ try_exclude(const tchar *full_path, const struct capture_params *params)
 
        return 0;
 }
+
+/*
+ * Determine whether a directory entry of the specified name should be ignored.
+ * This is a lower level function which runs prior to try_exclude().  It handles
+ * the standard '.' and '..' entries, which show up in directory listings but
+ * should not be archived.  It also checks for odd filenames that usually should
+ * not exist but could cause problems if archiving them were to be attempted.
+ */
+bool
+should_ignore_filename(const tchar *name, const int name_nchars)
+{
+       if (name_nchars <= 0) {
+               WARNING("Ignoring empty filename");
+               return true;
+       }
+
+       if (name[0] == T('.') &&
+           (name_nchars == 1 || (name_nchars == 2 && name[1] == T('.'))))
+               return true;
+
+       for (int i = 0; i < name_nchars; i++) {
+               if (name[i] == T('\0')) {
+                       WARNING("Ignoring filename containing embedded null character");
+                       return true;
+               }
+               if (name[i] == OS_PREFERRED_PATH_SEPARATOR) {
+                       WARNING("Ignoring filename containing embedded path separator");
+                       return true;
+               }
+       }
+
+       return false;
+}
+
+/* Attach a newly scanned directory tree to its parent directory, with duplicate
+ * handling.  */
+void
+attach_scanned_tree(struct wim_dentry *parent, struct wim_dentry *child,
+                   struct blob_table *blob_table)
+{
+       struct wim_dentry *duplicate;
+
+       if (child && (duplicate = dentry_add_child(parent, child))) {
+               WARNING("Duplicate file path: \"%"TS"\".  Only capturing "
+                       "the first version.", dentry_full_path(duplicate));
+               free_dentry_tree(child, blob_table);
+       }
+}