* 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
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;
}
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)
{
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!",
}
sd = new_wim_security_data();
- if (!sd) {
+ if (sd == NULL) {
ret = WIMLIB_ERR_NOMEM;
goto out;
}
wim->lookup_table);
goto out;
out_free_security_data:
- free_security_data(sd);
+ free_wim_security_data(sd);
out:
return ret;
}
static struct wimlib_update_command *
capture_sources_to_add_cmds(const struct wimlib_capture_source *sources,
size_t num_sources,
- int add_image_flags,
+ int add_flags,
const struct wimlib_capture_config *config)
{
struct wimlib_update_command *add_cmds;
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_image_flags;
+ add_cmds[i].add.add_flags = add_flags & ~WIMLIB_ADD_FLAG_BOOT;
add_cmds[i].add.config = (struct wimlib_capture_config*)config;
add_cmds[i].add.fs_source_path = sources[i].fs_source_path;
add_cmds[i].add.wim_target_path = sources[i].wim_target_path;
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,
- int add_image_flags,
+ int add_flags,
wimlib_progress_func_t progress_func)
{
int ret;
struct wimlib_update_command *add_cmds;
- DEBUG("Adding image \"%"TS"\" from %zu sources (add_image_flags=%#x)",
- name, num_sources, add_image_flags);
+ 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);
/* Translate the "capture sources" into generic update commands. */
add_cmds = capture_sources_to_add_cmds(sources, num_sources,
- add_image_flags, config);
- if (!add_cmds) {
+ add_flags, config);
+ 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)
goto out_delete_image;
/* Success; set boot index if requested. */
- if (add_image_flags & WIMLIB_ADD_IMAGE_FLAG_BOOT)
+ if (add_flags & WIMLIB_ADD_FLAG_BOOT)
wim->hdr.boot_idx = wim->hdr.image_count;
ret = 0;
goto 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,
- int add_image_flags,
+ int add_flags,
wimlib_progress_func_t progress_func)
{
/* Delegate the work to the more general wimlib_add_image_multisource().
.reserved = 0,
};
return wimlib_add_image_multisource(wim, &capture_src, 1, name,
- config, add_image_flags,
+ config, add_flags,
progress_func);
}