]> wimlib.net Git - wimlib/blobdiff - include/wimlib.h
v1.11.0
[wimlib] / include / wimlib.h
index 667b2b923e0ebb744a40ad846226d09e28ba14dc..135f5cb4bc91ec94026fd953aedcd062e73c662d 100644 (file)
 /**
  * @mainpage
  *
- * This is the documentation for the library interface of wimlib 1.9.1, a C
+ * This is the documentation for the library interface of wimlib 1.11.0, a C
  * library for creating, modifying, extracting, and mounting files in the
- * Windows Imaging Format.  This documentation is intended for developers only.
- * If you have installed wimlib and want to know how to use the @b wimlib-imagex
- * program, please see the manual pages and also the <a
- * href="https://wimlib.net/gitlist/wimlib/blob/master/README">README file</a>.
+ * Windows Imaging (WIM) format.  This documentation is intended for developers
+ * only.  If you have installed wimlib and want to know how to use the @b
+ * wimlib-imagex program, please see the manual pages and also the <a
+ * href="https://wimlib.net/git/?p=wimlib;a=blob;f=README">README file</a>.
  *
  * @section sec_installing Installing
  *
  *
  * Download the Windows binary distribution with the appropriate architecture
  * (i686 or x86_64 --- also called "x86" and "amd64" respectively) from
- * https://wimlib.net.  Link your program with the libwim-15.dll file.  Make
- * sure to also download the source code so you can get wimlib.h, as it is not
- * included in the binary distribution.  If you need to access the DLL from
- * other programming languages, note that the calling convention is "cdecl".
+ * https://wimlib.net.  Link your program with libwim-15.dll.  If needed by your
+ * programming language or development environment, the import library
+ * libwim.lib and C/C++ header wimlib.h can be found in the directory "devel" in
+ * the ZIP file.
  *
- * Note that wimlib is developed using MinGW-w64, and there may be a little work
- * required if you plan to use the header and DLL with Visual Studio.
+ * If you need to access the DLL from non-C/C++ programming languages, note that
+ * the calling convention is "cdecl".
+ *
+ * If you want to build wimlib from source on Windows, see README.WINDOWS.  This
+ * is only needed if you are making modifications to wimlib.
  *
  * @section sec_examples Examples
  *
@@ -45,7 +48,7 @@
  * distribution.  Also see @ref sec_basic_wim_handling_concepts below.
  *
  * There is also the <a
- * href="https://wimlib.net/gitlist/wimlib/blob/master/programs/imagex.c">
+ * href="https://wimlib.net/git/?p=wimlib;a=blob;f=programs/imagex.c">
  * source code of <b>wimlib-imagex</b></a>, which is complicated but uses most
  * capabilities of wimlib.
  *
  * messages and strings (as well as all documentation, for that matter) are only
  * available in English.
  *
- * @section sec_encodings Locales and character encodings
+ * @section sec_encodings Character encoding
  *
  * To support Windows as well as UNIX-like systems, wimlib's API typically takes
- * and returns strings of ::wimlib_tchar, which are in a platform-dependent
- * encoding.
+ * and returns strings of ::wimlib_tchar which have a platform-dependent type
+ * and encoding.
  *
- * On Windows, each ::wimlib_tchar is 2 bytes and is the same as a "wchar_t",
- * and the encoding is UTF-16LE.
+ * On Windows, each ::wimlib_tchar is a 2-byte <tt>wchar_t</tt>.  The encoding
+ * is meant to be UTF-16LE.  However, unpaired surrogates are permitted because
+ * neither Windows nor the NTFS filesystem forbids them in filenames.
  *
- * On UNIX-like systems, each ::wimlib_tchar is 1 byte and is simply a "char",
- * and the encoding is the locale-dependent multibyte encoding.  I recommend you
- * set your locale to a UTF-8 capable locale to avoid any issues.  Also, by
- * default, wimlib on UNIX will assume the locale is UTF-8 capable unless you
- * call wimlib_global_init() after having set your desired locale.
+ * On UNIX-like systems, each ::wimlib_tchar is a 1 byte <tt>char</tt>.  The
+ * encoding is meant to be UTF-8.  However, for compatibility with Windows-style
+ * filenames that are not valid UTF-16LE, surrogate codepoints are permitted.
+ * Other multibyte encodings (e.g. ISO-8859-1) or garbage sequences of bytes are
+ * not permitted.
  *
  * @section sec_advanced Additional information and features
  *
 
 #include <stdio.h>
 #include <stddef.h>
-#include <stdbool.h>
-#include <inttypes.h>
+#ifndef __cplusplus
+#  if defined(_MSC_VER) && _MSC_VER < 1800 /* VS pre-2013? */
+     typedef unsigned char bool;
+#  else
+#    include <stdbool.h>
+#  endif
+#endif
+#include <stdint.h>
 #include <time.h>
 
 /** @addtogroup G_general
 #define WIMLIB_MAJOR_VERSION 1
 
 /** Minor version of the library (for example, the 2 in 1.2.5). */
