]> wimlib.net Git - wimlib/blobdiff - include/wimlib.h
Doc fixes
[wimlib] / include / wimlib.h
index 0ffc302e0934a39dc23209ca64d2965e38a94bcc..087868a59d70ba4cca9a536e92a67be2752e4dd8 100644 (file)
 #include <stddef.h>
 #include <stdbool.h>
 #include <inttypes.h>
+#include <time.h>
 
 /** Major version of the library (for example, the 1 in 1.2.5). */
 #define WIMLIB_MAJOR_VERSION 1
@@ -717,6 +718,170 @@ struct wimlib_wim_info {
        uint32_t reserved[9];
 };
 
+/** Information about a unique resource in the WIM file.
+ */
+struct wimlib_resource_entry {
+       /** Uncompressed size of the resource in bytes. */
+       uint64_t uncompressed_size;
+
+       /** Compressed size of the resource in bytes.  This will be the same as
+        * @a uncompressed_size if the resource is uncompressed.  */
+       uint64_t compressed_size;
+
+       /** Offset, in bytes, of this resource from the start of the WIM file.
+        */
+       uint64_t offset;
+
+       /** SHA1 message digest of the resource's uncompressed contents.  */
+       uint8_t sha1_hash[20];
+
+       /** Which part number of the split WIM this resource is in.  This should
+        * be the same as the part number provided by wimlib_get_wim_info().  */
+       uint32_t part_number;
+
+       /** Number of times this resource is referenced over all WIM images.  */
+       uint32_t reference_count;
+
+       /** 1 if this resource is compressed.  */
+       uint32_t is_compressed : 1;
+
+       /** 1 if this resource is a metadata resource rather than a file
+        * resource.  */
+       uint32_t is_metadata : 1;
+
+       uint32_t is_free : 1;
+       uint32_t is_spanned : 1;
+       uint32_t reserved_flags : 28;
+       uint64_t reserved[4];
+};
+
+/** A stream of a file in the WIM.  */
+struct wimlib_stream_entry {
+       /** Name of the stream, or NULL if the stream is unnamed. */
+       const wimlib_tchar *stream_name;
+       /** Location, size, etc. of the stream within the WIM file.  */
+       struct wimlib_resource_entry resource;
+       uint64_t reserved[4];
+};
+
+/** Structure passed to the wimlib_iterate_dir_tree() callback function.
+ * Roughly, the information about a "file" in the WIM--- but really a directory
+ * entry ("dentry") because hard links are allowed.  The hard_link_group_id
+ * field can be used to distinguish actual file inodes.  */
+struct wimlib_dir_entry {
+       /** Name of the file, or NULL if this file is unnamed (only possible for
+        * the root directory) */
+       const wimlib_tchar *filename;
+
+       /** 8.3 DOS name of this file, or NULL if this file has no such name.
+        * */
+       const wimlib_tchar *dos_name;
+
+       /** Full path to this file within the WIM image.  */
+       const wimlib_tchar *full_path;
+
+       /** Depth of this directory entry, where 0 is the root, 1 is the root's
+        * children, ..., etc. */
+       size_t depth;
+
+       /** Pointer to the security descriptor for this file, in Windows
+        * SECURITY_DESCRIPTOR_RELATIVE format, or NULL if this file has no
+        * security descriptor.  */
+       const char *security_descriptor;
+
+       /** Length of the above security descriptor.  */
+       size_t security_descriptor_size;
+
+#define WIMLIB_FILE_ATTRIBUTE_READONLY            0x00000001
+#define WIMLIB_FILE_ATTRIBUTE_HIDDEN              0x00000002
+#define WIMLIB_FILE_ATTRIBUTE_SYSTEM              0x00000004
+#define WIMLIB_FILE_ATTRIBUTE_DIRECTORY           0x00000010
+#define WIMLIB_FILE_ATTRIBUTE_ARCHIVE             0x00000020
+#define WIMLIB_FILE_ATTRIBUTE_DEVICE              0x00000040
+#define WIMLIB_FILE_ATTRIBUTE_NORMAL              0x00000080
+#define WIMLIB_FILE_ATTRIBUTE_TEMPORARY           0x00000100
+#define WIMLIB_FILE_ATTRIBUTE_SPARSE_FILE         0x00000200
+#define WIMLIB_FILE_ATTRIBUTE_REPARSE_POINT       0x00000400
+#define WIMLIB_FILE_ATTRIBUTE_COMPRESSED          0x00000800
+#define WIMLIB_FILE_ATTRIBUTE_OFFLINE             0x00001000
+#define WIMLIB_FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
+#define WIMLIB_FILE_ATTRIBUTE_ENCRYPTED           0x00004000
+#define WIMLIB_FILE_ATTRIBUTE_VIRTUAL             0x00010000
+       /** File attributes, such as whether the file is a directory or not.
+        * These are the "standard" Windows FILE_ATTRIBUTE_* values, although in
+        * wimlib.h they are defined as WIMLIB_FILE_ATTRIBUTE_* for convenience
+        * on other platforms.  */
+       uint32_t attributes;
+
+#define WIMLIB_REPARSE_TAG_RESERVED_ZERO       0x00000000
+#define WIMLIB_REPARSE_TAG_RESERVED_ONE                0x00000001
+#define WIMLIB_REPARSE_TAG_MOUNT_POINT         0xA0000003
+#define WIMLIB_REPARSE_TAG_HSM                 0xC0000004
+#define WIMLIB_REPARSE_TAG_HSM2                        0x80000006
+#define WIMLIB_REPARSE_TAG_DRIVER_EXTENDER     0x80000005
+#define WIMLIB_REPARSE_TAG_SIS                 0x80000007
+#define WIMLIB_REPARSE_TAG_DFS                 0x8000000A
+#define WIMLIB_REPARSE_TAG_DFSR                        0x80000012
+#define WIMLIB_REPARSE_TAG_FILTER_MANAGER      0x8000000B
+#define WIMLIB_REPARSE_TAG_SYMLINK             0xA000000C
+       /** If the file is a reparse point (FILE_ATTRIBUTE_DIRECTORY set in the
+        * attributes), this will give the reparse tag.  This tells you whether
+        * the reparse point is a symbolic link, junction point, or some other,
+        * more unusual kind of reparse point.  */
+       uint32_t reparse_tag;
+
+       /*  Number of (hard) links to this file.  */
+       uint32_t num_links;
+
+       /** Number of named data streams that this file has.  Normally 0.  */
+       uint32_t num_named_streams;
+
+       /** Roughly, the inode number of this file.  However, it may be 0 if
+        * @a num_links == 1.  */
+       uint64_t hard_link_group_id;
+
+       /** Time this file was created.  */
+       struct timespec creation_time;
+
+       /** Time this file was last written to.  */
+       struct timespec last_write_time;
+
+       /** Time this file was last accessed.  */
+       struct timespec last_access_time;
+       uint64_t reserved[16];
+
+       /** Array of streams that make up this file.  The first entry will
+        * always exist and will correspond to the unnamed data stream (default
+        * file contents), so it will have @a stream_name == @c NULL.  There
+        * will then be @a num_named_streams additional entries that specify the
+        * named data streams, if any, each of which will have @a stream_name !=
+        * @c NULL.  */
+       struct wimlib_stream_entry streams[];
+};
+
+/**
+ * Type of a callback function to wimlib_iterate_dir_tree().  Must return 0 on
+ * success.
+ */
+typedef int (*wimlib_iterate_dir_tree_callback_t)(const struct wimlib_dir_entry *dentry,
+                                                 void *user_ctx);
+
+/**
+ * Type of a callback function to wimlib_iterate_lookup_table().  Must return 0
+ * on success.
+ */
+typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resource_entry *resource,
+                                                     void *user_ctx);
+
+/** For wimlib_iterate_dir_tree(): Iterate recursively on children rather than
+ * just on the specified path. */
+#define WIMLIB_ITERATE_DIR_TREE_FLAG_RECURSIVE 0x00000001
+
+/** For wimlib_iterate_dir_tree(): Don't iterate on the file or directory
+ * itself; only its children (in the case of a non-empty directory) */
+#define WIMLIB_ITERATE_DIR_TREE_FLAG_CHILDREN  0x00000002
+
+
 
 /*****************************
  * WIMLIB_ADD_FLAG_*
@@ -1840,6 +2005,76 @@ wimlib_has_integrity_table(const WIMStruct *wim) _wimlib_deprecated;
 extern bool
 wimlib_image_name_in_use(const WIMStruct *wim, const wimlib_tchar *name);
 
+/**
+ * Iterate through a file or directory tree in the WIM image.  By specifying
+ * appropriate flags and a callback function, you can get the attributes of a
+ * file in the WIM, get a directory listing, or even get a listing of the entire
+ * WIM image.
+ *
+ * @param wim
+ *     Pointer to the ::WIMStruct for a standalone WIM file, or part 1 of a
+ *     split WIM.
+ *
+ * @param image
+ *     The 1-based number of the image in @a wim that contains the files or
+ *     directories to iterate over.
+ *
+ * @param path
+ *     Path in the WIM image at which to do the iteration.
+ *
+ * @param flags
+ *     Bitwise OR of ::WIMLIB_ITERATE_DIR_TREE_FLAG_RECURSIVE and/or
+ *     ::WIMLIB_ITERATE_DIR_TREE_FLAG_CHILDREN.
+ *
+ * @param cb
+ *     A callback function that will receive each directory entry.
+ *
+ * @param user_ctx
+ *     An extra parameter that will always be passed to the callback function
+ *     @a cb.
+ *
+ * @return Normally, returns 0 if all calls to @a cb returned 0; otherwise the
+ * first nonzero value that was returned from @a cb.  However, additional error
+ * codes may be returned, including the following:
+ *
+ * @retval ::WIMLIB_ERR_PATH_DOES_NOT_EXIST
+ *     @a path did not exist in the WIM image.
+ * @retval ::WIMLIB_ERR_NOMEM
+ *     Failed to allocate memory needed to create a ::wimlib_dir_entry.
+ */
+extern int
+wimlib_iterate_dir_tree(WIMStruct *wim, int image, const wimlib_tchar *path,
+                       int flags,
+                       wimlib_iterate_dir_tree_callback_t cb, void *user_ctx);
+
+/**
+ * Iterate through the lookup table of a WIM file.  This can be used to directly
+ * get a listing of the unique resources contained in a WIM file.  Both file
+ * resources and metadata resources are included.
+ *
+ * @param wim
+ *     Pointer to the ::WIMStruct of a standalone WIM file or a split WIM part.
+ *     Note: metadata resources will only be included if the WIM is standalone
+ *     or the first part of the split WIM.
+ *
+ * @param flags
+ *     Reserved; set to 0.
+ *
+ * @param cb
+ *     A callback function that will receive each resource.
+ *
+ * @param user_ctx
+ *     An extra parameter that will always be passed to the callback function
+ *     @a cb.
+ *
+ * @return 0 if all calls to @a cb returned 0; otherwise the first nonzero value
+ * that was returned from @a cb.
+ */
+extern int
+wimlib_iterate_lookup_table(WIMStruct *wim, int flags,
+                           wimlib_iterate_lookup_table_callback_t cb,
+                           void *user_ctx);
+
 /**
  * Joins a split WIM into a stand-alone one-part WIM.
  *
@@ -2226,119 +2461,39 @@ extern void
 wimlib_print_available_images(const WIMStruct *wim, int image);
 
 /**
- * Prints the full paths to all files contained in an image, or all images, in a
- * WIM file.
- *
- * @param wim
- *     Pointer to the ::WIMStruct for a WIM file.
- * @param image
- *     Which image to print files for.  Can be the number of an image, or
- *     ::WIMLIB_ALL_IMAGES to print the files contained in all images.
- *
- * @return 0 on success; nonzero on error.
- * @retval ::WIMLIB_ERR_DECOMPRESSION
- *     The metadata resource for one of the specified images could not be
- *     decompressed.
- * @retval ::WIMLIB_ERR_INVALID_DENTRY
- *     A directory entry in the metadata resource for one of the specified
- *     images is invaled.
- * @retval ::WIMLIB_ERR_INVALID_IMAGE
- *     @a image does not specify a valid image in @a wim, and is not
- *     ::WIMLIB_ALL_IMAGES.
- * @retval ::WIMLIB_ERR_INVALID_RESOURCE_SIZE
- *     The metadata resource for one of the specified images is invalid.
- * @retval ::WIMLIB_ERR_INVALID_SECURITY_DATA
- *     The security data for one of the specified images is invalid.
- * @retval ::WIMLIB_ERR_NOMEM
- *     Failed to allocate needed memory.
- * @retval ::WIMLIB_ERR_READ
- *     An unexpected read error or end-of-file occurred when reading the
- *     metadata resource for one of the specified images.
- * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED
- *     @a wim was not a standalone WIM and was not the first part of a split
- *     WIM.
+ * Deprecated in favor of wimlib_iterate_dir_tree(), which provides the
+ * information in a way that can be accessed programatically.
  */
 extern int
