]> wimlib.net Git - wimlib/blobdiff - src/update_image.c
Rename add_image_params => capture_params
[wimlib] / src / update_image.c
index ef5328059be12fc45fc0ff750c484d8ddf8b75a3..bb1b60472169e10755efd638e5455829c92df9da 100644 (file)
@@ -5,20 +5,18 @@
 /*
  * Copyright (C) 2013, 2014 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
@@ -28,6 +26,7 @@
 #include "wimlib/capture.h"
 #include "wimlib/dentry.h"
 #include "wimlib/encoding.h"
+#include "wimlib/endianness.h"
 #include "wimlib/error.h"
 #include "wimlib/lookup_table.h"
 #include "wimlib/metadata.h"
@@ -212,13 +211,13 @@ do_unlink(struct wim_dentry *subject, struct wim_dentry *parent,
 {
        if (parent) {
                /* Unlink @subject from its @parent.  */
-               wimlib_assert(subject->parent == parent);
+               wimlib_assert(subject->d_parent == parent);
                unlink_dentry(subject);
        } else {
                /* Unset @subject as the root of the image.  */
                *root_p = NULL;
        }
-       subject->parent = subject;
+       subject->d_parent = subject;
 }
 
 static void
@@ -362,7 +361,7 @@ journaled_unlink(struct update_command_journal *j, struct wim_dentry *subject)
        if (dentry_is_root(subject))
                parent = NULL;
        else
-               parent = subject->parent;
+               parent = subject->d_parent;
 
        prim.type = UNLINK_DENTRY;
        prim.link.subject = subject;
@@ -520,27 +519,29 @@ handle_conflict(struct wim_dentry *branch, struct wim_dentry *existing,
                /* Replace nondirectory file  */
                struct wim_dentry *parent;
                int ret;
-               union wimlib_progress_info info;
 
-               parent = existing->parent;
+               parent = existing->d_parent;
 
                ret = calculate_dentry_full_path(existing);
                if (ret)
                        return ret;
 
-               ret = journaled_unlink(j, existing);
-               if (ret)
-                       return ret;
+               if (add_flags & WIMLIB_ADD_FLAG_VERBOSE) {
+                       union wimlib_progress_info info;
 
-               ret = journaled_link(j, branch, parent);
+                       info.replace.path_in_wim = existing->_full_path;
+                       ret = call_progress(progfunc,
+                                           WIMLIB_PROGRESS_MSG_REPLACE_FILE_IN_WIM,
+                                           &info, progctx);
+                       if (ret)
+                               return ret;
+               }
+
+               ret = journaled_unlink(j, existing);
                if (ret)
                        return ret;
 
-
-               info.replace.path_in_wim = existing->_full_path;
-               return call_progress(progfunc,
-                                    WIMLIB_PROGRESS_MSG_REPLACE_FILE_IN_WIM,
-                                    &info, progctx);
+               return journaled_link(j, branch, parent);
        }
 }
 
@@ -764,7 +765,7 @@ execute_add_command(struct update_command_journal *j,
        tchar *fs_source_path;
        tchar *wim_target_path;
        const tchar *config_file;
-       struct add_image_params params;
+       struct capture_params params;
        struct capture_config config;
        capture_tree_t capture_tree = platform_default_capture_tree;
 #ifdef WITH_NTFS_3G
@@ -866,8 +867,6 @@ execute_add_command(struct update_command_journal *j,
 #ifdef WITH_NTFS_3G
        wim_get_current_image_metadata(wim)->ntfs_vol = ntfs_vol;
 #endif
-       if (add_flags & WIMLIB_ADD_FLAG_RPFIX)
-               wim->hdr.flags |= WIM_HDR_FLAG_RP_FIX;
        ret = 0;
        goto out_destroy_config;
 out_cleanup_after_capture:
@@ -934,7 +933,7 @@ is_ancestor(const struct wim_dentry *d1, const struct wim_dentry *d2)
                        return true;
                if (dentry_is_root(d2))
                        return false;
-               d2 = d2->parent;
+               d2 = d2->d_parent;
        }
 }
 
