From 12d47b06960d51e4f254ebbc882b05445c992f1d Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Mon, 13 May 2013 00:41:29 -0500 Subject: [PATCH] extract/update fixes --- programs/imagex.c | 31 +++++++++++++++++++++++++------ src/extract_image.c | 2 +- src/security.c | 8 +++++++- src/update_image.c | 22 +++++++++++----------- src/wimlib.h | 12 ++++++------ src/wimlib_internal.h | 2 ++ 6 files changed, 52 insertions(+), 25 deletions(-) diff --git a/programs/imagex.c b/programs/imagex.c index ed0a9776..591714e1 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -342,9 +342,16 @@ static const struct option update_options[] = { {T("threads"), required_argument, NULL, IMAGEX_THREADS_OPTION}, {T("check"), no_argument, NULL, IMAGEX_CHECK_OPTION}, {T("rebuild"), no_argument, NULL, IMAGEX_REBUILD_OPTION}, + + /* Default delete options */ {T("force"), no_argument, NULL, IMAGEX_FORCE_OPTION}, {T("recursive"), no_argument, NULL, IMAGEX_RECURSIVE_OPTION}, + + /* Global add option */ {T("config"), required_argument, NULL, IMAGEX_CONFIG_OPTION}, + + /* Default add options */ + {T("verbose"), no_argument, NULL, IMAGEX_VERBOSE_OPTION}, {T("dereference"), no_argument, NULL, IMAGEX_DEREFERENCE_OPTION}, {T("unix-data"), no_argument, NULL, IMAGEX_UNIX_DATA_OPTION}, {T("noacls"), no_argument, NULL, IMAGEX_NO_ACLS_OPTION}, @@ -1233,7 +1240,9 @@ update_command_add_option(int op, const tchar *option, bool recognized = true; switch (op) { case WIMLIB_UPDATE_OP_ADD: - if (!tstrcmp(option, T("--unix-data"))) + if (!tstrcmp(option, T("--verbose"))) + cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_VERBOSE; + else if (!tstrcmp(option, T("--unix-data"))) cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_UNIX_DATA; else if (!tstrcmp(option, T("--no-acls")) || !tstrcmp(option, T("--noacls"))) cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_NO_ACLS; @@ -1252,7 +1261,7 @@ update_command_add_option(int op, const tchar *option, else recognized = false; break; - case WIMLIB_UPDATE_OP_RENAME: + default: recognized = false; break; } @@ -1347,8 +1356,8 @@ parse_update_command(tchar *line, size_t len, if (!update_command_add_option(op, next_string, command)) { imagex_error(T("Unrecognized option \"%"TS"\" to " - "update command on line %zu"), - next_string, line_number); + "update command \"%"TS"\" on line %zu"), + next_string, command_name, line_number); return false; } @@ -2248,7 +2257,7 @@ imagex_extract(int argc, tchar **argv) win32_acquire_restore_privileges(); #endif - ret = wimlib_extract_files(wim, image, 0, cmds, num_cmds, + ret = wimlib_extract_files(wim, image, cmds, num_cmds, 0, additional_swms, num_additional_swms, imagex_progress_func); if (ret == 0) { @@ -2902,7 +2911,7 @@ imagex_update(int argc, tchar **argv) WIMStruct *wim; int ret; int open_flags = 0; - int write_flags = WIMLIB_WRITE_FLAG_SOFT_DELETE; + int write_flags = 0; int update_flags = 0; int default_add_flags = WIMLIB_ADD_IMAGE_FLAG_EXCLUDE_VERBOSE; int default_delete_flags = 0; @@ -2919,6 +2928,7 @@ imagex_update(int argc, tchar **argv) for_opt(c, update_options) { switch (c) { + /* Generic or write options */ case IMAGEX_THREADS_OPTION: num_threads = parse_num_threads(optarg); if (num_threads == UINT_MAX) { @@ -2933,15 +2943,24 @@ imagex_update(int argc, tchar **argv) case IMAGEX_REBUILD_OPTION: write_flags |= WIMLIB_WRITE_FLAG_REBUILD; break; + + /* Default delete options */ case IMAGEX_FORCE_OPTION: default_delete_flags |= WIMLIB_DELETE_FLAG_FORCE; break; case IMAGEX_RECURSIVE_OPTION: default_delete_flags |= WIMLIB_DELETE_FLAG_RECURSIVE; break; + + /* Global add option */ case IMAGEX_CONFIG_OPTION: config_file = optarg; break; + + /* Default add options */ + case IMAGEX_VERBOSE_OPTION: + default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_VERBOSE; + break; case IMAGEX_DEREFERENCE_OPTION: default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE; break; diff --git a/src/extract_image.c b/src/extract_image.c index e3229c33..39675350 100644 --- a/src/extract_image.c +++ b/src/extract_image.c @@ -736,9 +736,9 @@ do_wimlib_extract_files(WIMStruct *wim, WIMLIBAPI int wimlib_extract_files(WIMStruct *wim, int image, - int default_extract_flags, const struct wimlib_extract_command *cmds, size_t num_cmds, + int default_extract_flags, WIMStruct **additional_swms, unsigned num_additional_swms, wimlib_progress_func_t progress_func) diff --git a/src/security.c b/src/security.c index 871c243b..16e7b912 100644 --- a/src/security.c +++ b/src/security.c @@ -501,7 +501,7 @@ insert_sd_node(struct sd_set *set, struct sd_node *new) else if (cmp > 0) p = &((*p)->rb_right); else - return false; /* Duplicate SHA1 message digest */ + return false; /* Duplicate security descriptor */ } rb_link_node(&new->rb_node, rb_parent, p); rb_insert_color(&new->rb_node, root); @@ -596,6 +596,9 @@ out: return -1; } +/* Initialize a `struct sd_set' mapping from SHA1 message digests of security + * descriptors to indices into the security descriptors table of the WIM image + * (security IDs). */ int init_sd_set(struct sd_set *sd_set, struct wim_security_data *sd) { @@ -603,6 +606,9 @@ init_sd_set(struct sd_set *sd_set, struct wim_security_data *sd) sd_set->sd = sd; sd_set->rb_root.rb_node = NULL; + + /* Remember the original number of security descriptors so that newly + * added ones can be rolled back if needed. */ sd_set->orig_num_entries = sd->num_entries; for (int32_t i = 0; i < sd->num_entries; i++) { struct sd_node *new; diff --git a/src/update_image.c b/src/update_image.c index ecfef1ff..7247b1c0 100644 --- a/src/update_image.c +++ b/src/update_image.c @@ -403,20 +403,25 @@ execute_rename_command(WIMStruct *wim, ret = rename_wim_path(wim, rename_cmd->rename.wim_source_path, rename_cmd->rename.wim_target_path); if (ret) { + ret = -ret; + errno = ret; + ERROR_WITH_ERRNO("Can't rename \"%"TS"\" to \"%"TS"\"", + rename_cmd->rename.wim_source_path, + rename_cmd->rename.wim_target_path); switch (ret) { - case -ENOMEM: + case ENOMEM: ret = WIMLIB_ERR_NOMEM; break; - case -ENOTDIR: + case ENOTDIR: ret = WIMLIB_ERR_NOTDIR; break; - case -ENOTEMPTY: + case ENOTEMPTY: ret = WIMLIB_ERR_NOTEMPTY; break; - case -EISDIR: + case EISDIR: ret = WIMLIB_ERR_IS_DIRECTORY; break; - case -ENOENT: + case ENOENT: default: ret = WIMLIB_ERR_PATH_DOES_NOT_EXIST; break; @@ -436,7 +441,7 @@ update_op_to_str(int op) case WIMLIB_UPDATE_OP_RENAME: return T("rename"); default: - return T("???"); + wimlib_assert(0); } } @@ -456,15 +461,12 @@ execute_update_commands(WIMStruct *wim, break; case WIMLIB_UPDATE_OP_DELETE: ret = execute_delete_command(wim, &cmds[i]); - if (ret == 0) - wim->deletion_occurred = 1; break; case WIMLIB_UPDATE_OP_RENAME: ret = execute_rename_command(wim, &cmds[i]); break; default: wimlib_assert(0); - break; } if (ret) break; @@ -593,8 +595,6 @@ free_update_commands(struct wimlib_update_command *cmds, size_t num_cmds) FREE(cmds[i].rename.wim_source_path); FREE(cmds[i].rename.wim_target_path); break; - default: - wimlib_assert(0); } } FREE(cmds); diff --git a/src/wimlib.h b/src/wimlib.h index c4635e89..7cfd4935 100644 --- a/src/wimlib.h +++ b/src/wimlib.h @@ -1358,11 +1358,6 @@ wimlib_export_image(WIMStruct *src_wim, int src_image, * The 1-based number of the image in @a wim from which the files or * directory trees are to be extracted. It cannot be ::WIMLIB_ALL_IMAGES. * - * @param default_extract_flags - * Default extraction flags; the behavior shall be as if these flags had - * been specified in the ::wimlib_extract_command.extract_flags member in - * each extraction command, in combination with any flags already present. - * * @param cmds * An array of ::wimlib_extract_command structures that specifies the * extractions to perform. @@ -1370,6 +1365,11 @@ wimlib_export_image(WIMStruct *src_wim, int src_image, * @param num_cmds * Number of commands in the @a cmds array. * + * @param default_extract_flags + * Default extraction flags; the behavior shall be as if these flags had + * been specified in the ::wimlib_extract_command.extract_flags member in + * each extraction command, in combination with any flags already present. + * * @param additional_swms * Array of pointers to the ::WIMStruct for each additional part in the * split WIM. Ignored if @a num_additional_swms is 0. The pointers do not @@ -1408,9 +1408,9 @@ wimlib_export_image(WIMStruct *src_wim, int src_image, extern int wimlib_extract_files(WIMStruct *wim, int image, - int default_extract_flags, const struct wimlib_extract_command *cmds, size_t num_cmds, + int default_extract_flags, WIMStruct **additional_swms, unsigned num_additional_swms, wimlib_progress_func_t progress_func); diff --git a/src/wimlib_internal.h b/src/wimlib_internal.h index 9e55f371..a54e644c 100644 --- a/src/wimlib_internal.h +++ b/src/wimlib_internal.h @@ -313,7 +313,9 @@ struct WIMStruct { * image_metadata array. */ int current_image; + /* Have any images been deleted? */ u8 deletion_occurred : 1; + u8 all_images_verified : 1; u8 wim_locked : 1; }; -- 2.43.0