X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fwimlib.h;h=9aa8a05a61b803a91142f6884e6e0b43cee867b4;hp=62e0dc7330cd988509cd5dda357063a9c258a292;hb=cfc2cfc859a047e24d002aa149f73d45d4979d24;hpb=885632f08c75c1d7bb5d25436231c78f6ad7e0c0 diff --git a/src/wimlib.h b/src/wimlib.h index 62e0dc73..9aa8a05a 100644 --- a/src/wimlib.h +++ b/src/wimlib.h @@ -2,23 +2,25 @@ * 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 @@ -134,20 +136,19 @@ * * 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 do - * not expect to be able to use wimlib to image a Windows installation and - * preserve file attributes. - * - 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 do not expect to be able to use wimlib to + * image a Windows installation and preserve file attributes. 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, @@ -175,7 +176,7 @@ * 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 * @@ -233,36 +234,76 @@ enum wim_compression_type { }; /** 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. @@ -287,20 +328,28 @@ enum wimlib_error_code { 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, @@ -350,7 +399,10 @@ enum wimlib_error_code { * 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 @@ -373,6 +425,9 @@ extern int wimlib_add_image(WIMStruct *wim, const char *dir, 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. * @@ -383,7 +438,7 @@ extern int wimlib_add_image(WIMStruct *wim, const char *dir, * @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 @@ -406,7 +461,8 @@ extern int wimlib_create_new_wim(int ctype, WIMStruct **wim_ret); * @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 @@ -454,7 +510,8 @@ extern int wimlib_delete_image(WIMStruct *wim, int image); * 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 @@ -480,8 +537,8 @@ extern int wimlib_delete_image(WIMStruct *wim, int image); * 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. @@ -523,7 +580,8 @@ extern int wimlib_export_image(WIMStruct *src_wim, int src_image, * @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 @@ -639,6 +697,20 @@ extern const char *wimlib_get_image_name(const WIMStruct *wim, int image); */ 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. * @@ -647,7 +719,7 @@ extern int wimlib_get_num_images(const WIMStruct *wim); * @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); /** @@ -664,6 +736,38 @@ 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. * @@ -730,11 +834,16 @@ extern int wimlib_mount(WIMStruct *wim, int image, const char *dir, int flags); * 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. @@ -743,10 +852,10 @@ extern int wimlib_mount(WIMStruct *wim, int image, const char *dir, int flags); * 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 @@ -772,9 +881,9 @@ extern int wimlib_mount(WIMStruct *wim, int image, const char *dir, int flags); * @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. @@ -795,7 +904,7 @@ extern int wimlib_open_wim(const char *wim_file, int flags, * 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 @@ -825,7 +934,7 @@ extern int wimlib_overwrite(WIMStruct *wim, int flags); * 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 @@ -1116,39 +1225,32 @@ int wimlib_set_memory_allocator(void *(*malloc_func)(size_t), 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(). @@ -1250,6 +1352,9 @@ extern int wimlib_unmount(const char *dir, int flags); * 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);