@@ -981,7 +980,7 @@ rename_wim_path(WIMStruct *wim, const tchar *from, const tchar *to,
                        if (dentry_has_children(dst))
                                return -ENOTEMPTY;
                }
-               parent_of_dst = dst->parent;
+               parent_of_dst = dst->d_parent;
        } else {
                /* Destination does not exist */
                parent_of_dst = get_parent_dentry(wim, to, case_type);
@@ -1150,7 +1149,6 @@ execute_update_commands(WIMStruct *wim,
                                goto rollback;
                }
 
-               ret = WIMLIB_ERR_INVALID_PARAM;
                switch (cmds[i].op) {
                case WIMLIB_UPDATE_OP_ADD:
                        ret = execute_add_command(j, wim, &cmds[i], inode_table,
@@ -1222,7 +1220,8 @@ check_add_command(struct wimlib_update_command *cmd,
                          WIMLIB_ADD_FLAG_NO_UNSUPPORTED_EXCLUDE |
                          WIMLIB_ADD_FLAG_WINCONFIG |
                          WIMLIB_ADD_FLAG_WIMBOOT |
-                         WIMLIB_ADD_FLAG_NO_REPLACE))
+                         WIMLIB_ADD_FLAG_NO_REPLACE |
+                         WIMLIB_ADD_FLAG_TEST_FILE_EXCLUSION))
                return WIMLIB_ERR_INVALID_PARAM;
 
        bool is_entire_image = WIMLIB_IS_WIM_ROOT_PATH(cmd->add.wim_target_path);
@@ -1434,14 +1433,6 @@ wimlib_update_image(WIMStruct *wim,
 
        DEBUG("Updating image %d with %zu commands", image, num_cmds);
 
-       if (have_command_type(cmds, num_cmds, WIMLIB_UPDATE_OP_DELETE))
-               ret = can_delete_from_wim(wim);
-       else
-               ret = can_modify_wim(wim);
-
-       if (ret)
-               goto out;
-
        /* Load the metadata for the image to modify (if not loaded already) */
        ret = select_wim_image(wim, image);
        if (ret)
@@ -1475,18 +1466,17 @@ wimlib_update_image(WIMStruct *wim,
         * directories, may have changed.  Call xml_update_image_info() to
         * recalculate these statistics. */
        xml_update_image_info(wim, image);
+
+       for (size_t i = 0; i < num_cmds; i++)
+               if (cmds_copy[i].op == WIMLIB_UPDATE_OP_ADD &&
+                   cmds_copy[i].add.add_flags & WIMLIB_ADD_FLAG_RPFIX)
+                       wim->hdr.flags |= WIM_HDR_FLAG_RP_FIX;
 out_free_cmds_copy:
        free_update_commands(cmds_copy, num_cmds);
 out:
        return ret;
 }
 
-static int
-update1(WIMStruct *wim, int image, const struct wimlib_update_command *cmd)
-{
-       return wimlib_update_image(wim, image, cmd, 1, 0);
-}
-
 WIMLIBAPI int
 wimlib_delete_path(WIMStruct *wim, int image,
                   const tchar *path, int delete_flags)
@@ -1497,7 +1487,7 @@ wimlib_delete_path(WIMStruct *wim, int image,
        cmd.delete_.wim_path = (tchar *)path;
        cmd.delete_.delete_flags = delete_flags;
 
-       return update1(wim, image, &cmd);
+       return wimlib_update_image(wim, image, &cmd, 1, 0);
 }
 
 WIMLIBAPI int
@@ -1511,7 +1501,7 @@ wimlib_rename_path(WIMStruct *wim, int image,
        cmd.rename.wim_target_path = (tchar *)dest_path;
        cmd.rename.rename_flags = 0;
 
-       return update1(wim, image, &cmd);
+       return wimlib_update_image(wim, image, &cmd, 1, 0);
 }
 
 WIMLIBAPI int
@@ -1527,5 +1517,5 @@ wimlib_add_tree(WIMStruct *wim, int image,
        cmd.add.add_flags = add_flags;
        cmd.add.config_file = NULL;
 
-       return update1(wim, image, &cmd);
+       return wimlib_update_image(wim, image, &cmd, 1, 0);
 }