+
+ /* If capturing or appending as an update of an existing (template) image,
+ * open the WIM if needed and parse the image index. */
+ if (template_image_name_or_num) {
+
+
+ if (template_wimfile == base_wimfile) {
+ template_wim = base_wim;
+ } else if (template_wimfile == wimfile) {
+ template_wim = wim;
+ } else {
+ ret = wimlib_open_wim(template_wimfile, open_flags,
+ &template_wim, imagex_progress_func);
+ if (ret)
+ goto out_free_base_wim;
+ }
+
+ template_image = wimlib_resolve_image(template_wim,
+ template_image_name_or_num);
+
+ if (template_image_name_or_num[0] == T('-')) {
+ tchar *tmp;
+ unsigned long n;
+ struct wimlib_wim_info info;
+
+ wimlib_get_wim_info(wim, &info);
+ n = tstrtoul(template_image_name_or_num + 1, &tmp, 10);
+ if (n >= 1 && n <= info.image_count &&
+ *tmp == T('\0') &&
+ tmp != template_image_name_or_num + 1)
+ {
+ template_image = info.image_count - (n - 1);
+ }
+ }
+ ret = verify_image_exists_and_is_single(template_image,
+ template_image_name_or_num,
+ template_wimfile);
+ if (ret)
+ goto out_free_template_wim;
+ } else {
+ template_wim = NULL;
+ }
+
+ ret = wimlib_add_image_multisource(wim,
+ capture_sources,
+ num_sources,
+ name,
+ config,
+ add_image_flags,
+ imagex_progress_func);
+ if (ret)
+ goto out_free_template_wim;
+
+ if (desc || flags_element || template_image_name_or_num) {
+ /* User provided <DESCRIPTION> or <FLAGS> element, or an image
+ * on which the added one is to be based has been specified with
+ * --update-of. Get the index of the image we just
+ * added, then use it to call the appropriate functions. */
+ struct wimlib_wim_info info;
+
+ wimlib_get_wim_info(wim, &info);
+
+ if (desc) {
+ ret = wimlib_set_image_descripton(wim,
+ info.image_count,
+ desc);
+ if (ret)
+ goto out_free_template_wim;
+ }
+
+ if (flags_element) {
+ ret = wimlib_set_image_flags(wim, info.image_count,
+ flags_element);
+ if (ret)
+ goto out_free_template_wim;
+ }
+
+ /* Reference template image if the user provided one. */
+ if (template_image_name_or_num) {
+ imagex_printf(T("Using image %d "
+ "from \"%"TS"\" as template\n"),
+ template_image, template_wimfile);
+ ret = wimlib_reference_template_image(wim,
+ info.image_count,
+ template_wim,
+ template_image,
+ 0, NULL);
+ if (ret)
+ goto out_free_template_wim;
+ }
+ }
+
+ /* Write the new WIM or overwrite the existing WIM with the new image
+ * appended. */
+ if (cmd == CMD_APPEND) {
+ ret = wimlib_overwrite(wim, write_flags, num_threads,
+ imagex_progress_func);
+ } else if (wimfile) {
+ ret = wimlib_write(wim, wimfile, WIMLIB_ALL_IMAGES,
+ write_flags, num_threads,
+ imagex_progress_func);
+ } else {
+ ret = wimlib_write_to_fd(wim, wim_fd, WIMLIB_ALL_IMAGES,
+ write_flags, num_threads,
+ imagex_progress_func);
+ }
+out_free_template_wim:
+ /* template_wim may alias base_wim or wim. */
+ if (template_wim != base_wim && template_wim != wim)
+ wimlib_free(template_wim);
+out_free_base_wim:
+ wimlib_free(base_wim);
+out_free_wim:
+ wimlib_free(wim);