#include "wimlib/resource.h"
#include "wimlib/timestamp.h"
#include "wimlib/xml.h"
+#include "wimlib/write.h"
#include <libxml/encoding.h>
#include <libxml/parser.h>
u64
wim_info_get_total_bytes(const struct wim_info *info)
{
- if (!info)
+ if (info)
+ return info->total_bytes;
+ else
return 0;
- return info->total_bytes;
}
u64
wim_info_get_image_hard_link_bytes(const struct wim_info *info, int image)
{
- return info->images[image - 1].hard_link_bytes;
+ if (info)
+ return info->images[image - 1].hard_link_bytes;
+ else
+ return 0;
}
u64
wim_info_get_image_total_bytes(const struct wim_info *info, int image)
{
- return info->images[image - 1].total_bytes;
+ if (info)
+ return info->images[image - 1].total_bytes;
+ else
+ return 0;
}
unsigned
wim_info_get_num_images(const struct wim_info *info)
{
- return info->num_images;
+ if (info)
+ return info->num_images;
+ else
+ return 0;
}
+/* Architecture constants are from w64 mingw winnt.h */
+#define PROCESSOR_ARCHITECTURE_INTEL 0
+#define PROCESSOR_ARCHITECTURE_MIPS 1
+#define PROCESSOR_ARCHITECTURE_ALPHA 2
+#define PROCESSOR_ARCHITECTURE_PPC 3
+#define PROCESSOR_ARCHITECTURE_SHX 4
+#define PROCESSOR_ARCHITECTURE_ARM 5
+#define PROCESSOR_ARCHITECTURE_IA64 6
+#define PROCESSOR_ARCHITECTURE_ALPHA64 7
+#define PROCESSOR_ARCHITECTURE_MSIL 8
+#define PROCESSOR_ARCHITECTURE_AMD64 9
+#define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
+
/* Returns a statically allocated string that is a string representation of the
* architecture number. */
static const tchar *
get_arch(int arch)
{
switch (arch) {
- case 0:
+ case PROCESSOR_ARCHITECTURE_INTEL:
return T("x86");
- case 6:
+ case PROCESSOR_ARCHITECTURE_MIPS:
+ return T("MIPS");
+ case PROCESSOR_ARCHITECTURE_ARM:
+ return T("ARM");
+ case PROCESSOR_ARCHITECTURE_IA64:
return T("ia64");
- case 9:
+ case PROCESSOR_ARCHITECTURE_AMD64:
return T("x86_64");
- /* XXX Are there other arch values? */
default:
return T("unknown");
}
for (size_t i = 0; i < num_specs; i++) {
int rc = xml_write_string(writer, specs[i].name,
*(const tchar * const *)
- (struct_with_strings + specs[i].offset));
+ (struct_with_strings + specs[i].offset));
if (rc)
return rc;
}
if (rc < 0)
return rc;
- return xmlTextWriterEndElement(writer); /* </VERSION> */
+ rc = xmlTextWriterEndElement(writer); /* </VERSION> */
+ if (rc < 0)
+ return rc;
+
+ return 0;
}
/* Writes the information contained in a `struct windows_info' to the XML
if (windows_info->windows_version_exists) {
rc = xml_write_windows_version(writer, &windows_info->windows_version);
- if (rc < 0)
+ if (rc)
return rc;
}
- rc = xml_write_string(writer, "SYSTEMROOT",
- windows_info->system_root);
+ rc = xml_write_string(writer, "SYSTEMROOT", windows_info->system_root);
if (rc)
return rc;
- return xmlTextWriterEndElement(writer); /* </WINDOWS> */
+ rc = xmlTextWriterEndElement(writer); /* </WINDOWS> */
+ if (rc < 0)
+ return rc;
+
+ return 0;
}
/* Writes a time element to the XML document being constructed in memory. */
rc = xmlTextWriterEndElement(writer); /* </IMAGE> */
if (rc < 0)
return rc;
+
return 0;
}
return max_len;
}
-#ifdef ENABLE_CUSTOM_MEMORY_ALLOCATOR
void
xml_set_memory_allocator(void *(*malloc_func)(size_t),
void (*free_func)(void *),
{
xmlMemSetup(free_func, malloc_func, realloc_func, STRDUP);
}
-#endif
static int
calculate_dentry_statistics(struct wim_dentry *dentry, void *arg)
*/
lte = inode_unnamed_lte(inode, info->lookup_table);
if (lte) {
- info->total_bytes += wim_resource_size(lte);
+ info->total_bytes += lte->size;
if (!dentry_is_first_in_inode(dentry))
- info->hard_link_bytes += wim_resource_size(lte);
+ info->hard_link_bytes += lte->size;
}
if (inode->i_nlink >= 2 && dentry_is_first_in_inode(dentry)) {
lte = inode_stream_lte(inode, i + 1, info->lookup_table);
if (lte) {
info->hard_link_bytes += inode->i_nlink *
- wim_resource_size(lte);
+ lte->size;
}
}
}
int
read_wim_xml_data(WIMStruct *wim)
{
+ void *buf;
+ size_t bufsize;
u8 *xml_data;
xmlDoc *doc;
xmlNode *root;
int ret;
- const struct resource_entry *res_entry;
-
- res_entry = &wim->hdr.xml_res_entry;
- DEBUG("Reading XML data: %"PRIu64" bytes at offset %"PRIu64"",
- (u64)res_entry->size, res_entry->offset);
-
- ret = res_entry_to_data(res_entry, wim, (void**)&xml_data);
+ ret = wimlib_get_xml_data(wim, &buf, &bufsize);
if (ret)
goto out;
+ xml_data = buf;
- doc = xmlReadMemory((const char *)xml_data, res_entry->original_size,
+ doc = xmlReadMemory((const char *)xml_data, bufsize,
NULL, "UTF-16LE", 0);
if (!doc) {
ERROR("Failed to parse XML data");
out_buffer_free:
xmlBufferFree(buf);
out:
+ DEBUG("ret=%d", ret);
return ret;
out_write_error:
/* Writes the XML data to a WIM file. */
int
write_wim_xml_data(WIMStruct *wim, int image, u64 total_bytes,
- struct resource_entry *out_res_entry,
+ struct wim_reshdr *out_reshdr,
int write_resource_flags)
{
int ret;
WIM_RESHDR_FLAG_METADATA,
&wim->out_fd,
WIMLIB_COMPRESSION_TYPE_NONE,
- out_res_entry,
+ 0,
+ out_reshdr,
NULL,
write_resource_flags);
FREE(xml_data);
+ DEBUG("ret=%d", ret);
return ret;
}
/* API function documented in wimlib.h */
+WIMLIBAPI int
+wimlib_get_xml_data(WIMStruct *wim, void **buf_ret, size_t *bufsize_ret)
+{
+ const struct wim_reshdr *xml_reshdr;
+
+ if (wim->filename == NULL && filedes_is_seekable(&wim->in_fd))
+ return WIMLIB_ERR_INVALID_PARAM;
+
+ if (buf_ret == NULL || bufsize_ret == NULL)
+ return WIMLIB_ERR_INVALID_PARAM;
+
+ xml_reshdr = &wim->hdr.xml_data_reshdr;
+
+ DEBUG("Reading XML data.");
+ *bufsize_ret = xml_reshdr->uncompressed_size;
+ return wim_reshdr_to_data(xml_reshdr, wim, buf_ret);
+}
+
WIMLIBAPI int
wimlib_extract_xml_data(WIMStruct *wim, FILE *fp)
{
- size_t size;
- void *buf;
int ret;
+ void *buf;
+ size_t bufsize;
- ret = res_entry_to_data(&wim->hdr.xml_res_entry, wim, &buf);
+ ret = wimlib_get_xml_data(wim, &buf, &bufsize);
if (ret)
- goto out;
+ return ret;
- size = wim->hdr.xml_res_entry.original_size;
- if (fwrite(buf, 1, size, fp) != size) {
+ if (fwrite(buf, 1, bufsize, fp) != bufsize) {
ERROR_WITH_ERRNO("Failed to extract XML data");
ret = WIMLIB_ERR_WRITE;
- goto out_free_buf;
}
-
- ret = 0;
-out_free_buf:
FREE(buf);
-out:
return ret;
}