X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fadd_image.c;h=7c3a6cb26485ca91298a61e5638e27a1d0392286;hp=fcb4c472661dd6db75b08d6f99b14a370aff5c63;hb=927b1829e714d177de9d38c2da7fcdc13be44ed0;hpb=5218b1d7c83cf9e98ed6276e099844ae0d80abc2 diff --git a/src/add_image.c b/src/add_image.c index fcb4c472..7c3a6cb2 100644 --- a/src/add_image.c +++ b/src/add_image.c @@ -21,9 +21,16 @@ * along with wimlib; if not, see http://www.gnu.org/licenses/. */ -#include "wimlib_internal.h" -#include "lookup_table.h" -#include "xml.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "wimlib.h" +#include "wimlib/capture.h" +#include "wimlib/error.h" +#include "wimlib/lookup_table.h" +#include "wimlib/metadata.h" +#include "wimlib/xml.h" /* * Adds the dentry tree and security data for a new image to the image metadata @@ -38,14 +45,14 @@ add_new_dentry_tree(WIMStruct *wim, struct wim_dentry *root_dentry, int ret; metadata_lte = new_lookup_table_entry(); - if (!metadata_lte) + if (metadata_lte == NULL) return WIMLIB_ERR_NOMEM; - metadata_lte->resource_entry.flags = WIM_RESHDR_FLAG_METADATA; + metadata_lte->flags = WIM_RESHDR_FLAG_METADATA; metadata_lte->unhashed = 1; new_imd = new_image_metadata(); - if (!new_imd) { + if (new_imd == NULL) { free_lookup_table_entry(metadata_lte); return WIMLIB_ERR_NOMEM; } @@ -61,7 +68,7 @@ add_new_dentry_tree(WIMStruct *wim, struct wim_dentry *root_dentry, return ret; } -/* Append an empty image to the WIMStruct. */ +/* API function documented in wimlib.h */ WIMLIBAPI int wimlib_add_empty_image(WIMStruct *wim, const tchar *name, int *new_idx_ret) { @@ -70,17 +77,12 @@ wimlib_add_empty_image(WIMStruct *wim, const tchar *name, int *new_idx_ret) DEBUG("Adding empty image \"%"TS"\"", name); - if (name == NULL || name[0] == T('\0')) { - ERROR("Must specify a non-empty string for the image name"); - ret = WIMLIB_ERR_INVALID_PARAM; - goto out; - } + if (name == NULL) + name = T(""); - if (wim->hdr.total_parts != 1) { - ERROR("Cannot add an image to a split WIM"); - ret = WIMLIB_ERR_SPLIT_UNSUPPORTED; + ret = can_modify_wim(wim); + if (ret) goto out; - } if (wimlib_image_name_in_use(wim, name)) { ERROR("There is already an image named \"%"TS"\" in the WIM!", @@ -90,7 +92,7 @@ wimlib_add_empty_image(WIMStruct *wim, const tchar *name, int *new_idx_ret) } sd = new_wim_security_data(); - if (!sd) { + if (sd == NULL) { ret = WIMLIB_ERR_NOMEM; goto out; } @@ -113,7 +115,7 @@ out_put_image_metadata: wim->lookup_table); goto out; out_free_security_data: - free_security_data(sd); + free_wim_security_data(sd); out: return ret; } @@ -122,7 +124,7 @@ static struct wimlib_update_command * capture_sources_to_add_cmds(const struct wimlib_capture_source *sources, size_t num_sources, int add_flags, - const struct wimlib_capture_config *config) + const tchar *config_file) { struct wimlib_update_command *add_cmds; @@ -137,8 +139,8 @@ capture_sources_to_add_cmds(const struct wimlib_capture_source *sources, 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.config = (struct wimlib_capture_config*)config; + add_cmds[i].add.add_flags = add_flags & ~WIMLIB_ADD_FLAG_BOOT; + add_cmds[i].add.config_file = (tchar *)config_file; add_cmds[i].add.fs_source_path = sources[i].fs_source_path; add_cmds[i].add.wim_target_path = sources[i].wim_target_path; } @@ -146,14 +148,13 @@ capture_sources_to_add_cmds(const struct wimlib_capture_source *sources, return add_cmds; } -/* Adds an image to the WIMStruct from multiple on-disk directory trees, or a - * NTFS volume. */ +/* API function documented in wimlib.h */ WIMLIBAPI int wimlib_add_image_multisource(WIMStruct *wim, const struct wimlib_capture_source *sources, size_t num_sources, const tchar *name, - const struct wimlib_capture_config *config, + const tchar *config_file, int add_flags, wimlib_progress_func_t progress_func) { @@ -163,6 +164,10 @@ wimlib_add_image_multisource(WIMStruct *wim, 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) @@ -170,8 +175,8 @@ wimlib_add_image_multisource(WIMStruct *wim, /* Translate the "capture sources" into generic update commands. */ add_cmds = capture_sources_to_add_cmds(sources, num_sources, - add_flags, config); - if (!add_cmds) { + add_flags, config_file); + if (add_cmds == NULL) { ret = WIMLIB_ERR_NOMEM; goto out_delete_image; } @@ -186,6 +191,8 @@ wimlib_add_image_multisource(WIMStruct *wim, /* Success; set boot index if requested. */ if (add_flags & WIMLIB_ADD_FLAG_BOOT) wim->hdr.boot_idx = wim->hdr.image_count; + if (add_flags & WIMLIB_ADD_FLAG_WIMBOOT) + wim_info_set_wimboot(wim->wim_info, wim->hdr.image_count, true); ret = 0; goto out; out_delete_image: @@ -198,12 +205,12 @@ out: return ret; } -/* Adds an image to the WIMStruct from an on-disk directory tree or NTFS volume. */ +/* API function documented in wimlib.h */ WIMLIBAPI int wimlib_add_image(WIMStruct *wim, const tchar *source, const tchar *name, - const struct wimlib_capture_config *config, + const tchar *config_file, int add_flags, wimlib_progress_func_t progress_func) { @@ -211,10 +218,10 @@ wimlib_add_image(WIMStruct *wim, * */ const struct wimlib_capture_source capture_src = { .fs_source_path = (tchar*)source, - .wim_target_path = T(""), + .wim_target_path = WIMLIB_WIM_ROOT_PATH, .reserved = 0, }; return wimlib_add_image_multisource(wim, &capture_src, 1, name, - config, add_flags, + config_file, add_flags, progress_func); }