#include "util.h"
#include "list.h"
+#include "wimlib.h"
+
#ifdef WITH_FUSE
#include <pthread.h>
#endif
/* size of WIM header in bytes. */
//u32 hdr_size;
- /* Version of the WIM file. M$ provides no documentation about exactly
- * what this field affects about the file format, other than the fact
- * that more recent versions have a higher value. */
+ /* Version of the WIM file. Microsoft provides no documentation about
+ * exactly what this field affects about the file format, other than the
+ * fact that more recent versions have a higher value. */
//u32 version;
/* Bitwise OR of one or more of the WIM_HDR_FLAG_* defined below. */
/* The size of the pieces that the uncompressed files were split up into
* when they were compressed. This should be the same as
- * WIM_CHUNK_SIZE. M$ incorrectly documents this as "the size of the
- * compressed .wim file in bytes".*/
+ * WIM_CHUNK_SIZE. Microsoft incorrectly documents this as "the size of
+ * the compressed .wim file in bytes".*/
//u32 chunk_size;
/* A unique identifier for the WIM file. */
/* Flags for the `flags' field of the struct wim_header: */
-/* Reserved for future use by M$ */
+/* Reserved for future use */
#define WIM_HDR_FLAG_RESERVED 0x00000001
/* Files and metadata in the WIM are compressed. */
#define WIM_HDR_FLAG_COMPRESSION 0x00000002
-/* WIM is read-only (we ignore this). */
+/* WIM is read-only (wimlib ignores this because it's pretty much pointless) */
#define WIM_HDR_FLAG_READONLY 0x00000004
/* Resource data specified by images in this WIM may be contained in a different
* WIM. Or in other words, this WIM is part of a split WIM. */
#define WIM_HDR_FLAG_SPANNED 0x00000008
-/* The WIM contains resources only; no filesystem metadata. We ignore this
- * flag, as we look for file resources in all the WIMs anyway. */
+/* The WIM contains resources only; no filesystem metadata. wimlib ignores this
+ * flag, as it looks for resources in all the WIMs anyway. */
#define WIM_HDR_FLAG_RESOURCE_ONLY 0x00000010
-/* The WIM contains metadata only. We ignore this flag. Note that all the
+/* The WIM contains metadata only. wimlib ignores this flag. Note that all the
* metadata resources for a split WIM should be in the first part. */
#define WIM_HDR_FLAG_METADATA_ONLY 0x00000020
-/* Lock field to prevent multiple writers from writing the WIM concurrently. We
- * ignore this flag. */
+/* Lock field to prevent multiple writers from writing the WIM concurrently.
+ * wimlib ignores this flag as it uses flock() to acquire a real lock on the
+ * file (if supported by the underlying filesystem). */
#define WIM_HDR_FLAG_WRITE_IN_PROGRESS 0x00000040
/* Reparse point fixup ???
* This has something to do with absolute targets of reparse points / symbolic
- * links but I don't know what. We ignore this flag. */
+ * links but I don't know what. wimlib ignores this flag. */
#define WIM_HDR_FLAG_RP_FIX 0x00000080
/* Unused, reserved flag for another compression type */
/* Structure for security data. Each image in the WIM file has its own security
* data. */
struct wim_security_data {
- /* The total length of the security data, in bytes. A typical size is
- * 2048 bytes. If there is no security data, though (as in the WIMs
- * that wimlib writes, currently), it will be 8 bytes. */
+ /* The total length of the security data, in bytes. If there are no
+ * security descriptors, this field may be either 8 (which is correct)
+ * or 0 (which is interpreted as 0). */
u32 total_length;
/* The number of security descriptors in the array @descriptors, below.
* It is really an unsigned int, but it must fit into an int because the
* security ID's are signed. (Not like you would ever have more than a
- * few hundred security descriptors anyway). */
+ * few hundred security descriptors anyway.) */
int32_t num_entries;
/* Array of sizes of the descriptors in the array @descriptors. */
/* Array of descriptors. */
u8 **descriptors;
- /* keep track of how many WIMs reference this security data (used when
+ /* Keep track of how many WIMs reference this security data (used when
* exporting images between WIMs) */
u32 refcnt;
};
struct inode_table;
-
/* Metadata resource for an image. */
struct image_metadata {
/* Pointer to the root dentry for the image. */
* resource. */
struct lookup_table_entry *metadata_lte;
+ /* Linked list of inodes for this image. */
struct hlist_head inode_list;
- /* True if the filesystem of the image has been modified. If this is
- * the case, the memory for the filesystem is not freed when switching
- * to a different WIM image. */
+ /* True iff the dentry tree has been modified. If this is the case, the
+ * memory for the dentry tree is not freed when switching to a different
+ * WIM image. */
u8 modified : 1;
+ /* True iff this image has been mounted read-write. */
u8 has_been_mounted_rw : 1;
};
#define WIMLIB_RESOURCE_FLAG_RAW 0x1
#define WIMLIB_RESOURCE_FLAG_MULTITHREADED 0x2
+#define WIMLIB_RESOURCE_FLAG_RECOMPRESS 0x4
/* The opaque structure exposed to the wimlib API. */
-typedef struct WIMStruct {
+struct WIMStruct {
/* A pointer to the file indicated by @filename, opened for reading. */
FILE *fp;
pthread_mutex_t fp_tab_mutex;
#endif
- /* FILE pointer for the WIM file that is being written. */
+ /* FILE pointer for the WIM file (if any) currently being written. */
FILE *out_fp;
/* The name of the WIM file that has been opened. */
/* Pointer to the XML data read from the WIM file. */
u8 *xml_data;
- /* Information retrieved from the XML data, arranged
- * in an orderly manner. */
+ /* Information retrieved from the XML data, arranged in an orderly
+ * manner. */
struct wim_info *wim_info;
- /* Array of the image metadata of length image_count. Each image in the
- * WIM has a image metadata associated with it. */
+ /* Array of the image metadata, one for each image in the WIM. */
struct image_metadata *image_metadata;
/* The header of the WIM file. */
/* %true iff any images have been deleted from this WIM. */
bool deletion_occurred;
-} WIMStruct;
+
+ bool all_images_verified;
+ bool full_verification_in_progress;
+};
/* Inline utility functions for WIMStructs. */
struct hlist_head extra_inodes;
};
-int init_inode_table(struct inode_table *table, size_t capacity);
+extern int init_inode_table(struct inode_table *table, size_t capacity);
static inline void destroy_inode_table(struct inode_table *table)
{
FREE(table->array);
}
-int inode_table_insert(struct dentry *dentry, void *__table);
-u64 assign_inode_numbers(struct hlist_head *inode_list);
-int fix_inodes(struct inode_table *table, struct hlist_head *inode_list);
+extern int inode_table_insert(struct dentry *dentry, void *__table);
+extern u64 assign_inode_numbers(struct hlist_head *inode_list);
+extern int fix_inodes(struct inode_table *table, struct hlist_head *inode_list);
/* header.c */
extern int init_header(struct wim_header *hdr, int ctype);
/* integrity.c */
-extern int write_integrity_table(FILE *out, u64 end_header_offset,
- u64 end_lookup_table_offset,
- int show_progress,
- struct resource_entry *out_res_entry);
+extern int write_integrity_table(FILE *out,
+ struct resource_entry *integrity_res_entry,
+ off_t new_lookup_table_end,
+ off_t old_lookup_table_end,
+ wimlib_progress_func_t progress_func);
-extern int check_wim_integrity(WIMStruct *w, int show_progress);
+extern int check_wim_integrity(WIMStruct *w,
+ wimlib_progress_func_t progress_func);
/* join.c */
struct wim_security_data *,
const struct capture_config *,
int, void *),
- void *extra_arg);
+ void *extra_arg,
+ wimlib_progress_func_t progress_func);
+extern int wim_run_full_verifications(WIMStruct *w);
+
+/* ntfs-apply.c */
+
+struct apply_args {
+ WIMStruct *w;
+ const char *target;
+ int extract_flags;
+ unsigned num_lutimes_warnings;
+ struct list_head *stream_list;
+ union wimlib_progress_info progress;
+#ifdef WITH_NTFS_3G
+ struct _ntfs_volume *vol;
+#endif
+ struct list_head empty_files;
+ wimlib_progress_func_t progress_func;
+};
+
+extern int apply_dentry_ntfs(struct dentry *dentry, void *arg);
+extern int apply_dentry_timestamps_ntfs(struct dentry *dentry, void *arg);
+
+/* ntfs-capture.c */
+extern int build_dentry_tree_ntfs(struct dentry **root_p,
+ const char *device,
+ struct lookup_table *lookup_table,
+ struct wim_security_data *sd,
+ const struct capture_config *config,
+ int add_image_flags,
+ wimlib_progress_func_t progress_func,
+ void *extra_arg);
/* resource.c */
extern const u8 *get_resource_entry(const u8 *p, struct resource_entry *entry);
extern int select_wim_image(WIMStruct *w, int image);
extern int wim_hdr_flags_compression_type(int wim_hdr_flags);
extern int for_image(WIMStruct *w, int image, int (*visitor)(WIMStruct *));
-extern int open_wim_readable(WIMStruct *w, const char *path);
-extern int open_wim_writable(WIMStruct *w, const char *path);
/* Internal use only */
-#define WIMLIB_WRITE_FLAG_NO_LOOKUP_TABLE 0x80000000
+#define WIMLIB_WRITE_FLAG_NO_LOOKUP_TABLE 0x80000000
+#define WIMLIB_WRITE_FLAG_REUSE_INTEGRITY_TABLE 0x40000000
+#define WIMLIB_WRITE_FLAG_CHECKPOINT_AFTER_XML 0x20000000
+#define WIMLIB_WRITE_MASK_PUBLIC 0x1fffffff
+
+/* Internal use only */
+#define WIMLIB_EXTRACT_FLAG_MULTI_IMAGE 0x80000000
+#define WIMLIB_EXTRACT_FLAG_NO_STREAMS 0x40000000
+#define WIMLIB_EXTRACT_MASK_PUBLIC 0x3fffffff
+
/* write.c */
extern int begin_write(WIMStruct *w, const char *path, int write_flags);
-extern int finish_write(WIMStruct *w, int image, int write_flags);
+extern void close_wim_writable(WIMStruct *w);
+extern int finish_write(WIMStruct *w, int image, int write_flags,
+ wimlib_progress_func_t progress_func);
-#include "wimlib.h"
+#if defined(HAVE_SYS_FILE_H) && defined(HAVE_FLOCK)
+extern int lock_wim(FILE *fp, const char *path);
+#else
+static inline int lock_wim(FILE *fp, const char *path)
+{
+ return 0;
+}
+#endif
#endif /* _WIMLIB_INTERNAL_H */