]> wimlib.net Git - wimlib/blobdiff - src/export_image.c
mount_image.c: add fallback definitions of RENAME_* constants
[wimlib] / src / export_image.c
index da638322ee06c32d19217986653be498eea4e63d..1dff266d4228df6107803203f6664cdcb86fe01e 100644 (file)
@@ -3,7 +3,7 @@
  */
 
 /*
- * Copyright (C) 2012, 2013, 2014, 2015 Eric Biggers
+ * Copyright (C) 2012-2016 Eric Biggers
  *
  * This file is free software; you can redistribute it and/or modify it under
  * the terms of the GNU Lesser General Public License as published by the Free
@@ -16,7 +16,7 @@
  * details.
  *
  * You should have received a copy of the GNU Lesser General Public License
- * along with this file; if not, see http://www.gnu.org/licenses/.
+ * along with this file; if not, see https://www.gnu.org/licenses/.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -179,6 +179,26 @@ wimlib_export_image(WIMStruct *src_wim,
        /* Enable rollbacks  */
        for_blob_in_table(dest_wim->blob_table, blob_set_not_exported, NULL);
 
+       /* Forbid exports where the destination WIM already contains image(s)
+        * with the requested name(s).  However, allow multi-image exports where
+        * there is a duplication among the source names only.  */
+       if (!(export_flags & WIMLIB_EXPORT_FLAG_NO_NAMES)) {
+               for (src_image = start_src_image;
+                    src_image <= end_src_image;
+                    src_image++)
+               {
+                       const tchar *name = dest_name ? dest_name :
+                               wimlib_get_image_name(src_wim, src_image);
+
+                       if (wimlib_image_name_in_use(dest_wim, name)) {
+                               ERROR("There is already an image named \"%"TS"\" "
+                                     "in the destination WIM", name);
+                               ret = WIMLIB_ERR_IMAGE_NAME_COLLISION;
+                               goto out_rollback;
+                       }
+               }
+       }
+
        /* Export each requested image.  */
        for (src_image = start_src_image;
             src_image <= end_src_image;
@@ -204,14 +224,6 @@ wimlib_export_image(WIMStruct *src_wim,
                else
                        next_dest_description = wimlib_get_image_description(src_wim, src_image);
 
-               /* Check for name conflict.  */
-               if (wimlib_image_name_in_use(dest_wim, next_dest_name)) {
-                       ERROR("There is already an image named \"%"TS"\" "
-                             "in the destination WIM", next_dest_name);
-                       ret = WIMLIB_ERR_IMAGE_NAME_COLLISION;
-                       goto out_rollback;
-               }
-
                /* Load metadata for source image into memory.  */
                ret = select_wim_image(src_wim, src_image);
                if (ret)
@@ -275,7 +287,7 @@ out_rollback:
        while (dest_wim->hdr.image_count > orig_dest_image_count)
        {
                put_image_metadata(dest_wim->image_metadata[
-                                       --dest_wim->hdr.image_count], NULL);
+                                       --dest_wim->hdr.image_count]);
        }
        for_blob_in_table(dest_wim->blob_table, blob_rollback_export,
                          dest_wim->blob_table);