]> wimlib.net Git - wimlib/blobdiff - src/extract.c
Update security descriptor setting
[wimlib] / src / extract.c
index b7b3399b36eb667b35f2d0beedb4bc94d672da16..3b434c425291ea191aba88b29bd7ad7ebb082964 100644 (file)
@@ -642,7 +642,7 @@ error:
  * extraction mode.  */
 static int
 extract_file_attributes(const tchar *path, struct apply_ctx *ctx,
-                       struct wim_dentry *dentry)
+                       struct wim_dentry *dentry, unsigned pass)
 {
        int ret;
 
@@ -664,7 +664,7 @@ extract_file_attributes(const tchar *path, struct apply_ctx *ctx,
                if (attributes == 0)
                        attributes = FILE_ATTRIBUTE_NORMAL;
 
-               ret = ctx->ops->set_file_attributes(path, attributes, ctx);
+               ret = ctx->ops->set_file_attributes(path, attributes, ctx, pass);
                if (ret) {
                        ERROR_WITH_ERRNO("Failed to set attributes on "
                                         "\"%"TS"\"", path);
@@ -766,11 +766,14 @@ extract_security(const tchar *path, struct apply_ctx *ctx,
                                                 "descriptor on \"%"TS"\"", path);
                                return ret;
                        } else {
+                       #if 0
                                if (errno != EACCES) {
                                        WARNING_WITH_ERRNO("Failed to set "
                                                           "security descriptor "
                                                           "on \"%"TS"\"", path);
                                }
+                       #endif
+                               ctx->no_security_descriptors++;
                        }
                }
        }
@@ -898,6 +901,11 @@ static unsigned
 get_num_path_components(const tchar *path, tchar path_separator)
 {
        unsigned num_components = 0;
+#ifdef __WIN32__
+       /* Ignore drive letter.  */
+       if (path[0] != L'\0' && path[1] == L':')
+               path += 2;
+#endif
 
        while (*path) {
                while (*path == path_separator)
@@ -940,7 +948,11 @@ extract_multiimage_symlink(const tchar *oldpath, const tchar *newpath,
                num_target_path_components--;
        }
 
-       p_old = oldpath;
+       p_old = oldpath + ctx->ops->path_prefix_nchars;
+#ifdef __WIN32__
+       if (p_old[0] != L'\0' && p_old[1] == ':')
+               p_old += 2;
+#endif
        while (*p_old == ctx->ops->path_separator)
                p_old++;
        while (--num_target_path_components) {
@@ -1044,7 +1056,7 @@ do_dentry_extract_skeleton(tchar path[], struct wim_dentry *dentry,
        }
 
        /* Set file attributes (if supported).  */
-       ret = extract_file_attributes(path, ctx, dentry);
+       ret = extract_file_attributes(path, ctx, dentry, 0);
        if (ret)
                return ret;
 
@@ -1463,6 +1475,13 @@ dentry_extract_final(struct wim_dentry *dentry, void *_ctx)
        if (ret)
                return ret;
 
+       if (ctx->ops->requires_final_set_attributes_pass) {
+               /* Set file attributes (if supported).  */
+               ret = extract_file_attributes(path, ctx, dentry, 1);
+               if (ret)
+                       return ret;
+       }
+
        return extract_timestamps(path, ctx, dentry);
 }
 
@@ -1817,10 +1836,10 @@ do_feature_check(const struct wim_features *required_features,
                 const tchar *wim_source_path)
 {
        const tchar *loc;
-       const tchar *mode = "this extraction mode";
+       const tchar *mode = T("this extraction mode");
 
        if (wim_source_path[0] == '\0')
-               loc = "the WIM image";
+               loc = T("the WIM image");
        else
                loc = wim_source_path;
 
@@ -2024,6 +2043,31 @@ do_feature_check(const struct wim_features *required_features,
        return 0;
 }
 
+static void
+do_extract_warnings(struct apply_ctx *ctx)
+{
+       if (ctx->partial_security_descriptors == 0 &&
+           ctx->no_security_descriptors == 0)
+               return;
+
+       WARNING("Extraction of \"%"TS"\" complete, but with one or more warnings:",
+               ctx->target);
+       if (ctx->partial_security_descriptors != 0) {
+               WARNING("- Could only partially set the security descriptor\n"
+                       "            on %lu files or directories.",
+                       ctx->partial_security_descriptors);
+       }
+       if (ctx->no_security_descriptors != 0) {
+               WARNING("- Could not set security descriptor at all\n"
+                       "            on %lu files or directories.",
+                       ctx->no_security_descriptors);
+       }
+#ifdef __WIN32__
+       WARNING("To fully restore all security descriptors, run the program\n"
+               "          with Administrator rights.");
+#endif
+}
+
 /*
  * extract_tree - Extract a file or directory tree from the currently selected
  *               WIM image.
@@ -2330,6 +2374,8 @@ extract_tree(WIMStruct *wim, const tchar *wim_source_path, const tchar *target,
                              &ctx.progress);
        }
 
+       do_extract_warnings(&ctx);
+
        ret = 0;
 out_free_realtarget:
        FREE(ctx.realtarget);