]> wimlib.net Git - wimlib/blobdiff - src/wim.c
integrity.c: Minor cleanup
[wimlib] / src / wim.c
index 44653f191f685e95de5e4b5fc9a0b022d5fd458c..cbda006139a12ba1ae8bc4ff4255f8e7694611f7 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -28,6 +28,7 @@
 #include <limits.h>
 #include <stdlib.h>
 #include <stdarg.h>
+#include <errno.h>
 
 #include "dentry.h"
 #include <unistd.h>
@@ -207,6 +208,11 @@ int select_wim_image(WIMStruct *w, int image)
 
        DEBUG("Selecting image %d", image);
 
+       if (image == WIMLIB_NO_IMAGE) {
+               ERROR("Invalid image: %d", WIMLIB_NO_IMAGE);
+               return WIMLIB_ERR_INVALID_IMAGE;
+       }
+
        if (image == w->current_image)
                return 0;
 
@@ -225,6 +231,7 @@ int select_wim_image(WIMStruct *w, int image)
                        destroy_image_metadata(imd, NULL);
                        imd->root_dentry = NULL;
                        imd->security_data = NULL;
+                       INIT_HLIST_HEAD(&imd->inode_list);
                }
        }
 
@@ -419,21 +426,6 @@ WIMLIBAPI int wimlib_get_boot_idx(const WIMStruct *w)
        return w->hdr.boot_idx;
 }
 
-/* Opens a WIM readable */
-static int open_wim_readable(WIMStruct *w, const char *path)
-{
-       if (w->fp != NULL)
-               fclose(w->fp);
-       wimlib_assert(path != NULL);
-       w->fp = fopen(path, "rb");
-       if (!w->fp) {
-               ERROR_WITH_ERRNO("Failed to open `%s' for reading",
-                                path);
-               return WIMLIB_ERR_OPEN;
-       }
-       return 0;
-}
-
 /*
  * Begins the reading of a WIM file; opens the file and reads its header and
  * lookup table, and optionally checks the integrity.
@@ -442,18 +434,33 @@ static int begin_read(WIMStruct *w, const char *in_wim_path, int open_flags,
                      wimlib_progress_func_t progress_func)
 {
        int ret;
-       uint xml_num_images;
+       int xml_num_images;
 
        DEBUG("Reading the WIM file `%s'", in_wim_path);
 
-       ret = open_wim_readable(w, in_wim_path);
-       if (ret != 0)
-               goto out;
+       w->fp = fopen(in_wim_path, "rb");
+       if (!w->fp) {
+               ERROR_WITH_ERRNO("Failed to open `%s' for reading",
+                                in_wim_path);
+               return WIMLIB_ERR_OPEN;
+       }
 
+       /* The absolute path to the WIM is requested so that wimlib_overwrite()
+        * still works even if the process changes its working directory.  This
+        * actually happens if a WIM is mounted read-write, since the FUSE
+        * thread changes directory to "/", and it needs to be able to find the
+        * WIM file again.
+        *
+        * This will break if the full path to the WIM changes in the
+        * intervening time...
+        */
        w->filename = realpath(in_wim_path, NULL);
        if (!w->filename) {
                ERROR_WITH_ERRNO("Failed to resolve WIM filename");
-               ret = WIMLIB_ERR_NOMEM;
+               if (errno == ENOMEM)
+                       ret = WIMLIB_ERR_NOMEM;
+               else
+                       ret = WIMLIB_ERR_OPEN;
                goto out_close;
        }
 
@@ -461,7 +468,7 @@ static int begin_read(WIMStruct *w, const char *in_wim_path, int open_flags,
        if (ret != 0)
                goto out_close;
 
-       DEBUG("Wim file contains %u images", w->hdr.image_count);
+       DEBUG("According to header, WIM contains %u images", w->hdr.image_count);
 
        /* If the boot index is invalid, print a warning and set it to 0 */
        if (w->hdr.boot_idx > w->hdr.image_count) {
@@ -561,7 +568,7 @@ static int begin_read(WIMStruct *w, const char *in_wim_path, int open_flags,
        }
 
        DEBUG("Done beginning read of WIM file `%s'.", in_wim_path);
-       return 0;
+       /*return 0;*/
 
        //
        // Everything is freed in wimlib_free() anyway, so no need to roll back
@@ -582,7 +589,6 @@ out_free_lookup_table:
 out_close:
        /*fclose(w->fp);*/
        /*w->fp = NULL;*/
-out:
        return ret;
 }
 
@@ -597,7 +603,8 @@ WIMLIBAPI int wimlib_open_wim(const char *wim_file, int open_flags,
        WIMStruct *w;
        int ret;
 
-       DEBUG("wim_file = `%s', open_flags = %#x", wim_file, open_flags);
+       if (!wim_file || !w_ret)
+               return WIMLIB_ERR_INVALID_PARAM;
        w = new_wim_struct();
        if (!w) {
                ERROR("Failed to allocate memory for WIMStruct");