]> wimlib.net Git - wimlib/blobdiff - src/extract.c
Windows: improved error messages
[wimlib] / src / extract.c
index ac50fa8fb87c27e5e8a19eb6c8920515b185d22d..a5be7d1b333486bc21cdf4e24626b4e61b6ca124 100644 (file)
 #  include "config.h"
 #endif
 
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
 #include "wimlib/apply.h"
 #include "wimlib/assert.h"
 #include "wimlib/dentry.h"
 #include "wimlib/wildcard.h"
 #include "wimlib/wim.h"
 
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
 #define WIMLIB_EXTRACT_FLAG_FROM_PIPE   0x80000000
 #define WIMLIB_EXTRACT_FLAG_IMAGEMODE   0x40000000
 
@@ -145,16 +144,22 @@ dentry_is_supported(struct wim_dentry *dentry,
        struct wim_inode *inode = dentry->d_inode;
 
        if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
-               return supported_features->reparse_points ||
-                       (inode_is_symlink(inode) &&
-                        supported_features->symlink_reparse_points);
+               if (!(supported_features->reparse_points ||
+                     (inode_is_symlink(inode) &&
+                      supported_features->symlink_reparse_points)))
+                       return false;
        }
+
        if (inode->i_attributes & FILE_ATTRIBUTE_ENCRYPTED) {
-               if (inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY)
-                       return supported_features->encrypted_directories != 0;
-               else
-                       return supported_features->encrypted_files != 0;
+               if (inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY) {
+                       if (!supported_features->encrypted_directories)
+                               return false;
+               } else {
+                       if (!supported_features->encrypted_files)
+                               return false;
+               }
        }
+
        return true;
 }
 
@@ -809,7 +814,7 @@ dentry_calculate_extraction_name(struct wim_dentry *dentry,
 {
        int ret;
 
-       if (!dentry_is_supported(dentry, &ctx->supported_features))
+       if (unlikely(!dentry_is_supported(dentry, &ctx->supported_features)))
                goto skip_dentry;
 
        if (dentry_is_root(dentry))
@@ -1087,9 +1092,6 @@ ref_unnamed_stream(struct wim_dentry *dentry, struct apply_ctx *ctx)
        unsigned stream_idx;
        struct wim_lookup_table_entry *stream;
 
-       if (unlikely(inode_is_encrypted_directory(inode)))
-               return 0;
-
        if (unlikely(ctx->apply_ops->will_externally_back)) {
                ret = (*ctx->apply_ops->will_externally_back)(dentry, ctx);
                if (ret >= 0) {
@@ -1474,6 +1476,11 @@ extract_trees(WIMStruct *wim, struct wim_dentry **trees, size_t num_trees,
        if (ret)
                goto out_cleanup;
 
+       if (unlikely(list_empty(&dentry_list))) {
+               WARNING("There is nothing to extract!");
+               goto out_cleanup;
+       }
+
        ret = dentry_list_resolve_streams(&dentry_list, ctx);
        if (ret)
                goto out_cleanup;