]> wimlib.net Git - wimlib/blobdiff - src/ntfs-3g_capture.c
resource: pass blob and offset to consume_chunk
[wimlib] / src / ntfs-3g_capture.c
index 33f8365702ecff945d14b050894f8fcc4fbfe7c8..ca8d1b2ffe4a335002569c0a6de780a52d13e9f2 100644 (file)
@@ -65,6 +65,7 @@
 struct ntfs_volume_wrapper {
        ntfs_volume *vol;
        size_t refcnt;
+       bool dedup_warned;
 };
 
 /* Description of where data is located in an NTFS volume  */
@@ -116,7 +117,7 @@ open_ntfs_attr(ntfs_inode *ni, const struct ntfs_location *loc)
 
 int
 read_ntfs_attribute_prefix(const struct blob_descriptor *blob, u64 size,
-                          const struct read_blob_callbacks *cbs)
+                          const struct consume_chunk_callback *cb)
 {
        const struct ntfs_location *loc = blob->ntfs_loc;
        ntfs_volume *vol = loc->volume->vol;
@@ -153,7 +154,7 @@ read_ntfs_attribute_prefix(const struct blob_descriptor *blob, u64 size,
                }
                pos += to_read;
                bytes_remaining -= to_read;
-               ret = call_consume_chunk(buf, to_read, cbs);
+               ret = consume_chunk(cb, buf, to_read);
                if (ret)
                        goto out_close_ntfs_attr;
        }
@@ -231,6 +232,27 @@ read_reparse_header(ntfs_inode *ni, struct wim_inode *inode)
        return 0;
 }
 
+
+static void
+warn_special_reparse_points(const struct wim_inode *inode,
+                           const struct scan_params *params,
+                           struct ntfs_volume_wrapper *volume)
+{
+       if (inode->i_reparse_tag == WIM_IO_REPARSE_TAG_DEDUP &&
+           (params->add_flags & WIMLIB_ADD_FLAG_WINCONFIG) &&
+           !volume->dedup_warned)
+       {
+               WARNING(
+         "Filesystem includes files deduplicated with Windows'\n"
+"          Data Deduplication feature, which to properly restore\n"
+"          would require that the chunk store in \"System Volume Information\"\n"
+"          be included in the WIM image. By default \"System Volume Information\"\n"
+"          is excluded, so you may want to use a custom capture configuration\n"
+"          file which includes it.");
+               volume->dedup_warned = true;
+       }
+}
+
 static int
 attr_type_to_wimlib_stream_type(ATTR_TYPES type)
 {
@@ -793,6 +815,8 @@ ntfs_3g_build_dentry_tree_recursive(struct wim_dentry **root_ret,
                                                volume, AT_REPARSE_POINT);
                if (ret)
                        goto out;
+
+               warn_special_reparse_points(inode, params, volume);
        }
 
        /* Load the object ID.  */
@@ -863,7 +887,7 @@ ntfs_3g_build_dentry_tree(struct wim_dentry **root_ret,
        char *path;
        int ret;
 
-       volume = MALLOC(sizeof(struct ntfs_volume_wrapper));
+       volume = CALLOC(1, sizeof(struct ntfs_volume_wrapper));
        if (!volume)
                return WIMLIB_ERR_NOMEM;