-#define WIMLIB_MINOR_VERSION 9
+#define WIMLIB_MINOR_VERSION 11
 
 /** Patch version of the library (for example, the 5 in 1.2.5). */
-#define WIMLIB_PATCH_VERSION 1
+#define WIMLIB_PATCH_VERSION 0
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+/*
+ * To represent file timestamps, wimlib's API uses the POSIX 'struct timespec'.
+ * This was probably a mistake because it doesn't play well with Visual Studio.
+ * In old VS versions it isn't present at all; in newer VS versions it is
+ * supposedly present, but I wouldn't trust it to be the same size as the one
+ * MinGW uses.  The solution is to define a compatible structure ourselves when
+ * this header is included on Windows and the compiler is not MinGW.
+ */
+#if defined(_WIN32) && !defined(__GNUC__)
+typedef struct {
+       /* Seconds since start of UNIX epoch (January 1, 1970) */
+#ifdef _WIN64
+       int64_t tv_sec;
+#else
+       int32_t tv_sec;
+#endif
+       /* Nanoseconds (0-999999999) */
+       int32_t tv_nsec;
+} wimlib_timespec;
+#else
+#  define wimlib_timespec  struct timespec  /* standard definition */
+#endif
+
 /**
  * Opaque structure that represents a WIM, possibly backed by an on-disk file.
  * See @ref sec_basic_wim_handling_concepts for more information.
@@ -416,14 +449,14 @@ typedef struct WIMStruct WIMStruct;
 #define WIMLIB_WIMSTRUCT_DECLARED
 #endif
 
-#ifdef __WIN32__
+#ifdef _WIN32
 typedef wchar_t wimlib_tchar;
 #else
 /** See @ref sec_encodings */
 typedef char wimlib_tchar;
 #endif
 
-#ifdef __WIN32__
+#ifdef _WIN32
 /** Path separator for WIM paths passed back to progress callbacks.
  * This is forward slash on UNIX and backslash on Windows.  */
 #  define WIMLIB_WIM_PATH_SEPARATOR '\\'
