]> wimlib.net Git - wimlib/blobdiff - src/ntfs-3g_capture.c
Avoid having to check for NTFS-3g 2013.1.13 or later at configure time
[wimlib] / src / ntfs-3g_capture.c
index 1365c5036af902ef97a1dde43c555ba103e9f6be..7efed22b921b91c933df0284d76ea82924d73cc8 100644 (file)
 #include "wimlib/reparse.h"
 #include "wimlib/security.h"
 
+/* NTFS-3g 2013 renamed MS_RDONLY to NTFS_MNT_RDONLY.  We can't check for the
+ * existence of NTFS_MNT_RDONLY at compilation time because it's an enum.  We
+ * also can't check for MS_RDONLY being missing because it's also a system
+ * constant.  So check if the NTFS-3g specific MS_IGNORE_HIBERFILE is defined;
+ * if yes, then we need to use the old MS_RDONLY.  */
+#ifdef MS_IGNORE_HIBERFILE
+#  define NTFS_MNT_RDONLY MS_RDONLY
+#endif
+
 /* A reference-counted NTFS volume than is automatically unmounted when the
  * reference count reaches 0  */
 struct ntfs_volume_wrapper {
@@ -261,7 +270,6 @@ static int
 scan_ntfs_attr(struct wim_inode *inode,
               ntfs_inode *ni,
               const char *path,
-              size_t path_len,
               struct list_head *unhashed_blobs,
               struct ntfs_volume_wrapper *volume,
               ATTR_TYPES type,
@@ -357,7 +365,6 @@ static int
 scan_ntfs_attrs_with_type(struct wim_inode *inode,
                          ntfs_inode *ni,
                          const char *path,
-                         size_t path_len,
                          struct list_head *unhashed_blobs,
                          struct ntfs_volume_wrapper *volume,
                          ATTR_TYPES type)
@@ -378,7 +385,6 @@ scan_ntfs_attrs_with_type(struct wim_inode *inode,
                ret = scan_ntfs_attr(inode,
                                     ni,
                                     path,
-                                    path_len,
                                     unhashed_blobs,
                                     volume,
                                     type,
@@ -591,17 +597,13 @@ filldir(void *_ctx, const ntfschar *name, const int name_nchars,
                        goto out;
        }
 
-       /* Ignore . and .. entries  */
-       ret = 0;
-       if ((name_nchars == 1 && name[0] == cpu_to_le16('.')) ||
-           (name_nchars == 2 && name[0] == cpu_to_le16('.') &&
-                                name[1] == cpu_to_le16('.')))
-               goto out;
-
        ret = utf16le_to_tstr(name, name_nbytes, &mbs_name, &mbs_name_nbytes);
        if (ret)
                goto out;
 
+       if (should_ignore_filename(mbs_name, mbs_name_nbytes))
+               goto out_free_mbs_name;
+
        path_len = ctx->path_len;
        if (path_len != 1)
                ctx->path[path_len++] = '/';
@@ -611,8 +613,8 @@ filldir(void *_ctx, const ntfschar *name, const int name_nchars,
        ret = ntfs_3g_build_dentry_tree_recursive(&child, mref, ctx->path,
                                                  path_len, name_type,
                                                  ctx->volume, ctx->params);
-       if (child)
-               dentry_add_child(ctx->parent, child);
+       attach_scanned_tree(ctx->parent, child, ctx->params->blob_table);
+out_free_mbs_name:
        FREE(mbs_name);
 out:
        ctx->ret = ret;
@@ -734,7 +736,7 @@ ntfs_3g_build_dentry_tree_recursive(struct wim_dentry **root_ret,
 
        if (attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
                /* Scan the reparse point stream.  */
-               ret = scan_ntfs_attrs_with_type(inode, ni, path, path_len,
+               ret = scan_ntfs_attrs_with_type(inode, ni, path,
                                                params->unhashed_blobs,
                                                volume, AT_REPARSE_POINT);
                if (ret)
@@ -747,8 +749,7 @@ ntfs_3g_build_dentry_tree_recursive(struct wim_dentry **root_ret,
         * may have named data streams.  Nondirectories (including reparse
         * points) can have an unnamed data stream as well as named data
         * streams.  */
-       ret = scan_ntfs_attrs_with_type(inode, ni, path, path_len,
-                                       params->unhashed_blobs,
+       ret = scan_ntfs_attrs_with_type(inode, ni, path, params->unhashed_blobs,
                                        volume, AT_DATA);
        if (ret)
                goto out;
@@ -808,23 +809,7 @@ ntfs_3g_build_dentry_tree(struct wim_dentry **root_ret,
        if (!volume)
                return WIMLIB_ERR_NOMEM;
 
-       /* NTFS-3g 2013 renamed the "read-only" mount flag from MS_RDONLY to
-        * NTFS_MNT_RDONLY.
-        *
-        * Unfortunately we can't check for defined(NTFS_MNT_RDONLY) because
-        * NTFS_MNT_RDONLY is an enumerated constant.  Also, the NTFS-3g headers
-        * don't seem to contain any explicit version information.  So we have
-        * to rely on a test done at configure time to detect whether
-        * NTFS_MNT_RDONLY should be used.  */
-#ifdef HAVE_NTFS_MNT_RDONLY
-       /* NTFS-3g 2013 */
        vol = ntfs_mount(device, NTFS_MNT_RDONLY);
-#elif defined(MS_RDONLY)
-       /* NTFS-3g 2011, 2012 */
-       vol = ntfs_mount(device, MS_RDONLY);
-#else
-  #error "Can't find NTFS_MNT_RDONLY or MS_RDONLY flags"
-#endif
        if (!vol) {
                ERROR_WITH_ERRNO("Failed to mount NTFS volume \"%s\" read-only",
                                 device);