#include #include #include #include #include #include #include #include #include #include #include "xml.h" extern char *__progname; void xml_parse(const char *file, char *entity_path, struct parse_info *pi) { char path[PATH_MAX]; char buf[PATH_MAX]; XML_Parser parser; struct stat st; char *s, *p; void *v; int ch; int fd; p = buf; strcpy(p, entity_path); while ((s = strsep(&p, ":")) != NULL) { snprintf(path, sizeof(path), "%s/%s", s, file); if ((fd = open(path, O_RDONLY)) > 0) break; } if (fd < 0) err(1, "open"); bzero(&st, sizeof(st)); if (fstat(fd, &st) < 0) err(1, "fstat"); v = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); if (v == MAP_FAILED) err(1, "mmap"); parser = XML_ParserCreate(NULL); XML_SetUserData(parser, pi); XML_SetStartElementHandler(parser, pi->pi_start_element); XML_SetEndElementHandler(parser, pi->pi_end_element); XML_SetCharacterDataHandler(parser, pi->pi_characters); XML_Parse(parser, v, st.st_size, 1); if (munmap(v, st.st_size) < 0) err(1, "munmap"); close(fd); }