* along with wimlib; if not, see http://www.gnu.org/licenses/.
*/
-#include "wimlib_internal.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "wimlib.h"
+#include "wimlib/error.h"
#ifdef WITH_FUSE
# error "FUSE mount not supported on Win32! Please configure --without-fuse"
#endif
-#include "buffer_io.h"
-#include "lookup_table.h"
-#include "sha1.h"
-#include "timestamp.h"
-#include "xml.h"
+#include "wimlib/encoding.h"
+#include "wimlib/file_io.h"
+#include "wimlib/lookup_table.h"
+#include "wimlib/metadata.h"
+#include "wimlib/paths.h"
+#include "wimlib/reparse.h"
+#include "wimlib/resource.h"
+#include "wimlib/swm.h"
+#include "wimlib/timestamp.h"
+#include "wimlib/version.h"
+#include "wimlib/write.h"
+#include "wimlib/xml.h"
#include <errno.h>
#include <ftw.h>
#define WIMFS_CTX(fuse_ctx) ((struct wimfs_context*)(fuse_ctx)->private_data)
static inline struct wimfs_context *
-wimfs_get_context()
+wimfs_get_context(void)
{
return WIMFS_CTX(fuse_get_context());
}
static inline WIMStruct *
-wimfs_get_WIMStruct()
+wimfs_get_WIMStruct(void)
{
return wimfs_get_context()->wim;
}
struct msg_unmount_finished {
struct unmount_msg_hdr hdr;
- int32_t status;
+ s32 status;
} PACKED;
struct msg_write_streams_progress {
char *argv[16];
int ret;
char *dir_copy;
- struct wim_lookup_table *joined_tab, *wim_tab_save;
struct wim_image_metadata *imd;
struct wimfs_context ctx;
struct wim_inode *inode;
DEBUG("Mount: wim = %p, image = %d, dir = %s, flags = %d, ",
wim, image, dir, mount_flags);
- if (!wim || !dir)
- return WIMLIB_ERR_INVALID_PARAM;
+ if (!wim || !dir) {
+ ret = WIMLIB_ERR_INVALID_PARAM;
+ goto out;
+ }
ret = verify_swm_set(wim, additional_swms, num_additional_swms);
if (ret)
- return ret;
+ goto out;
if ((mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) && (wim->hdr.total_parts != 1)) {
ERROR("Cannot mount a split WIM read-write");
- return WIMLIB_ERR_SPLIT_UNSUPPORTED;
+ ret = WIMLIB_ERR_SPLIT_UNSUPPORTED;
+ goto out;
}
- if (num_additional_swms) {
- ret = new_joined_lookup_table(wim, additional_swms,
- num_additional_swms,
- &joined_tab);
- if (ret)
- return ret;
- wim_tab_save = wim->lookup_table;
- wim->lookup_table = joined_tab;
- }
+ if (num_additional_swms)
+ merge_lookup_tables(wim, additional_swms, num_additional_swms);
if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) {
ret = wim_run_full_verifications(wim);
if (ret)
- goto out;
+ goto out_restore_lookup_table;
}
ret = wim_checksum_unhashed_streams(wim);
if (ret)
- goto out;
+ goto out_restore_lookup_table;
ret = select_wim_image(wim, image);
if (ret)
- goto out;
+ goto out_restore_lookup_table;
DEBUG("Selected image %d", image);
ERROR("Cannot mount image that was just exported with "
"wimlib_export_image()");
ret = WIMLIB_ERR_INVALID_PARAM;
- goto out;
+ goto out_restore_lookup_table;
}
if (imd->modified) {
ERROR("Cannot mount image that was added "
"with wimlib_add_image()");
ret = WIMLIB_ERR_INVALID_PARAM;
- goto out;
+ goto out_restore_lookup_table;
}
if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) {
ret = lock_wim(wim, wim->in_fd);
if (ret)
- goto out;
+ goto out_restore_lookup_table;
}
/* Use default stream interface if one was not specified */
wim->wim_locked = 0;
out_free_message_queue_names:
free_message_queue_names(&ctx);
+out_restore_lookup_table:
+ if (num_additional_swms)
+ unmerge_lookup_table(wim);
out:
- if (num_additional_swms) {
- free_lookup_table(wim->lookup_table);
- wim->lookup_table = wim_tab_save;
- }
return ret;
}
static int
-mount_unsupported_error()
+mount_unsupported_error(void)
{
#if defined(__WIN32__)
ERROR("Sorry-- Mounting WIM images is not supported on Windows!");