static int ds_sds_dump_component_sce(const xmlNode *script_node, const char *component_id, const char *filename) { if (script_node) { if (oscap_acquire_ensure_parent_dir(filename) < 0) { oscap_seterr(OSCAP_EFAMILY_XML, "Error while creating script parent directory for file '%s' of (id='%s')", filename, component_id); return -1; } // TODO: should we check whether the component is extended? int fd; xmlChar* text_contents = xmlNodeGetContent(script_node); if ((fd = open(filename, O_CREAT | O_TRUNC | O_NOFOLLOW | O_WRONLY, 0700)) < 0) { oscap_seterr(OSCAP_EFAMILY_XML, "Error while creating script component (id='%s') to file '%s'.", component_id, filename); xmlFree(text_contents); return -1; } FILE* output_file = fdopen(fd, "w"); if (output_file == NULL) { oscap_seterr(OSCAP_EFAMILY_XML, "Error while dumping script component (id='%s') to file '%s'.", component_id, filename); xmlFree(text_contents); close(fd); return -1; } // TODO: error checking, fprintf should return strlen((const char*)text_contents) fprintf(output_file, "%s", text_contents ? (char*)text_contents : ""); #ifndef _WIN32 // NB: This code is for SCE scripts if (fchmod(fd, 0700) != 0) { oscap_seterr(OSCAP_EFAMILY_XML, "Failed to set executable permission on script (id='%s') that was split to '%s'.", component_id, filename); } #endif dD("Successfully dumped script component (id='%s') to file '%s'.", component_id, filename); fclose(output_file); xmlFree(text_contents); return 0; } else { oscap_seterr(OSCAP_EFAMILY_XML, "Error while dumping script component (id='%s') to file '%s'. " "The script element was empty!", component_id, filename); return -1; } }
int ds_dump_component_sources(struct oscap_htable *component_sources, const char *target_dir) { struct oscap_htable_iterator *hit = oscap_htable_iterator_new(component_sources); while (oscap_htable_iterator_has_more(hit)) { struct oscap_source *s = oscap_htable_iterator_next_value(hit); char *filename = target_dir == NULL ? oscap_strdup(oscap_source_readable_origin(s)) : oscap_sprintf("%s/%s", target_dir, oscap_source_readable_origin(s)); int ret = oscap_acquire_ensure_parent_dir(filename); if (ret != 0) { oscap_htable_iterator_free(hit); return ret; } ret = oscap_source_save_as(s, filename); free(filename); if (ret != 0) { oscap_htable_iterator_free(hit); return ret; } } oscap_htable_iterator_free(hit); return 0; }