]> 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 0fa71adcbd898c5980a85ff42138cc3bef06f3ae..353ff2b67f64fabb134eae8150175a6f54ec27e8 100644 (file)
@@ -307,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);
+       }
+}