X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fxml.c;h=deeedb50efba04f5088e52615f66380124846c8f;hp=8d2b9106f3efb9d1ef3f971056ea4c44729a5c33;hb=2b4f92cc80af257566c00e62fd3f0a7e3607416b;hpb=da295f258b60e1593de305385c0669eac4b76644 diff --git a/src/xml.c b/src/xml.c index 8d2b9106..deeedb50 100644 --- a/src/xml.c +++ b/src/xml.c @@ -165,19 +165,35 @@ wim_info_get_num_images(const struct wim_info *info) 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"); } @@ -736,7 +752,11 @@ xml_write_windows_version(xmlTextWriter *writer, if (rc < 0) return rc; - return xmlTextWriterEndElement(writer); /* */ + rc = xmlTextWriterEndElement(writer); /* */ + if (rc < 0) + return rc; + + return 0; } /* Writes the information contained in a `struct windows_info' to the XML @@ -786,16 +806,19 @@ xml_write_windows_info(xmlTextWriter *writer, 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); /* */ + rc = xmlTextWriterEndElement(writer); /* */ + if (rc < 0) + return rc; + + return 0; } /* Writes a time element to the XML document being constructed in memory. */ @@ -881,6 +904,7 @@ xml_write_image_info(xmlTextWriter *writer, const struct image_info *image_info) rc = xmlTextWriterEndElement(writer); /* */ if (rc < 0) return rc; + return 0; } @@ -1464,6 +1488,7 @@ out_output_buffer_close: out_buffer_free: xmlBufferFree(buf); out: + DEBUG("ret=%d", ret); return ret; out_write_error: @@ -1499,8 +1524,10 @@ write_wim_xml_data(WIMStruct *wim, int image, u64 total_bytes, WIMLIB_COMPRESSION_TYPE_NONE, out_res_entry, NULL, - write_resource_flags); + write_resource_flags, + &wim->lzx_context); FREE(xml_data); + DEBUG("ret=%d"); return ret; } @@ -1537,30 +1564,34 @@ wimlib_image_name_in_use(const WIMStruct *wim, const tchar *name) /* API function documented in wimlib.h */ WIMLIBAPI int -wimlib_extract_xml_data(WIMStruct *wim, FILE *fp) +wimlib_get_xml_data(WIMStruct *wim, void **buf_ret, size_t *bufsize_ret) { - size_t size; - void *buf; - int ret; + if (wim->filename == NULL) + return WIMLIB_ERR_INVALID_PARAM; - if (!wim->filename) + if (buf_ret == NULL || bufsize_ret == NULL) return WIMLIB_ERR_INVALID_PARAM; - ret = res_entry_to_data(&wim->hdr.xml_res_entry, wim, &buf); + *bufsize_ret = wim->hdr.xml_res_entry.original_size; + return res_entry_to_data(&wim->hdr.xml_res_entry, wim, buf_ret); +} + +WIMLIBAPI int +wimlib_extract_xml_data(WIMStruct *wim, FILE *fp) +{ + int ret; + void *buf; + size_t bufsize; + + 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; }