void ploop_close_dd(struct ploop_disk_images_data *di) { if (di == NULL) return; ploop_clear_dd(di); free(di->runtime->xml_fname); free(di->runtime->component_name); free(di->runtime); free(di); }
int ploop_read_dd(struct ploop_disk_images_data *di) { int ret; char basedir[PATH_MAX]; const char *fname; struct stat st; xmlDoc *doc = NULL; xmlNode *root_element = NULL; LIBXML_TEST_VERSION if (!di || !di->runtime || !di->runtime->xml_fname) { ploop_err(0, "DiskDescriptor.xml is not opened"); return -1; } ploop_clear_dd(di); fname = di->runtime->xml_fname; if (stat(fname, &st)) { ploop_err(errno, "Can't stat %s", fname); return -1; } /* workaround libxml2 SIGSEGV on empty document */ if (st.st_size == 0) { ploop_err(0, "Can't parse %s", fname); return -1; } doc = xmlReadFile(fname, NULL, 0); if (doc == NULL) { ploop_err(0, "Can't parse %s", fname); return -1; } root_element = xmlDocGetRootElement(doc); get_basedir(fname, basedir, sizeof(basedir)); ret = parse_xml(basedir, root_element, di); if (ret == 0) ret = validate_disk_descriptor(di); xmlFreeDoc(doc); return ret; }