]> wimlib.net Git - wimlib/blobdiff - src/add_image.c
ntfs-3g_apply.c: note bugs fixed in NTFS-3G version 2017.3.23
[wimlib] / src / add_image.c
index a544c7b8d6ca032449b1ab24b2b85d17ebbc05ef..740f11d6aea27f29738651e1da2e2fb7dadf8c3c 100644 (file)
@@ -1,24 +1,22 @@
 /*
- * add_image.c - Add an image to a WIM file.
+ * add_image.c - Add an image to a WIMStruct.
  */
 
 /*
- * Copyright (C) 2012, 2013, 2014 Eric Biggers
+ * Copyright (C) 2012-2016 Eric Biggers
  *
- * This file is part of wimlib, a library for working with WIM files.
+ * 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
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version.
  *
- * wimlib is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 3 of the License, or (at your option)
- * any later version.
- *
- * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * This file is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  * details.
  *
- * You should have received a copy of the GNU General Public License
- * along with wimlib; if not, see http://www.gnu.org/licenses/.
+ * 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/.
  */
 
 #ifdef HAVE_CONFIG_H
 #endif
 
 #include "wimlib.h"
+#include "wimlib/blob_table.h"
 #include "wimlib/error.h"
-#include "wimlib/lookup_table.h"
 #include "wimlib/metadata.h"
 #include "wimlib/security.h"
 #include "wimlib/xml.h"
 
-/* Creates and appends a 'struct wim_image_metadata' for an empty image.
- *
- * The resulting image will be the last in the WIM, so its index will be
- * the new value of wim->hdr.image_count.  */
-static int
-add_empty_image_metadata(WIMStruct *wim)
-{
-       int ret;
-       struct wim_lookup_table_entry *metadata_lte;
-       struct wim_security_data *sd;
-       struct wim_image_metadata *imd;
-
-       /* Create lookup table entry for this metadata resource (for now really
-        * just a dummy entry).  */
-       ret = WIMLIB_ERR_NOMEM;
-       metadata_lte = new_lookup_table_entry();
-       if (!metadata_lte)
-               goto out;
-
-       metadata_lte->flags = WIM_RESHDR_FLAG_METADATA;
-       metadata_lte->unhashed = 1;
-
-       /* Create empty security data (no security descriptors).  */
-       sd = new_wim_security_data();
-       if (!sd)
-               goto out_free_metadata_lte;
-
-       imd = new_image_metadata();
-       if (!imd)
-               goto out_free_security_data;
-
-       /* A NULL root_dentry indicates a completely empty image, without even a
-        * root directory.  */
-       imd->root_dentry = NULL;
-       imd->metadata_lte = metadata_lte;
-       imd->security_data = sd;
-       imd->modified = 1;
-
-       /* Append as next image index.  */
-       ret = append_image_metadata(wim, imd);
-       if (ret)
-               put_image_metadata(imd, NULL);
-       goto out;
-
-out_free_security_data:
-       free_wim_security_data(sd);
-out_free_metadata_lte:
-       free_lookup_table_entry(metadata_lte);
-out:
-       return ret;
-}
-
 /* API function documented in wimlib.h  */
 WIMLIBAPI int
 wimlib_add_empty_image(WIMStruct *wim, const tchar *name, int *new_idx_ret)
 {
+       struct wim_image_metadata *imd;
        int ret;
 
-       ret = can_modify_wim(wim);
-       if (ret)
-               return ret;
-
-       if (!name)
-               name = T("");
-
        if (wimlib_image_name_in_use(wim, name)) {
                ERROR("There is already an image named \"%"TS"\" in the WIM!",
                      name);
                return WIMLIB_ERR_IMAGE_NAME_COLLISION;
        }
 
-       ret = add_empty_image_metadata(wim);
+       imd = new_empty_image_metadata();
+       if (!imd)
+               return WIMLIB_ERR_NOMEM;
+
+       ret = append_image_metadata(wim, imd);
        if (ret)
-               return ret;
+               goto err_put_imd;
 
-       ret = xml_add_image(wim, name);
-       if (ret) {
-               put_image_metadata(wim->image_metadata[--wim->hdr.image_count],
-                                  NULL);
-               return ret;
-       }
+       ret = xml_add_image(wim->xml_info, name);
+       if (ret)
+               goto err_undo_append;
 
        if (new_idx_ret)
                *new_idx_ret = wim->hdr.image_count;
        return 0;
+
+err_undo_append:
+       wim->hdr.image_count--;
+err_put_imd:
+       put_image_metadata(imd);
+       return ret;
 }
 
 /* Translate the 'struct wimlib_capture_source's passed to
@@ -157,8 +104,7 @@ wimlib_add_image_multisource(WIMStruct *wim,
                             size_t num_sources,
                             const tchar *name,
                             const tchar *config_file,
-                            int add_flags,
-                            wimlib_progress_func_t progress_func)
+                            int add_flags)
 {
        int ret;
        struct wimlib_update_command *add_cmds;
@@ -182,30 +128,27 @@ wimlib_add_image_multisource(WIMStruct *wim,
 
        /* Delegate the work to wimlib_update_image().  */
        ret = wimlib_update_image(wim, wim->hdr.image_count, add_cmds,
-                                 num_sources, 0, progress_func);
+                                 num_sources, 0);
        FREE(add_cmds);
        if (ret)
                goto out_delete_image;
 
+       /* If requested, mark the new image as WIMBoot-compatible.  */
+       if (add_flags & WIMLIB_ADD_FLAG_WIMBOOT) {
+               ret = xml_set_wimboot(wim->xml_info, wim->hdr.image_count);
+               if (ret)
+                       goto out_delete_image;
+       }
+
        /* If requested, set this image as the WIM's bootable image.  */
        if (add_flags & WIMLIB_ADD_FLAG_BOOT)
                wim->hdr.boot_idx = wim->hdr.image_count;
 
-       /* If requested, mark new image as WIMBoot-compatible.  */
-       if (add_flags & WIMLIB_ADD_FLAG_WIMBOOT)
-               wim_info_set_wimboot(wim->wim_info, wim->hdr.image_count, true);
-
        return 0;
 
 out_delete_image:
-       /* Unsuccessful; rollback the WIM to its original state.  */
-
-       /* wimlib_update_image() is now all-or-nothing, so no dentries remain
-        * and there's no need to pass the lookup table here.  */
-       put_image_metadata(wim->image_metadata[wim->hdr.image_count - 1], NULL);
-
-       xml_delete_image(&wim->wim_info, wim->hdr.image_count);
-       wim->hdr.image_count--;
+       /* Unsuccessful; rollback by removing the new image.  */
+       delete_wim_image(wim, wim->hdr.image_count);
        return ret;
 }
 
@@ -215,8 +158,7 @@ wimlib_add_image(WIMStruct *wim,
                 const tchar *source,
                 const tchar *name,
                 const tchar *config_file,
-                int add_flags,
-                wimlib_progress_func_t progress_func)
+                int add_flags)
 {
        /* Use the more general wimlib_add_image_multisource().  */
        const struct wimlib_capture_source capture_src = {
@@ -225,6 +167,5 @@ wimlib_add_image(WIMStruct *wim,
                .reserved = 0,
        };
        return wimlib_add_image_multisource(wim, &capture_src, 1, name,
-                                           config_file, add_flags,
-                                           progress_func);
+                                           config_file, add_flags);
 }