-wimlib_print_files(WIMStruct *wim, int image);
+wimlib_print_files(WIMStruct *wim, int image) _wimlib_deprecated;
 
 /**
- * Prints detailed information from the header of a WIM file.
- *
- * @param wim
- *     Pointer to the ::WIMStruct for a WIM file.  It may be either a
- *     standalone WIM or part of a split WIM.
- *
- * @return This function has no return value.
- *
+ * Deprecated in favor of wimlib_get_wim_info(), which provides the information
+ * in a way that can be accessed programatically.
  */
 extern void
-wimlib_print_header(const WIMStruct *wim);
+wimlib_print_header(const WIMStruct *wim) _wimlib_deprecated;
 
 /**
- * Prints the lookup table of a WIM file.  The lookup table maps SHA1 message
- * digests, as found in the directory entry tree in the WIM file, to file
- * resources in the WIM file.  This table includes one entry for each unique
- * file in the WIM, so it can be quite long.  There is only one lookup table per
- * WIM file, but each split WIM part has its own lookup table.
- *
- * @param wim
- *     Pointer to the ::WIMStruct for a WIM file.
- *
- * @return This function has no return value.
+ * Deprecated in favor of wimlib_iterate_lookup_table(), which provides the
+ * information in a way that can be accessed programatically.
  */
 extern void
