X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fxml.c;h=b6a010c4035f49189a34eda3f4703c9e3ab111a2;hb=5d52d8c322857646dec623cedc35796dc135e2b9;hp=da47b28ea3815841e386f6545dd10578d01154ca;hpb=4f8059f2d0a74a9922128b162d9c9343b305999c;p=wimlib diff --git a/src/xml.c b/src/xml.c index da47b28e..b6a010c4 100644 --- a/src/xml.c +++ b/src/xml.c @@ -23,18 +23,26 @@ * along with wimlib; if not, see http://www.gnu.org/licenses/. */ -#include "dentry.h" -#include "lookup_table.h" -#include "timestamp.h" -#include "wimlib_internal.h" -#include "xml.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif -#include +#include "wimlib/dentry.h" +#include "wimlib/encoding.h" +#include "wimlib/error.h" +#include "wimlib/file_io.h" +#include "wimlib/lookup_table.h" +#include "wimlib/metadata.h" +#include "wimlib/resource.h" +#include "wimlib/timestamp.h" +#include "wimlib/xml.h" + +#include #include #include #include -#include #include +#include /* Structures used to form an in-memory representation of the XML data (other * than the raw parse tree from libxml). */ @@ -78,6 +86,7 @@ struct image_info { tchar *display_name; tchar *display_description; tchar *flags; + struct wim_lookup_table *lookup_table; /* temporary field */ }; struct xml_string_spec { @@ -439,7 +448,7 @@ xml_read_image_info(xmlNode *image_node, struct image_info *image_info) if (!image_info->name) { tchar *empty_name; WARNING("Image with index %d has no name", image_info->index); - empty_name = TMALLOC(1); + empty_name = MALLOC(sizeof(tchar)); if (!empty_name) return WIMLIB_ERR_NOMEM; *empty_name = T('\0'); @@ -1078,7 +1087,7 @@ calculate_dentry_statistics(struct wim_dentry *dentry, void *arg) * link bytes", and this size is multiplied by the link count (NOT one * less than the link count). */ - lte = inode_unnamed_lte_resolved(inode); + lte = inode_unnamed_lte(inode, info->lookup_table); if (lte) { info->total_bytes += wim_resource_size(lte); if (!dentry_is_first_in_inode(dentry)) @@ -1088,7 +1097,7 @@ calculate_dentry_statistics(struct wim_dentry *dentry, void *arg) if (inode->i_nlink >= 2 && dentry_is_first_in_inode(dentry)) { for (unsigned i = 0; i < inode->i_num_ads; i++) { if (inode->i_ads_entries[i].stream_name_nbytes) { - lte = inode_stream_lte_resolved(inode, i + 1); + lte = inode_stream_lte(inode, i + 1, info->lookup_table); if (lte) { info->hard_link_bytes += inode->i_nlink * wim_resource_size(lte); @@ -1119,6 +1128,7 @@ xml_update_image_info(WIMStruct *w, int image) image_info->dir_count = 0; image_info->total_bytes = 0; image_info->hard_link_bytes = 0; + image_info->lookup_table = w->lookup_table; for_dentry_in_tree(w->image_metadata[image - 1]->root_dentry, calculate_dentry_statistics, @@ -1209,7 +1219,7 @@ print_image_info(const struct wim_info *wim_info, int image) wim_timestamp_to_str(image_info->creation_time, buf, sizeof(buf)); tprintf(T("Creation Time: %"TS"\n"), buf); - wim_timestamp_to_str(image_info->creation_time, buf, sizeof(buf)); + wim_timestamp_to_str(image_info->last_modification_time, buf, sizeof(buf)); tprintf(T("Last Modification Time: %"TS"\n"), buf); if (image_info->windows_info_exists) print_windows_info(&image_info->windows_info); @@ -1219,14 +1229,14 @@ print_image_info(const struct wim_info *wim_info, int image) } void -libxml_global_init() +libxml_global_init(void) { xmlInitParser(); xmlInitCharEncodingHandlers(); } void -libxml_global_cleanup() +libxml_global_cleanup(void) { xmlCleanupParser(); xmlCleanupCharEncodingHandlers(); @@ -1314,12 +1324,6 @@ out: return ret; } -#define CHECK_RET ({ if (ret < 0) { \ - ERROR("Error writing XML data"); \ - ret = WIMLIB_ERR_WRITE; \ - goto out_free_text_writer; \ - } }) - /* * Writes XML data to a WIM file. * @@ -1395,11 +1399,13 @@ write_xml_data(const struct wim_info *wim_info, int image, int out_fd, DEBUG("Writing element"); ret = xmlTextWriterStartElement(writer, "WIM"); - CHECK_RET; + if (ret < 0) + goto out_write_error; ret = xmlTextWriterWriteFormatElement(writer, "TOTALBYTES", "%"PRIu64, total_bytes); - CHECK_RET; + if (ret < 0) + goto out_write_error; if (wim_info != NULL) { int first, last; @@ -1414,17 +1420,24 @@ write_xml_data(const struct wim_info *wim_info, int image, int out_fd, for (int i = first; i <= last; i++) { ret = xml_write_image_info(writer, &wim_info->images[i - 1]); if (ret) { - CHECK_RET; + if (ret < 0) + goto out_write_error; goto out_free_text_writer; } } } ret = xmlTextWriterEndElement(writer); - CHECK_RET; + if (ret < 0) + goto out_write_error; ret = xmlTextWriterEndDocument(writer); - CHECK_RET; + if (ret < 0) + goto out_write_error; + + ret = xmlTextWriterFlush(writer); + if (ret < 0) + goto out_write_error; DEBUG("Ended XML document"); @@ -1441,14 +1454,17 @@ write_xml_data(const struct wim_info *wim_info, int image, int out_fd, out_free_text_writer: /* xmlFreeTextWriter will free the attached xmlOutputBuffer. */ xmlFreeTextWriter(writer); - out_buffer = NULL; + goto out; out_output_buffer_close: - if (out_buffer != NULL) - xmlOutputBufferClose(out_buffer); + xmlOutputBufferClose(out_buffer); out: if (ret == 0) DEBUG("Successfully wrote XML data"); return ret; +out_write_error: + ERROR("Error writing XML data"); + ret = WIMLIB_ERR_WRITE; + goto out_free_text_writer; } /* Returns the name of the specified image. */