]> wimlib.net Git - wimlib/blobdiff - src/add_image.c
More logical behavior when canonicalizing WIM paths
[wimlib] / src / add_image.c
index 263c2e757330ecb5931a19a98763a1d21cf5d79b..7c3a6cb26485ca91298a61e5638e27a1d0392286 100644 (file)
  * 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,14 +175,14 @@ 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;
        }
 
        /* Delegate the work to wimlib_update_image(). */
-       ret = wimlib_update_image(wim, wim->hdr.image_count, add_cmds, 
+       ret = wimlib_update_image(wim, wim->hdr.image_count, add_cmds,
                                  num_sources, 0, progress_func);
        FREE(add_cmds);
        if (ret)
@@ -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);
 }