* scanned. */
#define WIMLIB_ADD_FLAG_VERBOSE 0x00000004
-/** Mark the image being added as the bootable image of the WIM. */
+/** Mark the image being added as the bootable image of the WIM. Not valid for
+ * wimlib_update_image(). */
#define WIMLIB_ADD_FLAG_BOOT 0x00000008
/** Store the UNIX owner, group, and mode. This is done by adding a special
/** @ingroup G_nonstandalone_wims
* @{ */
-/** wimlib_reference_resource_files() only: Enable shell-style filename
- * globbing. */
+/** For wimlib_reference_resource_files(), enable shell-style filename globbing.
+ * Ignored by wimlib_reference_resources(). */
#define WIMLIB_REF_FLAG_GLOB_ENABLE 0x00000001
-/** wimlib_reference_resource_files() only: Issue an error
+/** For wimlib_reference_resource_files(), issue an error
* (::WIMLIB_ERR_GLOB_HAD_NO_MATCHES) if a glob did not match any files. The
* default behavior without this flag is to issue no error at that point, but
* then attempt to open the glob as a literal path, which of course will fail
* anyway if no file exists at that path. No effect if
- * ::WIMLIB_REF_FLAG_GLOB_ENABLE is not also specified. */
+ * ::WIMLIB_REF_FLAG_GLOB_ENABLE is not also specified. Ignored by
+ * wimlib_reference_resources(). */
#define WIMLIB_REF_FLAG_GLOB_ERR_ON_NOMATCH 0x00000002
/** @} */
#define WIMLIB_WRITE_FLAG_USE_EXISTING_TOTALBYTES 0x04000000
#define WIMLIB_WRITE_FLAG_NO_METADATA 0x02000000
#define WIMLIB_WRITE_FLAG_OVERWRITE 0x01000000
-#define WIMLIB_WRITE_MASK_PUBLIC 0x00ffffff
+
+/* Keep in sync with wimlib.h */
+#define WIMLIB_WRITE_MASK_PUBLIC ( \
+ WIMLIB_WRITE_FLAG_CHECK_INTEGRITY | \
+ WIMLIB_WRITE_FLAG_NO_CHECK_INTEGRITY | \
+ WIMLIB_WRITE_FLAG_PIPABLE | \
+ WIMLIB_WRITE_FLAG_NOT_PIPABLE | \
+ WIMLIB_WRITE_FLAG_RECOMPRESS | \
+ WIMLIB_WRITE_FLAG_FSYNC | \
+ WIMLIB_WRITE_FLAG_REBUILD | \
+ WIMLIB_WRITE_FLAG_SOFT_DELETE | \
+ WIMLIB_WRITE_FLAG_IGNORE_READONLY_FLAG | \
+ WIMLIB_WRITE_FLAG_SKIP_EXTERNAL_WIMS | \
+ WIMLIB_WRITE_FLAG_STREAMS_OK | \
+ WIMLIB_WRITE_FLAG_RESERVED | \
+ WIMLIB_WRITE_FLAG_PACK_STREAMS)
#if defined(HAVE_SYS_FILE_H) && defined(HAVE_FLOCK)
extern int
" [--check] [--ref=\"GLOB\"] [--dest-dir=CMD_DIR]\n"
" [--to-stdout] [--no-acls] [--strict-acls]\n"
" [--no-attributes] [--include-invalid-names]\n"
-" [--no-wildcards] [--nullglob]\n"
+" [--no-wildcards] [--nullglob] [--preserve-dir-structure]\n"
),
[CMD_INFO] =
T(
sources[i].fs_source_path,
sources[i].wim_target_path);
add_cmds[i].op = WIMLIB_UPDATE_OP_ADD;
- add_cmds[i].add.add_flags = add_flags;
+ add_cmds[i].add.add_flags = add_flags & ~WIMLIB_ADD_FLAG_BOOT;
add_cmds[i].add.config = (struct wimlib_capture_config*)config;
add_cmds[i].add.fs_source_path = sources[i].fs_source_path;
add_cmds[i].add.wim_target_path = sources[i].wim_target_path;
DEBUG("Adding image \"%"TS"\" from %zu sources (add_flags=%#x)",
name, num_sources, add_flags);
+ for (size_t i = 0; i < num_sources; i++)
+ if (sources[i].reserved != 0)
+ return WIMLIB_ERR_INVALID_PARAM;
+
/* Add the new image (initially empty) */
ret = wimlib_add_empty_image(wim, name, NULL);
if (ret)
u32 orig_dest_image_count;
/* Check for sane parameters. */
+ if (export_flags & ~(WIMLIB_EXPORT_FLAG_BOOT |
+ WIMLIB_EXPORT_FLAG_NO_NAMES |
+ WIMLIB_EXPORT_FLAG_NO_DESCRIPTIONS))
+ return WIMLIB_ERR_INVALID_PARAM;
+
if (src_wim == NULL || dest_wim == NULL)
return WIMLIB_ERR_INVALID_PARAM;
#define WIMLIB_EXTRACT_FLAG_FROM_PIPE 0x40000000
#define WIMLIB_EXTRACT_FLAG_FILEMODE 0x20000000
#define WIMLIB_EXTRACT_FLAG_IMAGEMODE 0x10000000
-#define WIMLIB_EXTRACT_MASK_PUBLIC 0x0fffffff
+
+/* Keep in sync with wimlib.h */
+#define WIMLIB_EXTRACT_MASK_PUBLIC \
+ (WIMLIB_EXTRACT_FLAG_NTFS | \
+ WIMLIB_EXTRACT_FLAG_HARDLINK | \
+ WIMLIB_EXTRACT_FLAG_SYMLINK | \
+ WIMLIB_EXTRACT_FLAG_VERBOSE | \
+ WIMLIB_EXTRACT_FLAG_SEQUENTIAL | \
+ WIMLIB_EXTRACT_FLAG_UNIX_DATA | \
+ WIMLIB_EXTRACT_FLAG_NO_ACLS | \
+ WIMLIB_EXTRACT_FLAG_STRICT_ACLS | \
+ WIMLIB_EXTRACT_FLAG_RPFIX | \
+ WIMLIB_EXTRACT_FLAG_NORPFIX | \
+ WIMLIB_EXTRACT_FLAG_TO_STDOUT | \
+ WIMLIB_EXTRACT_FLAG_REPLACE_INVALID_FILENAMES | \
+ WIMLIB_EXTRACT_FLAG_ALL_CASE_CONFLICTS | \
+ WIMLIB_EXTRACT_FLAG_STRICT_TIMESTAMPS | \
+ WIMLIB_EXTRACT_FLAG_STRICT_SHORT_NAMES | \
+ WIMLIB_EXTRACT_FLAG_STRICT_SYMLINKS | \
+ WIMLIB_EXTRACT_FLAG_RESUME | \
+ WIMLIB_EXTRACT_FLAG_FILE_ORDER | \
+ WIMLIB_EXTRACT_FLAG_GLOB_PATHS | \
+ WIMLIB_EXTRACT_FLAG_STRICT_GLOB | \
+ WIMLIB_EXTRACT_FLAG_NO_ATTRIBUTES | \
+ WIMLIB_EXTRACT_FLAG_NO_PRESERVE_DIR_STRUCTURE)
/* Given a WIM dentry in the tree to be extracted, resolve all streams in the
* corresponding inode and set 'out_refcnt' in each to 0. */
default_extract_flags |= WIMLIB_EXTRACT_FLAG_NO_PRESERVE_DIR_STRUCTURE;
for (size_t i = 0; i < num_cmds; i++) {
- int cmd_flags = ((cmds[i].extract_flags |
- default_extract_flags) &
- WIMLIB_EXTRACT_MASK_PUBLIC);
+ int cmd_flags = (cmds[i].extract_flags |
+ default_extract_flags);
+
+ if (cmd_flags & ~WIMLIB_EXTRACT_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
+
int cmd_link_flags = (cmd_flags & (WIMLIB_EXTRACT_FLAG_SYMLINK |
WIMLIB_EXTRACT_FLAG_HARDLINK));
if (i == 0) {
}
for (size_t i = 0; i < num_cmds; i++) {
- int extract_flags = ((cmds[i].extract_flags |
- default_extract_flags) &
- WIMLIB_EXTRACT_MASK_PUBLIC);
+ int extract_flags = (cmds[i].extract_flags |
+ default_extract_flags);
const tchar *target = cmds[i].fs_dest_path;
const tchar *wim_source_path = cmds[i].wim_source_path;
{
int ret;
- extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC;
+ if (extract_flags & ~WIMLIB_EXTRACT_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
ret = do_wimlib_extract_paths(wim, image, target, paths, num_paths,
extract_flags, progress_func);
int image;
unsigned i;
- extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC;
+ if (extract_flags & ~WIMLIB_EXTRACT_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
if (extract_flags & WIMLIB_EXTRACT_FLAG_FILE_ORDER)
return WIMLIB_ERR_INVALID_PARAM;
int extract_flags,
wimlib_progress_func_t progress_func)
{
- extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC;
+ if (extract_flags & ~WIMLIB_EXTRACT_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
return do_wimlib_extract_image(wim, image, target, extract_flags,
progress_func);
}
tchar *path;
int ret;
+ if (flags & ~(WIMLIB_ITERATE_DIR_TREE_FLAG_RECURSIVE |
+ WIMLIB_ITERATE_DIR_TREE_FLAG_CHILDREN |
+ WIMLIB_ITERATE_DIR_TREE_FLAG_RESOURCES_NEEDED))
+ return WIMLIB_ERR_INVALID_PARAM;
+
path = canonicalize_wim_path(_path);
if (path == NULL)
return WIMLIB_ERR_NOMEM;
wimlib_iterate_lookup_table_callback_t cb,
void *user_ctx)
{
+ if (flags != 0)
+ return WIMLIB_ERR_INVALID_PARAM;
+
struct iterate_lte_context ctx = {
.cb = cb,
.user_ctx = user_ctx,
if (!wim || !dir)
return WIMLIB_ERR_INVALID_PARAM;
+ if (mount_flags & ~(WIMLIB_MOUNT_FLAG_READWRITE |
+ WIMLIB_MOUNT_FLAG_DEBUG |
+ WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_NONE |
+ WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_XATTR |
+ WIMLIB_MOUNT_FLAG_STREAM_INTERFACE_WINDOWS |
+ WIMLIB_MOUNT_FLAG_UNIX_DATA |
+ WIMLIB_MOUNT_FLAG_ALLOW_OTHER))
+ return WIMLIB_ERR_INVALID_PARAM;
+
if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) {
ret = can_delete_from_wim(wim);
if (ret)
int ret;
struct wimfs_context wimfs_ctx;
+ if (unmount_flags & ~(WIMLIB_UNMOUNT_FLAG_CHECK_INTEGRITY |
+ WIMLIB_UNMOUNT_FLAG_COMMIT |
+ WIMLIB_UNMOUNT_FLAG_REBUILD |
+ WIMLIB_UNMOUNT_FLAG_RECOMPRESS |
+ WIMLIB_UNMOUNT_FLAG_LAZY))
+ return WIMLIB_ERR_INVALID_PARAM;
+
init_wimfs_context(&wimfs_ctx);
ret = set_message_queue_names(&wimfs_ctx, dir);
#include "wimlib/lookup_table.h"
#include "wimlib/wim.h"
+#define WIMLIB_REF_MASK_PUBLIC (WIMLIB_REF_FLAG_GLOB_ENABLE | \
+ WIMLIB_REF_FLAG_GLOB_ERR_ON_NOMATCH)
+
static int
lte_clone_if_new(struct wim_lookup_table_entry *lte, void *_lookup_table)
{
if (num_resource_wims != 0 && resource_wims == NULL)
return WIMLIB_ERR_INVALID_PARAM;
+ if (ref_flags & ~WIMLIB_REF_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
+
for (i = 0; i < num_resource_wims; i++)
if (resource_wims[i] == NULL)
return WIMLIB_ERR_INVALID_PARAM;
unsigned i;
int ret;
+ if (ref_flags & ~WIMLIB_REF_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
+
if (ref_flags & WIMLIB_REF_FLAG_GLOB_ENABLE) {
for (i = 0; i < count; i++) {
ret = reference_resource_glob(wim,
&progress);
}
- part_write_flags = write_flags & WIMLIB_WRITE_MASK_PUBLIC;
+ part_write_flags = write_flags;
part_write_flags |= WIMLIB_WRITE_FLAG_USE_EXISTING_TOTALBYTES;
if (part_number != 1)
part_write_flags |= WIMLIB_WRITE_FLAG_NO_METADATA;
if (swm_name == NULL || swm_name[0] == T('\0') || part_size == 0)
return WIMLIB_ERR_INVALID_PARAM;
+ if (write_flags & ~WIMLIB_WRITE_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
+
if (!wim_has_metadata(wim))
return WIMLIB_ERR_METADATA_NOT_FOUND;
int ret;
struct wim_image_metadata *new_imd;
+ if (flags != 0)
+ return WIMLIB_ERR_INVALID_PARAM;
+
if (wim == NULL || template_wim == NULL)
return WIMLIB_ERR_INVALID_PARAM;
{
int add_flags = cmd->add.add_flags;
+ if (add_flags & ~(WIMLIB_ADD_FLAG_NTFS |
+ WIMLIB_ADD_FLAG_DEREFERENCE |
+ WIMLIB_ADD_FLAG_VERBOSE |
+ /* BOOT doesn't make sense for wimlib_update_image() */
+ /*WIMLIB_ADD_FLAG_BOOT |*/
+ WIMLIB_ADD_FLAG_UNIX_DATA |
+ WIMLIB_ADD_FLAG_NO_ACLS |
+ WIMLIB_ADD_FLAG_STRICT_ACLS |
+ WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE |
+ WIMLIB_ADD_FLAG_RPFIX |
+ WIMLIB_ADD_FLAG_NORPFIX |
+ WIMLIB_ADD_FLAG_NO_UNSUPPORTED_EXCLUDE |
+ WIMLIB_ADD_FLAG_WINCONFIG))
+ return WIMLIB_ERR_INVALID_PARAM;
+
/* Are we adding the entire image or not? An empty wim_target_path
* indicates that the tree we're adding is to be placed in the root of
* the image. We consider this to be capturing the entire image,
return 0;
}
+static int
+check_delete_command(const struct wimlib_update_command *cmd)
+{
+ if (cmd->delete_.delete_flags & ~(WIMLIB_DELETE_FLAG_FORCE |
+ WIMLIB_DELETE_FLAG_RECURSIVE))
+ return WIMLIB_ERR_INVALID_PARAM;
+ return 0;
+}
+
+static int
+check_rename_command(const struct wimlib_update_command *cmd)
+{
+ if (cmd->rename.rename_flags != 0)
+ return WIMLIB_ERR_INVALID_PARAM;
+ return 0;
+}
+
static int
check_update_command(struct wimlib_update_command *cmd,
const struct wim_header *hdr)
case WIMLIB_UPDATE_OP_ADD:
return check_add_command(cmd, hdr);
case WIMLIB_UPDATE_OP_DELETE:
+ return check_delete_command(cmd);
case WIMLIB_UPDATE_OP_RENAME:
- break;
+ return check_rename_command(cmd);
}
return 0;
}
struct wimlib_update_command *cmds_copy;
bool deletion_requested = false;
+ if (update_flags & ~WIMLIB_UPDATE_FLAG_SEND_PROGRESS)
+ return WIMLIB_ERR_INVALID_PARAM;
+
DEBUG("Updating image %d with %zu commands", image, num_cmds);
for (size_t i = 0; i < num_cmds; i++)
{
int ret;
+ if (which & ~(WIMLIB_CHANGE_READONLY_FLAG |
+ WIMLIB_CHANGE_GUID |
+ WIMLIB_CHANGE_BOOT_INDEX |
+ WIMLIB_CHANGE_RPFIX_FLAG))
+ return WIMLIB_ERR_INVALID_PARAM;
+
if (which & WIMLIB_CHANGE_READONLY_FLAG) {
if (info->is_marked_readonly)
wim->hdr.flags |= WIM_HDR_FLAG_READONLY;
wimlib_open_wim(const tchar *wimfile, int open_flags,
WIMStruct **wim_ret, wimlib_progress_func_t progress_func)
{
- open_flags &= WIMLIB_OPEN_MASK_PUBLIC;
+ if (open_flags & ~(WIMLIB_OPEN_FLAG_CHECK_INTEGRITY |
+ WIMLIB_OPEN_FLAG_ERROR_IF_SPLIT |
+ WIMLIB_OPEN_FLAG_WRITE_ACCESS))
+ return WIMLIB_ERR_INVALID_PARAM;
+
return open_wim_as_WIMStruct(wimfile, open_flags, wim_ret,
progress_func);
}
if (already_inited)
return 0;
+
+ if (init_flags & ~(WIMLIB_INIT_FLAG_ASSUME_UTF8 |
+ WIMLIB_INIT_FLAG_DONT_ACQUIRE_PRIVILEGES |
+ WIMLIB_INIT_FLAG_STRICT_CAPTURE_PRIVILEGES |
+ WIMLIB_INIT_FLAG_STRICT_APPLY_PRIVILEGES |
+ WIMLIB_INIT_FLAG_DEFAULT_CASE_SENSITIVE |
+ WIMLIB_INIT_FLAG_DEFAULT_CASE_INSENSITIVE))
+ return WIMLIB_ERR_INVALID_PARAM;
+
libxml_global_init();
if (!(init_flags & WIMLIB_INIT_FLAG_ASSUME_UTF8)) {
wimlib_mbs_is_utf8 = test_locale_ctype_utf8();
int image, int write_flags, unsigned num_threads,
wimlib_progress_func_t progress_func)
{
- if (!path)
+ if (write_flags & ~WIMLIB_WRITE_MASK_PUBLIC)
return WIMLIB_ERR_INVALID_PARAM;
- write_flags &= WIMLIB_WRITE_MASK_PUBLIC;
+ if (path == NULL || path[0] == T('\0'))
+ return WIMLIB_ERR_INVALID_PARAM;
return write_standalone_wim(wim, path, image, write_flags,
num_threads, progress_func);
int image, int write_flags, unsigned num_threads,
wimlib_progress_func_t progress_func)
{
+ if (write_flags & ~WIMLIB_WRITE_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
+
if (fd < 0)
return WIMLIB_ERR_INVALID_PARAM;
- write_flags &= WIMLIB_WRITE_MASK_PUBLIC;
write_flags |= WIMLIB_WRITE_FLAG_FILE_DESCRIPTOR;
return write_standalone_wim(wim, &fd, image, write_flags,
int ret;
u32 orig_hdr_flags;
- write_flags &= WIMLIB_WRITE_MASK_PUBLIC;
-
- if (write_flags & WIMLIB_WRITE_FLAG_FILE_DESCRIPTOR)
+ if (write_flags & ~WIMLIB_WRITE_MASK_PUBLIC)
return WIMLIB_ERR_INVALID_PARAM;
if (!wim->filename)