From bb7ba371839408a7da6a14624cb29201598f05b2 Mon Sep 17 00:00:00 2001 From: jbj Date: Tue, 15 Jun 2004 20:16:22 +0000 Subject: [PATCH] Generate header from xml parse. CVS patchset: 7339 CVS date: 2004/06/15 20:16:22 --- tools/Makefile.am | 5 +- tools/rpmtool.c | 36 ++++---- tools/rpmxml.c | 250 +++++++++++++++++++++++++++++++++++++++++++++++++++++- tools/rpmxp.h | 3 + 4 files changed, 273 insertions(+), 21 deletions(-) diff --git a/tools/Makefile.am b/tools/Makefile.am index dc029b2..2f19956 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -70,7 +70,8 @@ rpmtool_SOURCES = rpmtool.c rpmxp.c #rpmtool_LDFLAGS = $(staticLDFLAGS) rpmtool_LDADD = $(LDADD) -lxml2 -rpmxml_SOURCES = rpmxml.c rpmxp.c -rpmxml_LDADD = -lxml2 +rpmxml_SOURCES = rpmxml.c # rpmxp.c +#rpmxml_LDFLAGS = $(staticLDFLAGS) +rpmxml_LDADD = $(LDADD) -lxml2 $(PROGRAMS): $(LDADD) diff --git a/tools/rpmtool.c b/tools/rpmtool.c index 5149c89..90b3599 100644 --- a/tools/rpmtool.c +++ b/tools/rpmtool.c @@ -48,24 +48,24 @@ static const char * rpmaviNext(rpmavi avi) /*@observer@*/ /*@unchecked@*/ static const struct headerTagTableEntry_s rpmSTagTbl[] = { - { "RPMTAG_HEADERIMAGE", HEADER_IMAGE, }, - { "RPMTAG_HEADERSIGNATURES", HEADER_SIGNATURES, }, - { "RPMTAG_HEADERIMMUTABLE", HEADER_IMMUTABLE, }, - { "RPMTAG_HEADERREGIONS", HEADER_REGIONS, }, - { "RPMTAG_SIGSIZE", 999+1, }, - { "RPMTAG_SIGLEMD5_1", 999+2, }, - { "RPMTAG_SIGPGP", 999+3, }, - { "RPMTAG_SIGLEMD5_2", 999+4, }, - { "RPMTAG_SIGMD5", 999+5, }, - { "RPMTAG_SIGGPG", 999+6, }, - { "RPMTAG_SIGPGP5", 999+7, }, - { "RPMTAG_SIGPAYLOADSIZE", 999+8, }, - { "RPMTAG_BADSHA1_1", HEADER_SIGBASE+8, }, - { "RPMTAG_BADSHA1_2", HEADER_SIGBASE+9, }, - { "RPMTAG_PUBKEYS", HEADER_SIGBASE+10, }, - { "RPMTAG_DSAHEADER", HEADER_SIGBASE+11, }, - { "RPMTAG_RSAHEADER", HEADER_SIGBASE+12, }, - { "RPMTAG_SHA1HEADER", HEADER_SIGBASE+13, }, + { "RPMTAG_HEADERIMAGE", HEADER_IMAGE, RPM_BIN_TYPE }, + { "RPMTAG_HEADERSIGNATURES", HEADER_SIGNATURES, RPM_BIN_TYPE }, + { "RPMTAG_HEADERIMMUTABLE", HEADER_IMMUTABLE, RPM_BIN_TYPE }, + { "RPMTAG_HEADERREGIONS", HEADER_REGIONS, RPM_BIN_TYPE }, + { "RPMTAG_SIGSIZE", 999+1, RPM_INT32_TYPE }, + { "RPMTAG_SIGLEMD5_1", 999+2, RPM_BIN_TYPE }, + { "RPMTAG_SIGPGP", 999+3, RPM_BIN_TYPE }, + { "RPMTAG_SIGLEMD5_2", 999+4, RPM_BIN_TYPE }, + { "RPMTAG_SIGMD5", 999+5, RPM_BIN_TYPE }, + { "RPMTAG_SIGGPG", 999+6, RPM_BIN_TYPE }, + { "RPMTAG_SIGPGP5", 999+7, RPM_BIN_TYPE }, + { "RPMTAG_SIGPAYLOADSIZE", 999+8, RPM_INT32_TYPE }, + { "RPMTAG_BADSHA1_1", HEADER_SIGBASE+8, RPM_STRING_TYPE }, + { "RPMTAG_BADSHA1_2", HEADER_SIGBASE+9, RPM_STRING_TYPE }, + { "RPMTAG_PUBKEYS", HEADER_SIGBASE+10, RPM_STRING_ARRAY_TYPE }, + { "RPMTAG_DSAHEADER", HEADER_SIGBASE+11, RPM_BIN_TYPE }, + { "RPMTAG_RSAHEADER", HEADER_SIGBASE+12, RPM_BIN_TYPE }, + { "RPMTAG_SHA1HEADER", HEADER_SIGBASE+13, RPM_STRING_TYPE }, { NULL, 0 } }; diff --git a/tools/rpmxml.c b/tools/rpmxml.c index 8ef1109..9c16582 100644 --- a/tools/rpmxml.c +++ b/tools/rpmxml.c @@ -1,7 +1,255 @@ #include "system.h" -#include +#include +#define _RPMXP_INTERNAL +#include "rpmxp.h" #include "debug.h" +int _rpmxp_debug = 0; + +const char * rpmxpDTD = "\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +]>\n\ +"; + +rpmxp rpmxpFree(rpmxp xp) +{ + if (xp != NULL) { + if (xp->value) { + xmlFree(xp->value); + xp->value = NULL; + } + if (xp->name) { + xmlFree(xp->name); + xp->name = NULL; + } + if (xp->reader != NULL) { + xmlFreeTextReader(xp->reader); + xp->reader = NULL; + } + free(xp); + xp = NULL; + } + return xp; +} + +rpmxp rpmxpNew(const char * fn) +{ + rpmxp xp = calloc(1, sizeof(*xp)); + + if (xp == NULL) + return NULL; + if (fn) { + int xx; + xp->reader = xmlNewTextReaderFilename(fn); + if (xp->reader == NULL) + return rpmxpFree(xp); + xx = xmlTextReaderSetParserProp(xp->reader, XML_PARSER_VALIDATE, 1); + xx = xmlTextReaderSetParserProp(xp->reader, XML_PARSER_SUBST_ENTITIES, 1); + } + xp->name = NULL; + xp->value = NULL; + xp->depth = 0; + xp->nodeType = 0; + xp->isEmptyElement = 0; + xp->n = 2; + return xp; +} + +/** + * Return tag table entry from name lookup. + * @todo bsearch on sorted name table. + * @param tbl tag table + * @param name tag name to find + * @return tag value, 0 on not found + */ +static headerTagTableEntry myTagByName(headerTagTableEntry tbl, const char * name) +{ + int x = (strncmp(name, "RPMTAG_", (sizeof("RPMTAG_")-1)) + ? (sizeof("RPMTAG_")-1) : 0); + + for (; tbl->name != NULL; tbl++) { + if (!xstrcasecmp(tbl->name+x, name)) + return tbl; + } + return NULL; +} + +int rpmxpRead(rpmxp xp) +{ + return xmlTextReaderRead(xp->reader); +} + +int rpmxpProcess(rpmxp xp) +{ + int rc = 0; + + xp->name = xmlTextReaderName(xp->reader); + xp->value = xmlTextReaderValue(xp->reader); + xp->depth = xmlTextReaderDepth(xp->reader); + xp->nodeType = xmlTextReaderNodeType(xp->reader); + xp->isEmptyElement = xmlTextReaderIsEmptyElement(xp->reader); + + if (xp->name == NULL) + xp->name = xmlStrdup(BAD_CAST "--"); + +if (_rpmxp_debug) +printf("%d %d %s %d\n", xp->depth, xp->nodeType, xp->name, xp->isEmptyElement); + switch (xp->nodeType) { + case XML_READER_TYPE_ELEMENT: + printf("%*s<%s", (xp->n * xp->depth), "", xp->name); + while (xmlTextReaderMoveToNextAttribute(xp->reader) != 0) { + xmlChar * attrN = xmlTextReaderName(xp->reader); + xmlChar * attrV = xmlTextReaderValue(xp->reader); + printf(" %s", attrN); + if (attrV) { + printf("=\"%s\"", attrV); + if (!strcmp(xp->name, "rpmTag") && !strcmp(attrN, "name")) { + /* XXX rpmSTagTable gonna be needed. */ + xp->tte = myTagByName(rpmTagTable, attrV); + } + xmlFree(attrV); + } + xmlFree(attrN); + } + if (xp->isEmptyElement) { + printf("/>\n"); + if (xp->h && xp->tte) { + headerTagTableEntry tte = xp->tte; + if (!strcmp(xp->name, "string")) { + const char * nstr = ""; + (void) headerAddOrAppendEntry(xp->h, tte->val, tte->type, &nstr, 1); + } else + if (!strcmp(xp->name, "integer")) { + int i = 0; + (void) headerAddOrAppendEntry(xp->h, tte->val, tte->type, &i, 1); + } + } + } else { + printf(">"); + if (xp->depth < 2) + printf("\n"); + } + if (!strcmp(xp->name, "rpmHeader")) { + xp->h = headerNew(); + } + break; + case XML_READER_TYPE_END_ELEMENT: + if (xp->depth < 2) + printf("%*s", (xp->n * xp->depth), ""); + printf("\n", xp->name); + if (!strcmp(xp->name, "rpmHeader")) { + if (xp->h) { + FD_t fdo = Fopen("time.xmlhdr", "w.ufdio"); + if (fdo != NULL) { + headerWrite(fdo, xp->h, HEADER_MAGIC_YES); + Fclose(fdo); + } + } + xp->h = headerFree(xp->h); + } else + if (!strcmp(xp->name, "rpmTag")) { + xp->tte = NULL; + } + break; + case XML_READER_TYPE_TEXT: + printf("%s", xp->value); + if (xp->h && xp->tte) { + headerTagTableEntry tte = xp->tte; + switch (tte->type) { + case RPM_NULL_TYPE: + { + } break; + case RPM_CHAR_TYPE: + { char c = xp->value[0]; + (void) headerAddOrAppendEntry(xp->h, tte->val, tte->type, &c, 1); + } break; + case RPM_INT8_TYPE: + { int_8 i = strtol(xp->value, NULL, 0); + (void) headerAddOrAppendEntry(xp->h, tte->val, tte->type, &i, 1); + } break; + case RPM_INT16_TYPE: + { int_16 i = strtol(xp->value, NULL, 0); + (void) headerAddOrAppendEntry(xp->h, tte->val, tte->type, &i, 1); + } break; + case RPM_INT32_TYPE: + { int_32 i = strtol(xp->value, NULL, 0); + (void) headerAddOrAppendEntry(xp->h, tte->val, tte->type, &i, 1); + } break; + case RPM_STRING_TYPE: + { const char * s = xp->value; + (void) headerAddEntry(xp->h, tte->val, tte->type, s, 1); + } break; + case RPM_STRING_ARRAY_TYPE: + { const char * s = xp->value; + (void) headerAddOrAppendEntry(xp->h, tte->val, tte->type, &s, 1); + } break; + case RPM_I18NSTRING_TYPE: + { const char * s = xp->value; + (void) headerAddI18NString(xp->h, tte->val, s, "C"); + } break; + default: + break; + } + } + break; + case XML_READER_TYPE_DOCUMENT_TYPE: + break; + case XML_READER_TYPE_SIGNIFICANT_WHITESPACE: + break; + + case XML_READER_TYPE_NONE: + case XML_READER_TYPE_ATTRIBUTE: + case XML_READER_TYPE_CDATA: + case XML_READER_TYPE_ENTITY_REFERENCE: + case XML_READER_TYPE_ENTITY: + case XML_READER_TYPE_PROCESSING_INSTRUCTION: + case XML_READER_TYPE_COMMENT: + case XML_READER_TYPE_DOCUMENT: + case XML_READER_TYPE_DOCUMENT_FRAGMENT: + case XML_READER_TYPE_NOTATION: + case XML_READER_TYPE_WHITESPACE: + case XML_READER_TYPE_END_ENTITY: + case XML_READER_TYPE_XML_DECLARATION: + default: + printf("%d %d %s %d\n", xp->depth, xp->nodeType, + xp->name, xp->isEmptyElement); + if (xp->value) + printf(" %s", xp->value); + if (xp->depth < 2) + printf("\n"); + rc = -1; + break; + } + + + if (xp->value != NULL) { + xmlFree(xp->value); + xp->value = NULL; + } + if (xp->name != NULL) { + xmlFree(xp->name); + xp->name = NULL; + } + return rc; +} + +int rpmxpParseFile(rpmxp xp) +{ + int ret = -1; + + if (xp != NULL) + while ((ret = rpmxpRead(xp)) == 1) + rpmxpProcess(xp); + return ret; +} + int main(int argc, char ** argv) { const char * fn = "time.xml"; diff --git a/tools/rpmxp.h b/tools/rpmxp.h index ad72768..1102ebb 100644 --- a/tools/rpmxp.h +++ b/tools/rpmxp.h @@ -37,6 +37,9 @@ struct rpmxp_s { int nodeType; int isEmptyElement; + Header h; + headerTagTableEntry tte; + int n; }; #endif -- 2.7.4