@@ -1558,13 +1591,13 @@ struct wimlib_dir_entry {
        uint64_t hard_link_group_id;
 
        /** Time this file was created.  */
-       struct timespec creation_time;
+       wimlib_timespec creation_time;
 
        /** Time this file was last written to.  */
-       struct timespec last_write_time;
+       wimlib_timespec last_write_time;
 
        /** Time this file was last accessed.  */
-       struct timespec last_access_time;
+       wimlib_timespec last_access_time;
 
        /** The UNIX user ID of this file.  This is a wimlib extension.
         *
@@ -1678,8 +1711,9 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour
 
 /** UNIX-like systems only: Store the UNIX owner, group, mode, and device ID
  * (major and minor number) of each file.  In addition, capture special files
- * such as device nodes and FIFOs.  See the documentation for the
- * <b>--unix-data</b> option to <b>wimcapture</b> for more information.  */
+ * such as device nodes and FIFOs.  Since wimlib v1.11.0, on Linux also capture
+ * extended attributes.  See the documentation for the <b>--unix-data</b> option
+ * to <b>wimcapture</b> for more information.  */
 #define WIMLIB_ADD_FLAG_UNIX_DATA              0x00000010
 
 /** Do not capture security descriptors.  Only has an effect in NTFS-3G capture
@@ -1871,9 +1905,8 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour
  * wimlib_extract_paths() when passed multiple paths.  */
 #define WIMLIB_EXTRACT_FLAG_NTFS                       0x00000001
 
-/** UNIX-like systems only:  Extract special UNIX data captured with
- * ::WIMLIB_ADD_FLAG_UNIX_DATA.  This flag cannot be combined with
- * ::WIMLIB_EXTRACT_FLAG_NTFS.  */
+/** UNIX-like systems only:  Extract UNIX-specific metadata captured with
+ * ::WIMLIB_ADD_FLAG_UNIX_DATA.  */
 #define WIMLIB_EXTRACT_FLAG_UNIX_DATA                  0x00000020
 
 /** Do not extract security descriptors.  This flag cannot be combined with
@@ -2033,8 +2066,7 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour
  * name, a colon, then the name of the data stream.  */
 #define WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS     0x00000010
 
-/** Use UNIX metadata if available in the WIM image.  See
- * ::WIMLIB_ADD_FLAG_UNIX_DATA.  */
+/** Support UNIX owners, groups, modes, and special files.  */
 #define WIMLIB_MOUNT_FLAG_UNIX_DATA                    0x00000020
 
 /** Allow other users to see the mounted filesystem.  This passes the @c
@@ -2323,9 +2355,7 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour
 /** @addtogroup G_general
  * @{ */
 
-/** Assume that strings are represented in UTF-8, even if this is not the
- * locale's character encoding.  This flag is ignored on Windows, where wimlib
- * always uses UTF-16LE.  */
+/** Deprecated; no longer has any effect.  */
 #define WIMLIB_INIT_FLAG_ASSUME_UTF8                   0x00000001
 
 /** Windows-only: do not attempt to acquire additional privileges (currently
@@ -2462,7 +2492,6 @@ enum wimlib_error_code {
        WIMLIB_ERR_DECOMPRESSION                      = 2,
        WIMLIB_ERR_FUSE                               = 6,
        WIMLIB_ERR_GLOB_HAD_NO_MATCHES                = 8,
-       WIMLIB_ERR_ICONV_NOT_AVAILABLE                = 9,
        WIMLIB_ERR_IMAGE_COUNT                        = 10,
        WIMLIB_ERR_IMAGE_NAME_COLLISION               = 11,
        WIMLIB_ERR_INSUFFICIENT_PRIVILEGES            = 12,
@@ -2475,7 +2504,6 @@ enum wimlib_error_code {
        WIMLIB_ERR_INVALID_INTEGRITY_TABLE            = 19,
        WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY         = 20,
        WIMLIB_ERR_INVALID_METADATA_RESOURCE          = 21,
-       WIMLIB_ERR_INVALID_MULTIBYTE_STRING           = 22,
        WIMLIB_ERR_INVALID_OVERLAY                    = 23,
        WIMLIB_ERR_INVALID_PARAM                      = 24,
        WIMLIB_ERR_INVALID_PART_NUMBER                = 25,
@@ -2538,6 +2566,8 @@ enum wimlib_error_code {
        WIMLIB_ERR_DUPLICATE_EXPORTED_IMAGE           = 87,
        WIMLIB_ERR_CONCURRENT_MODIFICATION_DETECTED   = 88,
        WIMLIB_ERR_SNAPSHOT_FAILURE                   = 89,
+       WIMLIB_ERR_INVALID_XATTR                      = 90,
+       WIMLIB_ERR_SET_XATTR                          = 91,
 };
 
 
@@ -3278,9 +3308,8 @@ wimlib_get_xml_data(WIMStruct *wim, void **buf_ret, size_t *bufsize_ret);
  *
  * Initialization function for wimlib.  Call before using any other wimlib
  * function (except possibly wimlib_set_print_errors()).  If not done manually,
- * this function will be called automatically with @p init_flags set to
- * ::WIMLIB_INIT_FLAG_ASSUME_UTF8.  This function does nothing if called again
- * after it has already successfully run.
+ * this function will be called automatically with a flags argument of 0.  This
+ * function does nothing if called again after it has already successfully run.
  *
  * @param init_flags
  *     Bitwise OR of flags prefixed with WIMLIB_INIT_FLAG.