-wimlib_print_lookup_table(WIMStruct *wim);
+wimlib_print_lookup_table(WIMStruct *wim) _wimlib_deprecated;
 
 /**
- * Prints the metadata of the specified image in a WIM file.  The metadata
- * consists of the security data as well as the directory entry tree.  Each
- * image has its own metadata.
- *
- * @param wim
- *     Pointer to the ::WIMStruct for a WIM file.
- * @param image
- *     Which image to print the metadata for.  Can be the number of an image,
- *     or ::WIMLIB_ALL_IMAGES to print the metadata for all images in the WIM.
- *
- * @return 0 on success; nonzero on error.
- * @retval ::WIMLIB_ERR_DECOMPRESSION
- *     The metadata resource for one of the specified images could not be
- *     decompressed.
- * @retval ::WIMLIB_ERR_INVALID_DENTRY
- *     A directory entry in the metadata resource for one of the specified
- *     images is invaled.
- * @retval ::WIMLIB_ERR_INVALID_IMAGE
- *     @a image does not specify a valid image in @a wim, and is not
- *     ::WIMLIB_ALL_IMAGES.
- * @retval ::WIMLIB_ERR_INVALID_RESOURCE_SIZE
- *     The metadata resource for one of the specified images is invalid.
- * @retval ::WIMLIB_ERR_INVALID_SECURITY_DATA
- *     The security data for one of the specified images is invalid.
- * @retval ::WIMLIB_ERR_NOMEM
- *     Failed to allocate needed memory.
- * @retval ::WIMLIB_ERR_READ
- *     An unexpected read error or end-of-file occurred when reading the
- *     metadata resource for one of the specified images.
- * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED
- *     @a wim was not a standalone WIM and was not the first part of a split
- *     WIM.
+ * Deprecated in favor of wimlib_iterate_dir_tree(), which provides the
+ * information in a way that can be accessed programatically.
  */
 extern int
-wimlib_print_metadata(WIMStruct *wim, int image);
+wimlib_print_metadata(WIMStruct *wim, int image) _wimlib_deprecated;
 
 /**
- * Prints some basic information about a WIM file.  All information printed by
- * this function is also printed by wimlib_print_header(), but
- * wimlib_print_wim_information() prints some of this information more concisely
- * and in a more readable form.
- *
- * @param wim
- *     Pointer to the ::WIMStruct for a WIM file.
- *
- * @return This function has no return value.
+ * Deprecated in favor of wimlib_get_wim_info(), which provides the information
+ * in a way that can be accessed programatically.
  */
 extern void
-wimlib_print_wim_information(const WIMStruct *wim);
+wimlib_print_wim_information(const WIMStruct *wim) _wimlib_deprecated;
 
 /**
  * Translates a string specifying the name or number of an image in the WIM into