#include "sha1.h"
#include "razor.h"
-static void
-parse_package(struct razor_importer *importer, const char **atts, void *data)
-{
- const char *name = NULL, *version = NULL;
- int i;
-
- for (i = 0; atts[i]; i += 2) {
- if (strcmp(atts[i], "name") == 0)
- name = atts[i + 1];
- else if (strcmp(atts[i], "version") == 0)
- version = atts[i + 1];
- }
-
- if (name == NULL || version == NULL) {
- fprintf(stderr, "invalid package tag, "
- "missing name or version attributes\n");
- return;
- }
-
- razor_importer_begin_package(importer, name, version);
-}
-
-enum {
- RZR_REQUIRES, RZR_PROVIDES
-};
-
-static void
-parse_property(struct razor_importer *importer, const char **atts, void *data)
-{
- const char *name = NULL, *version = NULL;
- int i;
-
- for (i = 0; atts[i]; i += 2) {
- if (strcmp(atts[i], "name") == 0)
- name = atts[i + 1];
- if (strcmp(atts[i], "version") == 0)
- version = atts[i + 1];
- }
-
- if (name == NULL) {
- fprintf(stderr, "invalid tag, missing name attribute\n");
- return;
- }
-
- switch ((int) data) {
- case RZR_REQUIRES:
- razor_importer_add_property(importer, name, version,
- RAZOR_PROPERTY_REQUIRES);
- break;
- case RZR_PROVIDES:
- razor_importer_add_property(importer, name, version,
- RAZOR_PROPERTY_PROVIDES);
- break;
- }
-}
-
-static void
-start_element(void *data, const char *name, const char **atts)
-{
- struct razor_importer *importer = data;
-
- if (strcmp(name, "package") == 0)
- parse_package(importer, atts, NULL);
- else if (strcmp(name, "requires") == 0)
- parse_property(importer, atts, (void *) RZR_REQUIRES);
- else if (strcmp(name, "provides") == 0)
- parse_property(importer, atts, (void*) RZR_PROVIDES);
-}
-
-static void
-end_element (void *data, const char *name)
-{
- struct razor_importer *importer = data;
-
- if (strcmp(name, "package") == 0)
- razor_importer_finish_package(importer);
-}
-
-static int
-import_rzr_file(struct razor_importer *importer, const char *filename)
-{
- SHA_CTX sha1;
- XML_Parser parser;
- int fd;
- void *p;
- struct stat stat;
- unsigned char hash[20];
-
- fd = open(filename, O_RDONLY);
- if (fstat(fd, &stat) < 0)
- return -1;
- p = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
- if (p == MAP_FAILED)
- return -1;
-
- parser = XML_ParserCreate(NULL);
- XML_SetUserData(parser, importer);
- XML_SetElementHandler(parser, start_element, end_element);
- if (XML_Parse(parser, p, stat.st_size, 1) == XML_STATUS_ERROR) {
- fprintf(stderr,
- "%s at line %ld, %s\n",
- XML_ErrorString(XML_GetErrorCode(parser)),
- XML_GetCurrentLineNumber(parser),
- filename);
- return 1;
- }
-
- XML_ParserFree(parser);
-
- SHA1_Init(&sha1);
- SHA1_Update(&sha1, p, stat.st_size);
- SHA1_Final(hash, &sha1);
-
- close(fd);
-
- munmap(p, stat.st_size);
-
- return 0;
-}
-
-struct razor_set *
-razor_import_rzr_files(int count, const char *files[])
-{
- struct razor_importer *importer;
- int i;
-
- importer = razor_importer_new();
-
- for (i = 0; i < count; i++) {
- if (import_rzr_file(importer, files[i]) < 0) {
- fprintf(stderr, "failed to import %s\n", files[i]);
- exit(-1);
- }
- }
-
- return razor_importer_finish(importer);
-}
-
/* Import a yum filelist as a razor package set. */
enum {