* wimlib.h
*
* External header for wimlib.
- *
+ */
+
+/*
* Copyright (C) 2012 Eric Biggers
*
- * wimlib - Library for working with WIM files
+ * This file is part of wimlib, a library for working with WIM files.
*
- * This library is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option) any
- * later version.
+ * wimlib is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
*
- * This library is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
*
- * You should have received a copy of the GNU Lesser General Public License along
- * with this library; if not, write to the Free Software Foundation, Inc., 59
- * Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with wimlib; if not, see http://www.gnu.org/licenses/.
*/
/** \mainpage
*
* While wimlib supports the main features of WIM files, wimlib currently has
* the following limitations:
- * - wimlib does not support "security data", which describes the access rights
- * of the files in the WIM. This data is very Windows-specific, and it would
- * be difficult to do anything with it. Microsoft's software can still read a
- * WIM without security data, including a boot.wim for Windows PE, but <b>do
- * not expect to be able to use wimlib to image a Windows installation and
- * preserve file attributes</b>.
- * - There is no support for split WIMs, which have an image divided up between
- * multiple WIM files.
+ * - wimlib does not support modifying or creating "security data", which
+ * describes the access rights of the files in the WIM. This data is very
+ * Windows-specific, and it would be difficult to do anything with it.
+ * Microsoft's software can still read a WIM without security data, including
+ * a boot.wim for Windows PE, but <b>do not expect to be able to use wimlib to
+ * image a Windows installation and preserve file attributes</b>. However, by
+ * default, wimlib will preserve security data for existing WIMs.
+ * - There is no way to directly extract or mount split WIMs.
* - There is not yet any code to verify that there are no collisions between
* different files that happen to have the same SHA1 message digest.
* This is extremely unlikely, but could result in something bad such as a
* file going missing.
- * - Alternate stream entries for directory entries are ignored. I'm not sure
- * if these are ever used for anything important.
+ * - Alternate stream entries for directory entries are ignored.
* - Different versions of the WIM file format, if they even exist, are
* unsupported. Let me know if you notice WIM files with a different version.
* - Chunk sizes other than 32768 are unsupported (except for uncompressed WIMs,
* split up LZX compressed blocks, which is not yet implemented in wimlib.
*
* wimlib is experimental and likely contains bugs; use Microsoft's @a
- * imagex.exe if you want to make sure your WIM files are made correctly.
+ * imagex.exe if you want to make sure your WIM files are made "correctly".
*
* \section legal License
*
};
/** Mount the WIM read-write. */
-#define WIMLIB_MOUNT_FLAG_READWRITE 0x1
+#define WIMLIB_MOUNT_FLAG_READWRITE 0x00000001
/** For debugging only. (This passes the @c -d flag to @c fuse_main()).*/
-#define WIMLIB_MOUNT_FLAG_DEBUG 0x2
+#define WIMLIB_MOUNT_FLAG_DEBUG 0x00000002
+
+/** Do not allow accessing alternate data streams. */
+#define WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_NONE 0x00000010
+
+/** Access alternate data streams through extended file attributes. This is the
+ * default mode. */
+#define WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_XATTR 0x00000020
+
+/** Access alternate data streams by specifying the file name, a colon, then the
+ * alternate file stream name. */
+#define WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS 0x00000040
/** Include an integrity table in the new WIM being written during the unmount.
* Ignored for read-only mounts. */
-#define WIMLIB_UNMOUNT_FLAG_CHECK_INTEGRITY 0x1
+#define WIMLIB_UNMOUNT_FLAG_CHECK_INTEGRITY 0x00000001
/** Unless this flag is given, changes to a mounted WIM are discarded. Ignored
* for read-only mounts. */
-#define WIMLIB_UNMOUNT_FLAG_COMMIT 0x2
+#define WIMLIB_UNMOUNT_FLAG_COMMIT 0x00000002
/** Include an integrity table in the new WIM file. */
-#define WIMLIB_WRITE_FLAG_CHECK_INTEGRITY 0x1
+#define WIMLIB_WRITE_FLAG_CHECK_INTEGRITY 0x00000001
/** Print progress information when writing the integrity table. */
-#define WIMLIB_WRITE_FLAG_SHOW_PROGRESS 0x2
+#define WIMLIB_WRITE_FLAG_SHOW_PROGRESS 0x00000002
+
+/** Print file paths as we write then */
+#define WIMLIB_WRITE_FLAG_VERBOSE 0x00000004
/** Mark the image being added as the bootable image of the WIM. */
-#define WIMLIB_ADD_IMAGE_FLAG_BOOT 0x1
+#define WIMLIB_ADD_IMAGE_FLAG_BOOT 0x00000001
+
+/** Print the name of each file or directory as it is scanned to be included in
+ * the WIM image. */
+#define WIMLIB_ADD_IMAGE_FLAG_VERBOSE 0x00000002
+
+/** Apply NTFS-specific information to the captured WIM image. This flag can
+ * only be specified if the directory being captured is on a NTFS filesystem
+ * mounted with NTFS-3g, and wimlib was compiled with support for NTFS-3g */
+#define WIMLIB_ADD_IMAGE_FLAG_NTFS 0x00000004
+
+/** Follow symlinks; archive and dump the files they point to. */
+#define WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE 0x00000008
/** See documentation for wimlib_export_image(). */
-#define WIMLIB_EXPORT_FLAG_BOOT 0x1
+#define WIMLIB_EXPORT_FLAG_BOOT 0x00000001
/** Verify the integrity of the WIM if an integrity table is present. */
-#define WIMLIB_OPEN_FLAG_CHECK_INTEGRITY 0x1
+#define WIMLIB_OPEN_FLAG_CHECK_INTEGRITY 0x00000001
/** Print progress information when verifying integrity table. */
-#define WIMLIB_OPEN_FLAG_SHOW_PROGRESS 0x2
+#define WIMLIB_OPEN_FLAG_SHOW_PROGRESS 0x00000002
+
+/** If this flag is not given, an error is issued if the WIM is part of a split
+ * WIM. */
+#define WIMLIB_OPEN_FLAG_SPLIT_OK 0x00000004
+
+
+/** When identical files are extracted from the WIM, hard link them together. */
+#define WIMLIB_EXTRACT_FLAG_HARDLINK 0x00000001
+
+/** When identical files are extracted from the WIM, symlink them together. */
+#define WIMLIB_EXTRACT_FLAG_SYMLINK 0x00000002
+
+/** Print the name of each file as it is extracted from the WIM image. */
+#define WIMLIB_EXTRACT_FLAG_VERBOSE 0x00000008
/**
* Possible values of the error code returned by many functions in wimlib.
WIMLIB_ERR_INVALID_HEADER_SIZE,
WIMLIB_ERR_INVALID_IMAGE,
WIMLIB_ERR_INVALID_INTEGRITY_TABLE,
+ WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY,
WIMLIB_ERR_INVALID_PARAM,
+ WIMLIB_ERR_INVALID_RESOURCE_HASH,
WIMLIB_ERR_INVALID_RESOURCE_SIZE,
+ WIMLIB_ERR_INVALID_SECURITY_DATA,
WIMLIB_ERR_LINK,
WIMLIB_ERR_MKDIR,
WIMLIB_ERR_MQUEUE,
WIMLIB_ERR_NOMEM,
WIMLIB_ERR_NOTDIR,
WIMLIB_ERR_NOT_A_WIM_FILE,
+ WIMLIB_ERR_NOT_ROOT,
WIMLIB_ERR_NO_FILENAME,
+ WIMLIB_ERR_NTFS_3G,
WIMLIB_ERR_OPEN,
WIMLIB_ERR_OPENDIR,
+ WIMLIB_ERR_READLINK,
WIMLIB_ERR_READ,
WIMLIB_ERR_RENAME,
- WIMLIB_ERR_SPLIT,
+ WIMLIB_ERR_SPECIAL_FILE,
+ WIMLIB_ERR_SPLIT_INVALID,
+ WIMLIB_ERR_SPLIT_UNSUPPORTED,
WIMLIB_ERR_STAT,
WIMLIB_ERR_TIMEOUT,
WIMLIB_ERR_UNKNOWN_VERSION,
* marked as bootable to the one being added. Otherwise, leave the boot
* index unchanged.
*
- * @return 0 on success; nonzero on error.
+ * @return 0 on success; nonzero on error. On error, changes to @a wim are
+ * discarded so that it appears to be in the same state as when this function
+ * was called.
+ *
* @retval ::WIMLIB_ERR_IMAGE_NAME_COLLISION
* There is already an image named @a name in @a w.
* @retval ::WIMLIB_ERR_INVALID_PARAM
const char *name, const char *description,
const char *flags_element, int flags);
+extern int wimlib_apply_image_to_ntfs_volume(WIMStruct *w, int image,
+ const char *device, int flags);
+
/**
* Creates a WIMStruct for a new WIM file.
*
* @param wim_ret
* On success, a pointer to an opaque ::WIMStruct for the new WIM file is
* written to the memory location pointed to by this paramater. The
- * ::WIMStruct must be freed using using FREE() when finished with
+ * ::WIMStruct must be freed using using wimlib_free() when finished with
* it.
* @return 0 on success; nonzero on error.
* @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE
* @param image
* The number of the image to delete, or ::WIM_ALL_IMAGES to delete all
* images.
- * @return 0 on success; nonzero on error.
+ * @return 0 on success; nonzero on error. On error, @a wim is left in an
+ * indeterminate state and should be freed with wimlib_free().
* @retval ::WIMLIB_ERR_DECOMPRESSION
* Could not decompress the metadata resource for @a image.
* @retval ::WIMLIB_ERR_INVALID_DENTRY
* currently marked as bootable in @a src_wim; if that is the case, then
* that image is marked as bootable in the destination WIM.
*
- * @return 0 on success; nonzero on error.
+ * @return 0 on success; nonzero on error. On error, @dest_wim is left in an
+ * indeterminate state and should be freed with wimlib_free().
* @retval ::WIMLIB_ERR_DECOMPRESSION
* Could not decompress the metadata resource for @a src_image
* in @a src_wim
* Could not read the metadata resource for @a src_image from @a src_wim.
*/
extern int wimlib_export_image(WIMStruct *src_wim, int src_image,
- WIMStruct *dest_wim, const char *dest_name,
- const char *dest_description, int flags);
+ WIMStruct *dest_wim, const char *dest_name,
+ const char *dest_description, int flags);
/**
* Extracts an image, or all images, from a WIM file.
* @retval ::WIMLIB_ERR_WRITE
* Failed to write a file being extracted.
*/
-extern int wimlib_extract_image(WIMStruct *wim, int image);
+extern int wimlib_extract_image(WIMStruct *wim, int image,
+ const char *output_dir, int flags);
/**
* Extracts the XML data for a WIM file to a file stream. Every WIM file
*/
extern int wimlib_get_num_images(const WIMStruct *wim);
+/**
+ * Gets the part number of the wim (in a split WIM).
+ *
+ * @param wim
+ * Pointer to the ::WIMStruct for a WIM file.
+ * @param total_parts_ret
+ * If non-@c NULL, the total number of parts in the split WIM (1 for
+ * non-split WIMs) is written to this location.
+ *
+ * @return
+ * The part number of the WIM (1 for non-split WIMs)
+ */
+extern int wimlib_get_part_number(const WIMStruct *wim, int *total_parts_ret);
+
/**
* Returns true if the WIM has an integrity table.
*
* @return
* @c true if the WIM has an integrity table; false otherwise.
*/
-bool wimlib_has_integrity_table(const WIMStruct *wim);
+extern bool wimlib_has_integrity_table(const WIMStruct *wim);
/**
*/
extern bool wimlib_image_name_in_use(const WIMStruct *wim, const char *name);
+/**
+ * Joins a set of split WIMs into a one-part WIM.
+ *
+ * @param swms
+ * An array of strings that give the filenames of all parts of the split
+ * WIM.
+ * @param num_swms
+ * Number of filenames in @a swms.
+ * @param output_path
+ * The path to write the one-part WIM to.
+ * @param flags
+ * ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY to check the split WIMs' integrity
+ * tables (if present) when opening them, and include an integrity table in
+ * the output WIM.
+ *
+ * @return 0 on success; nonzero on error. This function may return any value
+ * returned by wimlib_open_wim() except ::WIMLIB_ERR_SPLIT_UNSUPPORTED, as well
+ * as the following error codes:
+ *
+ * @retval ::WIMLIB_ERR_SPLIT_INVALID
+ * The split WIMs do not form a valid WIM because they do not include all
+ * the parts of the original WIM, there are duplicate parts, or not all the
+ * parts have the same GUID and compression type.
+ * @retval ::WIMLIB_ERR_WRITE
+ * An error occurred when trying to write data to the new WIM at @a output_path.
+ *
+ * Note that this function merely copies the resources, so it will not check to
+ * see if the resources, including the metadata resource, are valid or not.
+ */
+extern int wimlib_join(const char **swms, int num_swms,
+ const char *output_path, int flags);
+
/**
* Mounts an image in a WIM file on a directory read-only or read-write.
*
* digests given in the integrity table.
* If ::WIMLIB_OPEN_FLAG_SHOW_PROGRESS is given, progress information will
* be shown if the integrity of the WIM is checked.
+ * If ::WIMLIB_OPEN_FLAG_SPLIT_OK is given, no error will be issued if the
+ * WIM is part of a split WIM. However, wimlib does not fully support
+ * split WIMs, so not all functions will work correctly after opening a
+ * split WIM. For example, you cannot use wimlib_mount() or
+ * wimlib_extract_image() on a split WIM.
*
* @param wim_ret
* On success, a pointer to an opaque ::WIMStruct for the opened WIM file
* is written to the memory location pointed to by this parameter. The
- * ::WIMStruct must be freed using using FREE() when finished with
+ * ::WIMStruct must be freed using using wimlib_free() when finished with
* it.
*
* @return 0 on success; nonzero on error.
* added to wimlib if needed, but it appears to be the case that the lookup
* table is never compressed.
* @retval ::WIMLIB_ERR_IMAGE_COUNT
- * The number of metadata resources found in the WIM did not match the
- * image count given in the WIM header, or the number of <IMAGE>
- * elements in the XML data for the WIM did not match the image count given
- * in the WIM header.
+ * The WIM is not the non-first part of a split WIM, and the number of
+ * metadata resources found in the WIM did not match the image count given
+ * in the WIM header, or the number of <IMAGE> elements in the XML
+ * data for the WIM did not match the image count given in the WIM header.
* @retval ::WIMLIB_ERR_INTEGRITY
* ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY was specified in @a flags and @a
* wim_file contains an integrity table, but the SHA1 message digest for a
* @retval ::WIMLIB_ERR_READ
* An unexpected end-of-file or read error occurred when trying to read
* data from @a wim_file.
- * @retval ::WIMLIB_ERR_SPLIT
- * @a wim_file is a split WIM. wimlib does not support this kind of
- * WIM.
+ * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED
+ * @a wim_file is a split WIM, but ::WIMLIB_OPEN_FLAG_SPLIT_OK was not
+ * givin in @a flags.
* @retval ::WIMLIB_ERR_UNKNOWN_VERSION
* A number other than 0x10d00 is written in the version field of the WIM
* header of @a wim_file.
* before having written the new file because it is very likely that file
* resources in the new WIM file need to be retrieved from the old WIM file.
*
- * After this function returns, @a wim must be freed using FREE(). Any
+ * After this function returns, @a wim must be freed using wimlib_free(). Any
* further actions on @a wim before doing this are undefined.
*
* @param wim
* added, removed, or changed in the WIM. It must be used when only the boot
* index or the name or description of image(s) has been changed.
*
- * After this function returns, @a wim must be freed using FREE(). Any
+ * After this function returns, @a wim must be freed using wimlib_free(). Any
* further actions on @a wim before doing this are undefined.
*
* @param wim
extern int wimlib_set_print_errors(bool show_messages);
/**
- * Sets whether wimlib is to be verbose when extracting files from a WIM or when
- * creating an image from a directory (i.e. whether it will print all affected
- * files or not.) This is a per-WIM parameter.
- *
- * @param wim
- * Pointer to the ::WIMStruct for the WIM file.
- * @param verbose
- * Whether wimlib is to be verbose when extracting files from @a wim using
- * wimlib_extract_image() or when adding an image to @a wim using
- * wimlib_add_image().
+ * Splits a WIM into multiple parts.
+ *
+ * @param wimfile
+ * Name of the WIM file to split. It must be a standalone, one-part WIM.
+ * @param swm_name
+ * Name of the SWM file to create. This will be the name of the first
+ * part. The other parts will have the same name with 2, 3, 4, ..., etc.
+ * appended.
+ * @param part_size
+ * The maximum size per part. It is not guaranteed that this will really
+ * be the maximum size per part, because some file resources in the WIM may
+ * be larger than this size, and the WIM file format provides no way to
+ * split up file resources among multiple WIMs.
+ * @param flags
+ * Bitwise OR of ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY and/or
+ * ::WIMLIB_OPEN_FLAG_SHOW_PROGRESS.
*
- * @return This function has no return value.
- */
-extern void wimlib_set_verbose(WIMStruct *wim, bool verbose);
-
-/**
- * Sets and creates the directory to which files are to be extracted when
- * extracting files from the WIM.
+ * @return 0 on success; nonzero on error. This function may return any value
+ * returned by wimlib_open_wim() as well as the following error codes:
*
- * @param wim
- * Pointer to the ::WIMStruct for the WIM file.
- * @param dir
- * The name of the directory to extract files to.
+ * @retval ::WIMLIB_ERR_WRITE
+ * An error occurred when trying to write data to one of the split WIMs.
*
- * @return 0 on success; nonzero on error.
- * @retval ::WIMLIB_ERR_INVALID_PARAM
- * @a dir was @c NULL.
- * @retval ::WIMLIB_ERR_MKDIR
- * @a dir does not already exist and it could not created.
- * @retval ::WIMLIB_ERR_NOMEM
- * Failed to allocate the memory needed to duplicate the @a dir string.
*/
-extern int wimlib_set_output_dir(WIMStruct *wim, const char *dir);
+extern int wimlib_split(const char *wimfile, const char *swm_name,
+ size_t part_size, int flags);
/**
* Unmounts a WIM image that was mounted using wimlib_mount().
* with @a wim, or some file resources in @a wim refer to files in the
* outside filesystem, and a read error occurred when reading one of these
* files.
+ * @retval ::WIMLIB_ERR_WRITE
+ * An error occurred when trying to write data to the new WIM file at @a
+ * path.
*/
extern int wimlib_write(WIMStruct *wim, const char *path, int image, int flags);