]> wimlib.net Git - wimlib/blobdiff - include/wimlib/apply.h
Don't create unnecessary temporary files
[wimlib] / include / wimlib / apply.h
index a7fe179ac6de50301d0961d77c6d70a4e902f757..3b124d31c4936fb1e55e35247d9e1ef757bac498 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef _WIMLIB_APPLY_H
 #define _WIMLIB_APPLY_H
 
+#include "wimlib/file_io.h"
 #include "wimlib/types.h"
 #include "wimlib/list.h"
 #include "wimlib.h"
@@ -10,6 +11,13 @@ struct wimlib_unix_data;
 struct wim_dentry;
 struct apply_ctx;
 
+/* Path to extracted file, or "cookie" identifying the file (e.g. inode number).
+ * */
+typedef union {
+       const tchar *path;
+       u64 cookie;
+} file_spec_t;
+
 /*
  * struct apply_operations -  Callback functions for a specific extraction
  * mode/backend.  These are lower-level functions that are called by the generic
@@ -43,11 +51,11 @@ struct apply_operations {
 
        /* REQUIRED:  Create a file.  */
        int (*create_file)
-               (const tchar *path, struct apply_ctx *ctx);
+               (const tchar *path, struct apply_ctx *ctx, u64 *cookie_ret);
 
        /* REQUIRED:  Create a directory.  */
        int (*create_directory)
-               (const tchar *path, struct apply_ctx *ctx);
+               (const tchar *path, struct apply_ctx *ctx, u64 *cookie_ret);
 
        /* OPTIONAL:  Create a hard link.  In start_extract(), set
         * ctx->supported_features.hard_links if supported.  */
@@ -63,13 +71,13 @@ struct apply_operations {
 
        /* REQUIRED:  Extract unnamed data stream.  */
        int (*extract_unnamed_stream)
-               (const tchar *path, struct wim_lookup_table_entry *lte,
-                struct apply_ctx *ctx);
+               (file_spec_t file, struct wim_lookup_table_entry *lte,
+                struct apply_ctx *ctx, struct wim_dentry *dentry);
 
        /* OPTIONAL:  Extracted named data stream.  In start_extract(), set
         * ctx->supported_features.alternate_data_streams if supported.  */
        int (*extract_named_stream)
-               (const tchar *path, const utf16lechar *stream_name,
+               (file_spec_t file, const utf16lechar *stream_name,
                 size_t stream_name_nchars, struct wim_lookup_table_entry *lte,
                 struct apply_ctx *ctx);
 
@@ -82,7 +90,8 @@ struct apply_operations {
        /* OPTIONAL:  Set file attributes.  Calling code calls this if non-NULL.
         */
        int (*set_file_attributes)
-               (const tchar *path, u32 attributes, struct apply_ctx *ctx);
+               (const tchar *path, u32 attributes, struct apply_ctx *ctx,
+                unsigned pass);
 
        /* OPTIONAL:  Set reparse data.  In start_extract(), set
         * ctx->supported_features.reparse_data if supported.  */
@@ -154,6 +163,25 @@ struct apply_operations {
        /* OPTIONAL:  Set to 1 if the root directory of the volume (see
         * target_is_root() callback) should not be explicitly extracted.  */
        unsigned root_directory_is_special : 1;
+
+       /* OPTIONAL:  Set to 1 if extraction cookie, or inode number, is stored
+        * in create_file() and create_directory() callbacks.  This cookie will
+        * then be passed to callbacks taking a 'file_spec_t', rather than the
+        * path.  */
+       unsigned uses_cookies : 1;
+
+       /* OPTIONAL:  Set to 1 if set_file_attributes() needs to be called a
+        * second time towards the end of the extraction.  */
+       unsigned requires_final_set_attributes_pass : 1;
+
+       /* OPTIONAL:  Set to 1 if extract_encrypted_stream() must be used to
+        * create encrypted files.  */
+       unsigned extract_encrypted_stream_creates_file : 1;
+
+       /* OPTIONAL:  Set to 1 if a link to a file with corresponding short name
+        * must be created before all links to the same file without
+        * corresponding short names.  */
+       unsigned requires_short_name_reordering : 1;
 };
 
 struct wim_features {
@@ -162,6 +190,7 @@ struct wim_features {
        unsigned long system_files;
        unsigned long compressed_files;
        unsigned long encrypted_files;
+       unsigned long encrypted_directories;
        unsigned long not_context_indexed_files;
        unsigned long sparse_files;
        unsigned long named_data_streams;
@@ -182,17 +211,24 @@ struct apply_ctx {
        size_t target_nchars;
        wimlib_progress_func_t progress_func;
        union wimlib_progress_info progress;
-       struct wim_dentry *extract_root;
        const struct apply_operations *ops;
-       struct wim_features supported_features;
        struct list_head stream_list;
+       struct wim_features supported_features;
+       bool root_dentry_is_special;
+       u32 supported_attributes_mask;
+
+       struct wim_dentry *target_dentry;
        tchar *realtarget;
        size_t realtarget_nchars;
        unsigned long invalid_sequence;
+       unsigned long partial_security_descriptors;
+       unsigned long no_security_descriptors;
+       struct wim_lookup_table_entry *cur_stream;
+       struct filedes tmpfile_fd;
+       tchar *tmpfile_name;
        u64 num_streams_remaining;
-       bool root_dentry_is_special;
        uint64_t next_progress;
-       intptr_t private[8];
+       intptr_t private[10];
 };
 
 #ifdef __WIN32__