]> wimlib.net Git - wimlib/blobdiff - include/wimlib/apply.h
apply_operations: Remove 'strict' argument from set_security_descriptor()
[wimlib] / include / wimlib / apply.h
index 44773bd12dfcffbeba0433a5f4d1c1a55fbab178..a7fe179ac6de50301d0961d77c6d70a4e902f757 100644 (file)
 #ifndef _WIMLIB_APPLY_H
 #define _WIMLIB_APPLY_H
 
-#include "wimlib.h"
 #include "wimlib/types.h"
+#include "wimlib/list.h"
+#include "wimlib.h"
 
-#ifdef WITH_NTFS_3G
-struct _ntfs_volume;
-#endif
+struct wim_lookup_table_entry;
+struct wimlib_unix_data;
+struct wim_dentry;
+struct apply_ctx;
 
-struct apply_args {
-       WIMStruct *w;
-       const tchar *target;
-       unsigned target_nchars;
-       unsigned wim_source_path_nchars;
-       struct wim_dentry *extract_root;
-       tchar *target_realpath;
-       unsigned target_realpath_len;
-       int extract_flags;
-       union wimlib_progress_info progress;
-       wimlib_progress_func_t progress_func;
-       int (*apply_dentry)(struct wim_dentry *, void *);
-       union {
-       #ifdef WITH_NTFS_3G
-               struct {
-                       /* NTFS apply only */
-                       struct _ntfs_volume *vol;
-               };
-       #endif
-       #ifdef __WIN32__
-               struct {
-                       /* Normal apply only (Win32) */
-                       unsigned long num_set_sacl_priv_notheld;
-                       unsigned long num_set_sd_access_denied;
-                       unsigned vol_flags;
-                       unsigned long num_hard_links_failed;
-                       unsigned long num_soft_links_failed;
-                       bool have_vol_flags;
-               };
-       #else
-               struct {
-                       /* Normal apply only (UNIX) */
-                       unsigned long num_utime_warnings;
-               };
-       #endif
-       };
+/*
+ * struct apply_operations -  Callback functions for a specific extraction
+ * mode/backend.  These are lower-level functions that are called by the generic
+ * code in extract.c.
+ *
+ * Unless otherwise specified, the callbacks in this structure are expected to
+ * return 0 on success or a WIMLIB_ERR_* value on failure as well as set errno.
+ * When possible, error messages should NOT be printed as they are handled by
+ * the generic code.
+ *
+ * Many callbacks are optional, but to extract the most data from the WIM
+ * format, as many as possible should be provided, and the corresponding
+ * features should be marked as supported in start_extract().
+ */
+struct apply_operations {
+
+       /* OPTIONAL:  Name of this extraction mode.  */
+       const tchar *name;
+
+       /* REQUIRED:  Fill in ctx->supported_features with nonzero values for
+        * features supported by the extraction mode and volume.  This callback
+        * can also be used to do any setup needed to access the volume.  */
+       int (*start_extract)
+               (const tchar *path, struct apply_ctx *ctx);
+
+       /* OPTIONAL:  If root_directory_is_special is set:  provide this
+        * callback to determine whether the path corresponds to the root of the
+        * target volume (%true) or not (%false).  */
+       bool (*target_is_root)
+               (const tchar *target);
+
+       /* REQUIRED:  Create a file.  */
+       int (*create_file)
+               (const tchar *path, struct apply_ctx *ctx);
+
+       /* REQUIRED:  Create a directory.  */
+       int (*create_directory)
+               (const tchar *path, struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Create a hard link.  In start_extract(), set
+        * ctx->supported_features.hard_links if supported.  */
+       int (*create_hardlink)
+               (const tchar *oldpath, const tchar *newpath,
+                struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Create a symbolic link.  In start_extract(), set
+        * ctx->supported_features.symlink_reparse_points if supported.  */
+       int (*create_symlink)
+               (const tchar *oldpath, const tchar *newpath,
+                struct apply_ctx *ctx);
+
+       /* REQUIRED:  Extract unnamed data stream.  */
+       int (*extract_unnamed_stream)
+               (const tchar *path, struct wim_lookup_table_entry *lte,
+                struct apply_ctx *ctx);
+
+       /* 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,
+                size_t stream_name_nchars, struct wim_lookup_table_entry *lte,
+                struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Extracted encrypted stream.  In start_extract(), set
+        * ctx->supported_features.encrypted_files if supported.  */
+       int (*extract_encrypted_stream)
+               (const tchar *path, struct wim_lookup_table_entry *lte,
+                struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Set file attributes.  Calling code calls this if non-NULL.
+        */
+       int (*set_file_attributes)
+               (const tchar *path, u32 attributes, struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Set reparse data.  In start_extract(), set
+        * ctx->supported_features.reparse_data if supported.  */
+       int (*set_reparse_data)
+               (const tchar *path, const u8 *rpbuf, u16 rpbuflen,
+                struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Set short (DOS) filename.  In start_extract(), set
+        * ctx->supported_features.short_name if supported.  */
+       int (*set_short_name)
+               (const tchar *path, const utf16lechar *short_name,
+                size_t short_name_nchars, struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Set Windows NT security descriptor.  In start_extract(),
+        * set ctx->supported_features.security_descriptors if supported.  */
+       int (*set_security_descriptor)
+               (const tchar *path, const u8 *desc, size_t desc_size,
+                struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Set wimlib-specific UNIX data.  In start_extract(), set
+        * ctx->supported_features.unix_data if supported.  */
+       int (*set_unix_data)
+               (const tchar *path, const struct wimlib_unix_data *data,
+                struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Set timestamps.  Calling code calls this if non-NULL.  */
+       int (*set_timestamps)
+               (const tchar *path, u64 creation_time, u64 last_write_time,
+                u64 last_access_time, struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Called after the extraction operation has succeeded.  */
+       int (*finish_extract)
+               (struct apply_ctx *ctx);
+
+       /* OPTIONAL:  Called after the extraction operation has failed.  */
+       int (*abort_extract)
+               (struct apply_ctx *ctx);
+
+       /* REQUIRED:  Path separator character to use when building paths.  */
+       tchar path_separator;
+
+       /* REQUIRED:  Maximum path length, in tchars, including the
+        * null-terminator.  */
+       unsigned path_max;
+
+       /* OPTIONAL:  String to prefix every path with.  */
+       const tchar *path_prefix;
+
+       /* OPTIONAL:  Length of path_prefix in tchars.  */
+       unsigned path_prefix_nchars;
+
+       /* OPTIONAL:  Set to 1 if paths must be prefixed by the name of the
+        * extraction target (i.e. if it's interpreted as a directory).  */
+       unsigned requires_target_in_paths : 1;
+
+       /* OPTIONAL:  Like above, but operations require real (absolute) path.
+        * */
+       unsigned requires_realtarget_in_paths : 1;
+
+       /* OPTIONAL:  Set to 1 if realpath() can be used to get the real
+        * (absolute) path of a file on the target volume before it's been
+        * created.  */
+       unsigned realpath_works_on_nonexisting_files : 1;
+
+       /* OPTIONAL:  Set to 1 if this extraction mode supports case sensitive
+        * filenames.  */
+       unsigned supports_case_sensitive_filenames : 1;
+
+       /* 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;
 };
 
-#ifdef WITH_NTFS_3G
-extern int
-apply_dentry_ntfs(struct wim_dentry *dentry, void *arg);
+struct wim_features {
+       unsigned long archive_files;
+       unsigned long hidden_files;
+       unsigned long system_files;
+       unsigned long compressed_files;
+       unsigned long encrypted_files;
+       unsigned long not_context_indexed_files;
+       unsigned long sparse_files;
+       unsigned long named_data_streams;
+       unsigned long hard_links;
+       unsigned long reparse_points;
+       unsigned long symlink_reparse_points;
+       unsigned long other_reparse_points;
+       unsigned long security_descriptors;
+       unsigned long short_names;
+       unsigned long unix_data;
+};
 
-extern int
-apply_dentry_timestamps_ntfs(struct wim_dentry *dentry, void *arg);
-#endif
+/* Context for an apply (extract) operation.  */
+struct apply_ctx {
+       WIMStruct *wim;
+       int extract_flags;
+       const tchar *target;
+       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;
+       tchar *realtarget;
+       size_t realtarget_nchars;
+       unsigned long invalid_sequence;
+       u64 num_streams_remaining;
+       bool root_dentry_is_special;
+       uint64_t next_progress;
+       intptr_t private[8];
+};
 
 #ifdef __WIN32__
-extern int
-win32_do_apply_dentry(const tchar *output_path,
-                     size_t output_path_nbytes,
-                     struct wim_dentry *dentry,
-                     struct apply_args *args);
-
-extern int
-win32_do_apply_dentry_timestamps(const tchar *output_path,
-                                size_t output_path_nbytes,
-                                struct wim_dentry *dentry,
-                                struct apply_args *args);
-#else /* __WIN32__ */
-extern int
-unix_do_apply_dentry(const tchar *output_path, size_t output_path_nbytes,
-                    struct wim_dentry *dentry, struct apply_args *args);
-extern int
-unix_do_apply_dentry_timestamps(const tchar *output_path,
-                               size_t output_path_nbytes,
-                               struct wim_dentry *dentry,
-                               struct apply_args *args);
-#endif /* !__WIN32__ */
-
-/* Internal use only */
-#define WIMLIB_EXTRACT_FLAG_MULTI_IMAGE                0x80000000
-#define WIMLIB_EXTRACT_FLAG_NO_STREAMS         0x40000000
-#define WIMLIB_EXTRACT_MASK_PUBLIC             0x3fffffff
+  extern const struct apply_operations win32_apply_ops;
+#else
+  extern const struct apply_operations unix_apply_ops;
+#endif
 
+#ifdef WITH_NTFS_3G
+  extern const struct apply_operations ntfs_3g_apply_ops;
+#endif
 
 #endif /* _WIMLIB_APPLY_H */