/*
* Copyright (C) 2012, 2013 Eric Biggers
*
- * wimlib - Library for working with WIM files
- *
* This file is part of wimlib, a library for working with WIM files.
*
* wimlib is free software; you can redistribute it and/or modify it under the
* along with wimlib; if not, see http://www.gnu.org/licenses/.
*/
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "wimlib/error.h"
+#include "wimlib/dentry.h"
+#include "wimlib/encoding.h"
+#include "wimlib/file_io.h"
+#include "wimlib/integrity.h"
+#include "wimlib/lookup_table.h"
+#include "wimlib/metadata.h"
+#ifdef WITH_NTFS_3G
+# include "wimlib/ntfs_3g.h" /* for do_ntfs_umount() */
+#endif
+#include "wimlib/security.h"
+#include "wimlib/wim.h"
+#include "wimlib/xml.h"
+
+#ifdef __WIN32__
+# include "wimlib/win32.h" /* for realpath() replacement */
+#endif
#include <errno.h>
#include <fcntl.h>
+#ifndef __WIN32__
+# include <langinfo.h>
+#endif
#include <limits.h>
#include <stdarg.h>
#include <stdlib.h>
#include <unistd.h>
-#ifdef __WIN32__
-# include "win32.h"
-#else
-# include <langinfo.h>
-#endif
-
-#include "buffer_io.h"
-#include "dentry.h"
-#include "lookup_table.h"
-#include "wimlib_internal.h"
-#include "xml.h"
-
static int
image_print_metadata(WIMStruct *w)
{
DEBUG("Printing metadata for image %d", w->current_image);
- print_security_data(wim_security_data(w));
+ print_wim_security_data(wim_security_data(w));
return for_dentry_in_tree(wim_root_dentry(w), print_dentry,
w->lookup_table);
}
}
static WIMStruct *
-new_wim_struct()
+new_wim_struct(void)
{
WIMStruct *w = CALLOC(1, sizeof(WIMStruct));
-#if defined(WITH_FUSE) || defined(ENABLE_MULTITHREADED_COMPRESSION)
- if (pthread_mutex_init(&w->fp_tab_mutex, NULL) != 0) {
- ERROR_WITH_ERRNO("Failed to initialize mutex");
- FREE(w);
- w = NULL;
+ if (w) {
+ w->in_fd = -1;
+ w->out_fd = -1;
}
-#endif
return w;
-
}
/*
}
w->current_image = image;
imd = wim_get_current_image_metadata(w);
- if (imd->root_dentry) {
+ if (imd->root_dentry || imd->modified) {
ret = 0;
} else {
#ifdef ENABLE_DEBUG
wim_info_get_total_bytes(w->wim_info));
tprintf(T("Integrity Info: %"TS"\n"),
(w->hdr.integrity.offset != 0) ? T("yes") : T("no"));
+ tprintf(T("Relative path junction: %"TS"\n"),
+ (hdr->flags & WIM_HDR_FLAG_RP_FIX) ? T("yes") : T("no"));
tputchar(T('\n'));
}
return w->hdr.boot_idx;
}
+static int
+do_open_wim(const tchar *filename, int *fd_ret)
+{
+ int fd;
+
+ fd = topen(filename, O_RDONLY | O_BINARY);
+ if (fd == -1) {
+ ERROR_WITH_ERRNO("Can't open \"%"TS"\" read-only", filename);
+ return WIMLIB_ERR_OPEN;
+ }
+ *fd_ret = fd;
+ return 0;
+}
+
+int
+reopen_wim(WIMStruct *w)
+{
+ wimlib_assert(w->in_fd == -1);
+ return do_open_wim(w->filename, &w->in_fd);
+}
+
+int
+close_wim(WIMStruct *w)
+{
+ if (w->in_fd != -1) {
+ close(w->in_fd);
+ w->in_fd = -1;
+ }
+ return 0;
+}
+
/*
* Begins the reading of a WIM file; opens the file and reads its header and
* lookup table, and optionally checks the integrity.
DEBUG("Reading the WIM file `%"TS"'", in_wim_path);
- w->fp = tfopen(in_wim_path, T("rb"));
- if (!w->fp) {
- ERROR_WITH_ERRNO("Failed to open `%"TS"' for reading",
- in_wim_path);
- return WIMLIB_ERR_OPEN;
- }
+ ret = do_open_wim(in_wim_path, &w->in_fd);
+ if (ret)
+ return ret;
/* The absolute path to the WIM is requested so that wimlib_overwrite()
* still works even if the process changes its working directory. This
return WIMLIB_ERR_OPEN;
}
- ret = read_header(w->fp, &w->hdr, open_flags);
+ ret = read_header(w->filename, w->in_fd, &w->hdr, open_flags);
if (ret)
return ret;
if (ret)
return ret;
- ret = read_xml_data(w->fp, &w->hdr.xml_res_entry, &w->wim_info);
+ ret = read_xml_data(w->in_fd, &w->hdr.xml_res_entry, &w->wim_info);
if (ret)
return ret;
{
free_dentry_tree(imd->root_dentry, table);
imd->root_dentry = NULL;
- free_security_data(imd->security_data);
+ free_wim_security_data(imd->security_data);
imd->security_data = NULL;
if (free_metadata_lte) {
struct wim_image_metadata *
-new_image_metadata()
+new_image_metadata(void)
{
struct wim_image_metadata *imd;
if (!w)
return;
- if (w->fp)
- fclose(w->fp);
- if (w->out_fp)
- fclose(w->out_fp);
-
-#if defined(WITH_FUSE) || defined(ENABLE_MULTITHREADED_COMPRESSION)
- if (w->fp_tab) {
- for (size_t i = 0; i < w->num_allocated_fps; i++)
- if (w->fp_tab[i])
- fclose(w->fp_tab[i]);
- FREE(w->fp_tab);
- }
- pthread_mutex_destroy(&w->fp_tab_mutex);
-#endif
+ if (w->in_fd != -1)
+ close(w->in_fd);
+ if (w->out_fd != -1)
+ close(w->out_fd);
free_lookup_table(w->lookup_table);
}
static bool
-test_locale_ctype_utf8()
+test_locale_ctype_utf8(void)
{
#ifdef __WIN32__
return false;
/* Free global memory allocations. Not strictly necessary if the process using
* wimlib is just about to exit (as is the case for 'imagex'). */
WIMLIBAPI void
-wimlib_global_cleanup()
+wimlib_global_cleanup(void)
{
libxml_global_cleanup();
iconv_global_cleanup();