CFLAGS = -O2 -Wall -Wpointer-arith -Wno-char-subscripts
INCDIR = -I. -I.. -I../build -I../lib -I../misc -I../popt -I../rpmdb -I../rpmio
RPMDIR = ..
-DESTDIR = /usr/local
+
+prefix = /usr
+DESTDIR =
XMLBUILD = rpmxmlbuild
XMLBUILD_SRC = rpmxmlbuild.c
LIBS = $(XMLLIB) $(RPMDIR)/build/.libs/librpmbuild.a \
$(RPMDIR)/lib/.libs/librpm.a $(RPMDIR)/rpmdb/.libs/librpmdb.a \
$(RPMDIR)/rpmio/.libs/librpmio.a $(RPMDIR)/popt/.libs/libpopt.a \
+ $(RPMDIR)/libelf/lib/.libs/libelf.a \
-lz -lexpat -lbz2
LIBDIR = -L. -L$(RPMDIR)/.libs -L/usr/lib
$(STRIP) $(XMLBUILD)
install:
- @(cp $(XMLBUILD) $(DESTDIR)/bin)
- @(cp $(XMLLIB) $(DESTDIR)/lib)
- @(cp $(XMLLIB_H) $(DESTDIR)/include)
+ @(install -m 755 $(XMLBUILD) $(DESTDIR)$(prefix)/bin)
+ @(install -m 644 $(XMLLIB) $(DESTDIR)$(prefix)/lib)
+ @(install -m 644 $(XMLLIB_H) $(DESTDIR)$(prefix)/include/rpm)
$(XMLLIB): $(XMLLIB_OBJ)
$(AR) $(ARFLAGS) $(XMLLIB) $(XMLLIB_OBJ)
#include "xml2rpm.h"
#include "xmlstruct.h"
+#ifdef XML_DEBUG
+#include "header_internal.h"
+#endif
+
// This is where our packaged scripts start (or the largest number
// of the sources)
int g_nMaxSourceNum = 511;
createRPMSource(pScript->m_szScript, g_nMaxSourceNum+1,
pSpec, RPMBUILD_ISSOURCE);
}
- if (pScript->m_szEntry)
- appendLineStringBuf(pSb, pScript->m_szEntry);
+ if (pScript->m_szEntry) {
+ // we do a newStrEx to make sure we expand all
+ // macros, as is done in the case of the files
+ // (done as part of the fileToStr call)
+ newStrEx(pScript->m_szEntry, (char**)(&szTmp));
+ appendLineStringBuf(pSb, szTmp);
+ freeStr(&(szTmp));
+ }
pScript = pScript->m_pNext;
}
}
pScripts->m_szInterpreter, 1);
}
+void handleProvObsConf(Header pHeader, t_structXMLRequire* pReqs, rpmsenseFlags fSense)
+{
+ t_structXMLRequire* pReq = NULL;
+ int nFlags = 0;
+ int i = 0;
+ int nIndex = 0;
+
+ pReq = pReqs;
+ while (pReq) {
+ if (pReq->m_szName) {
+ nFlags = 0;
+ if (pReq->m_szCompare && pReq->m_szVersion) {
+ for (i = 0; sReqComp[i].m_szCmp; i++) {
+ if (!strcasecmp(sReqComp[i].m_szCmp,
+ pReq->m_szCompare)) {
+ nFlags = (sReqComp[i].m_rpmCmp | RPMSENSE_ANY) & ~RPMSENSE_SENSEMASK;
+ }
+ }
+ }
+ addReqProv(NULL, pHeader, fSense | nFlags,
+ pReq->m_szName, pReq->m_szVersion, nIndex++);
+ }
+ pReq = pReq->m_pNext;
+ }
+}
+
void convertXMLPackage(const t_structXMLPackage* pXMLPkg,
const t_structXMLSpec* pXMLSpec,
Spec pSpec)
_free(szArch);
_free(szOs);
+ // do the provides, obsoletes, conflicts
+ handleProvObsConf(pPkg->header, pXMLPkg->m_pProvides, RPMSENSE_PROVIDES);
+ handleProvObsConf(pPkg->header, pXMLPkg->m_pObsoletes, RPMSENSE_OBSOLETES);
+ handleProvObsConf(pPkg->header, pXMLPkg->m_pConflicts, RPMSENSE_CONFLICTS);
+
if (pXMLPkg->m_szName)
headerAddOrAppendEntry(pPkg->header, RPMTAG_NAME,
RPM_STRING_TYPE, pXMLPkg->m_szName, 1);
pSpec->build = scriptsToStringBuf(pXMLSpec->m_pBuild, pSpec);
pSpec->install = scriptsToStringBuf(pXMLSpec->m_pInstall, pSpec);
pSpec->clean = scriptsToStringBuf(pXMLSpec->m_pClean, pSpec);
-
+
convertXMLPackage(pXMLSpec->m_pPackages, pXMLSpec, pSpec);
initSourceHeader(pSpec);
addXMLMacro(pParse->m_pAttrs, &(pSpec->m_pMacros));
break;
case TAGVAL_SOURCE:
- addXMLSource(pParse->m_pAttrs, &(pSpec->m_pSources));
+ if (pSpec->m_pSources)
+ addXMLSource(pParse->m_pAttrs, &(pSpec->m_pSources));
+ else {
+ if ((addXMLSource(pParse->m_pAttrs, &(pSpec->m_pSources))) &&
+ (pSpec->m_pSources->m_szDirectory)) {
+ newStr(pSpec->m_pSources->m_szDirectory,
+ (char**)&(pSpec->m_szBuildSubdir));
+ }
+ }
break;
case TAGVAL_PATCH:
addXMLSource(pParse->m_pAttrs, &(pSpec->m_pPatches));
appendStringBuf(pSb, szTmp);
appendStringBuf(pSb, pSource->m_szName);
}
+ else if (!strcasecmp(szTmp, "tgz")) {
+ szTmp = NULL;
+ newStrEx("%{_gzipbin} -dc ", &szTmp);
+ appendStringBuf(pSb, szTmp);
+ appendStringBuf(pSb, pSource->m_szName);
+ }
else if (!strcasecmp(szTmp, "zip")) {
szTmp = NULL;
newStrEx("%{_unzipbin} ", &szTmp);
appendStringBuf(pSb, pSource->m_szName);
}
freeStr(&szTmp);
- szTmp = malloc(strlen(" > patch -p1234567890 -s ")+strlen(pSource->m_szName)+1);
- sprintf(szTmp, " | patch -p%d -s", nLevel);
+ szTmp = malloc(strlen(" > patch -pN1234567890 -s ")+strlen(pSource->m_szName)+1);
+ sprintf(szTmp, " | patch -Np%d -s", nLevel);
appendStringBuf(pSb, szTmp);
appendLineStringBuf(pSb, "");
appendLineStringBuf(pSb, "STATUS=$?");
case TAGVAL_SUMMARY:
case TAGVAL_DESCRIPTION:
case TAGVAL_REQUIRES:
+ case TAGVAL_PROVIDES:
+ case TAGVAL_OBSOLETES:
+ case TAGVAL_CONFLICTS:
// we don't need to do anything
break;
default:
pPkg = getLastXMLPackage(pSpec->m_pPackages);
addXMLRequire(pParse->m_pAttrs, &(pPkg->m_pRequires));
break;
+ case TAGVAL_PROVIDE:
+ pPkg = getLastXMLPackage(pSpec->m_pPackages);
+ addXMLRequire(pParse->m_pAttrs, &(pPkg->m_pProvides));
+ break;
+ case TAGVAL_OBSOLETE:
+ pPkg = getLastXMLPackage(pSpec->m_pPackages);
+ addXMLRequire(pParse->m_pAttrs, &(pPkg->m_pObsoletes));
+ break;
+ case TAGVAL_CONFLICT:
+ pPkg = getLastXMLPackage(pSpec->m_pPackages);
+ addXMLRequire(pParse->m_pAttrs, &(pPkg->m_pConflicts));
+ break;
case TAGVAL_CHANGE:
pChanges = getLastXMLChanges(pSpec->m_pChangelog);
addXMLChange(pParse->m_pAttrs, &(pChanges->m_pChanges));
int nLen)
{
t_structXMLParse* pParse = NULL;
+ char* szVal = NULL;
char* szTmp = NULL;
- char* szTmpValue = NULL;
- char* szPos = NULL;
if ((pParse = (t_structXMLParse*)pData)) {
- szTmp = malloc(nLen+2);
- szTmp[nLen] = '\0';
- snprintf(szTmp, nLen+1, "%s", szValue);
- szPos = szTmp;
- while ((*szPos == ' ') ||
- (*szPos == '\t') ||
- (*szPos == '\r') ||
- (*szPos == '\n'))
- szPos++;
-
- if (strlen(szPos)) {
+ szVal = malloc(nLen+2);
+ szVal[nLen] = '\0';
+ snprintf(szVal, nLen+1, "%s", szValue);
+ if (strlen(szVal)) {
+ while ((szTmp = strchr(szVal, '\t')))
+ *szTmp = ' ';
if (pParse->m_szValue) {
- szTmpValue = malloc(strlen(szPos)+strlen(pParse->m_szValue)+1);
- sprintf(szTmpValue, "%s%s", pParse->m_szValue, szPos);
- newStr(szTmpValue, &(pParse->m_szValue));
- free(szTmpValue);
+ szTmp = malloc(strlen(szVal)+strlen(pParse->m_szValue)+1);
+ sprintf(szTmp, "%s%s", pParse->m_szValue, szVal);
+ newStr(szTmp, &(pParse->m_szValue));
+ free(szTmp);
}
else
- newStr(szPos, &(pParse->m_szValue));
+ newStr(szVal, &(pParse->m_szValue));
}
- free(szTmp);
+ free(szVal);
}
}
{
while (pAttr && (strcasecmp(szName, pAttr->m_szName) != 0))
pAttr = pAttr->m_pNext;
-
+
return pAttr;
}
attrSetInt(pAttr, "size", &(pSource->m_nSize));
attrSetStr(pAttr, "md5", &(pSource->m_szMD5));
attrSetStr(pAttr, "directory", &(pSource->m_szDirectory));
- attrSetInt(pAttr, "number", &(pSource->m_nNum));
+ attrSetInt(pAttr, "id", &(pSource->m_nNum));
} while ((pAttr = pAttr->m_pNext));
}
if ((pScript = malloc(sizeof(t_structXMLScript)))) {
pScript->m_szInterpreter = NULL;
+ pScript->m_szArch = NULL;
+ pScript->m_szOS = NULL;
pScript->m_szScript = NULL;
pScript->m_szEntry = NULL;
pScript->m_pNext = NULL;
do {
attrSetStr(pAttr, "interpreter",
&(pScript->m_szInterpreter));
+ attrSetStr(pAttr, "arch",
+ &(pScript->m_szArch));
+ attrSetStr(pAttr, "os",
+ &(pScript->m_szOS));
attrSetStr(pAttr, "script",
&(pScript->m_szScript));
} while ((pAttr = pAttr->m_pNext));
{
if (*ppScript) {
freeStr(&((*ppScript)->m_szInterpreter));
+ freeStr(&((*ppScript)->m_szArch));
+ freeStr(&((*ppScript)->m_szOS));
freeStr(&((*ppScript)->m_szScript));
freeStr(&((*ppScript)->m_szEntry));
freeXMLScript(&((*ppScript)->m_pNext));
return 0;
}
+t_structI18NStr* newI18NStr(const t_structXMLAttr* pAttrs)
+{
+ t_structI18NStr* pStr = NULL;
+ t_structXMLAttr* pAttr = NULL;
+
+ if ((pStr = malloc(sizeof(t_structI18NStr)))) {
+ pStr->m_szLang = NULL;
+ pStr->m_szText = NULL;
+ pStr->m_pNext = NULL;
+
+ pAttr = (t_structXMLAttr*)pAttrs;
+ do {
+ attrSetStr(pAttr, "lang", &(pStr->m_szLang));
+ } while ((pAttr = pAttr->m_pNext));
+ }
+
+ return pStr;
+}
+
+int freeI18NStr(t_structI18NStr** ppStr)
+{
+ if (*ppStr) {
+ freeStr(&((*ppStr)->m_szLang));
+ freeStr(&((*ppStr)->m_szText));
+ freeI18NStr(&((*ppStr)->m_pNext));
+ free(*ppStr);
+ }
+ *ppStr = NULL;
+
+ return 0;
+}
+
+t_structI18NStr* addI18NStr(const t_structXMLAttr* pAttrs,
+ t_structI18NStr** ppStr)
+{
+ t_structI18NStr* pStr = NULL;
+
+ if ((pStr = getLastI18NStr(*ppStr)))
+ pStr = (pStr->m_pNext = newI18NStr(pAttrs));
+ else
+ pStr = (*ppStr = newI18NStr(pAttrs));
+
+ return pStr;
+}
+
+t_structI18NStr* getLastI18NStr(t_structI18NStr* pStr)
+{
+ while (pStr && (pStr->m_pNext))
+ pStr = pStr->m_pNext;
+
+ return pStr;
+}
+
t_structXMLPackage* newXMLPackage(const t_structXMLAttr* pAttrs)
{
t_structXMLPackage* pPackage = NULL;
if ((pPackage = malloc(sizeof(t_structXMLPackage)))) {
pPackage->m_szName = NULL;
+ pPackage->m_szVersion = NULL;
pPackage->m_szGroup = NULL;
pPackage->m_szSummary = NULL;
pPackage->m_szDescription = NULL;
pPackage->m_pRequires = NULL;
pPackage->m_pSuggests = NULL;
pPackage->m_pObsoletes = NULL;
+ pPackage->m_pConflicts = NULL;
pPackage->m_pProvides = NULL;
pPackage->m_pNext = NULL;
pAttr = (t_structXMLAttr*)pAttrs;
do {
attrSetStr(pAttr, "name", &(pPackage->m_szName));
+ attrSetStr(pAttr, "version", &(pPackage->m_szVersion));
attrSetStr(pAttr, "group", &(pPackage->m_szGroup));
attrSetBool(pAttr, "autorequire", &(pPackage->m_nAutoRequire));
+ attrSetBool(pAttr, "autoreq", &(pPackage->m_nAutoRequire));
attrSetBool(pAttr, "autoprovide", &(pPackage->m_nAutoProvide));
+ attrSetBool(pAttr, "autoprov", &(pPackage->m_nAutoProvide));
+ attrSetBool(pAttr, "autoreqprov", &(pPackage->m_nAutoProvide));
+ attrSetBool(pAttr, "autoreqprov", &(pPackage->m_nAutoRequire));
attrSetBool(pAttr, "autosuggest", &(pPackage->m_nAutoSuggest));
} while ((pAttr = pAttr->m_pNext));
}
{
if (*ppPackage) {
freeStr(&((*ppPackage)->m_szName));
+ freeStr(&((*ppPackage)->m_szVersion));
freeStr(&((*ppPackage)->m_szGroup));
freeStr(&((*ppPackage)->m_szSummary));
freeStr(&((*ppPackage)->m_szDescription));
freeXMLRequire(&((*ppPackage)->m_pRequires));
freeXMLRequire(&((*ppPackage)->m_pSuggests));
freeXMLRequire(&((*ppPackage)->m_pObsoletes));
+ freeXMLRequire(&((*ppPackage)->m_pConflicts));
freeXMLRequire(&((*ppPackage)->m_pProvides));
freeXMLPackage(&((*ppPackage)->m_pNext));
free(*ppPackage);
typedef struct structXMLScript
{
char* m_szInterpreter;
+ char* m_szArch;
+ char* m_szOS;
char* m_szScript;
char* m_szEntry;
struct structXMLScript* m_pNext;
char* m_szGID;
} t_structXMLFiles;
+typedef struct structI18NStr
+{
+ char* m_szLang;
+ char* m_szText;
+ struct structI18NStr* m_pNext;
+} t_structI18NStr;
+
typedef struct structXMLPackage
{
char* m_szName;
+ char* m_szVersion;
char* m_szGroup;
char* m_szSummary;
char* m_szDescription;
struct structXMLRequire* m_pRequires;
struct structXMLRequire* m_pSuggests;
struct structXMLRequire* m_pObsoletes;
+ struct structXMLRequire* m_pConflicts;
struct structXMLRequire* m_pProvides;
struct structXMLPackage* m_pNext;
} t_structXMLPackage;
t_structXMLFiles* newXMLFiles(const t_structXMLAttr* pAttrs);
int freeXMLFiles(t_structXMLFiles** ppFiles);
+t_structI18NStr* newI18NStr(const t_structXMLAttr* pAttrs);
+int freeI18NStr(t_structI18NStr** ppStr);
+t_structI18NStr* addI18NStr(const t_structXMLAttr* pAttrs,
+ t_structI18NStr** ppStr);
+t_structI18NStr* getLastI18NStr(t_structI18NStr* pStr);
+
t_structXMLPackage* newXMLPackage(const t_structXMLAttr* pAttrs);
int freeXMLPackage(t_structXMLPackage** ppPackage);
t_structXMLPackage* addXMLPackage(const t_structXMLAttr* pAttrs,
{"size", ATTRTYPE_NUMERIC, 0},
{"md5", ATTRTYPE_MD5, 0},
{"path", ATTRTYPE_ANY, 0},
- {"number", ATTRTYPE_NUMERIC, 0},
+ {"id", ATTRTYPE_NUMERIC, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
{"size", ATTRTYPE_NUMERIC, 0},
{"md5", ATTRTYPE_MD5, 0},
{"path", ATTRTYPE_ANY, 0},
- {"number", ATTRTYPE_NUMERIC, 0},
+ {"id", ATTRTYPE_NUMERIC, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
},
{
{"name", ATTRTYPE_ANY, 0},
+ {"version", ATTRTYPE_ANY, 0},
{"group", ATTRTYPE_ANY, 1},
{"autoreqprov", ATTRTYPE_BOOL, 0},
{"autoprov", ATTRTYPE_BOOL, 0},
},
{
{"name", ATTRTYPE_ANY, 1},
+ {"version", ATTRTYPE_ANY, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
},
{
{"name", ATTRTYPE_ANY, 1},
+ {"version", ATTRTYPE_ANY, 0},
+ {"cmp", ATTRTYPE_CMP, 0},
+ {NULL, ATTRTYPE_ANY, 1}
+ }
+ },
+ {
+ "conflicts", TAGVAL_CONFLICTS, 2,
+ {
+ TAGVAL_SPEC,
+ TAGVAL_PACKAGE,
+ TAGVAL_LAST
+ },
+ {
+ {NULL, ATTRTYPE_ANY, 1}
+ }
+ },
+ {
+ "conflict", TAGVAL_CONFLICT, 3,
+ {
+ TAGVAL_SPEC,
+ TAGVAL_PACKAGE,
+ TAGVAL_CONFLICTS,
+ TAGVAL_LAST
+ },
+ {
+ {"name", ATTRTYPE_ANY, 1},
+ {"version", ATTRTYPE_ANY, 0},
+ {"cmp", ATTRTYPE_CMP, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
TAGVAL_LAST
},
{
+ {"lang", ATTRTYPE_ANY, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
TAGVAL_LAST
},
{
+ {"lang", ATTRTYPE_ANY, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
},
{
{"interpreter", ATTRTYPE_ANY, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"script", ATTRTYPE_SCRIPT, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
{
{"interpreter", ATTRTYPE_ANY, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"script", ATTRTYPE_SCRIPT, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
{
{"interpreter", ATTRTYPE_ANY, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"script", ATTRTYPE_SCRIPT, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
{
{"interpreter", ATTRTYPE_ANY, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"script", ATTRTYPE_SCRIPT, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
- {"verify", TAGVAL_VERIFY, 2,
+ {
+ "verify", TAGVAL_VERIFY, 2,
{
TAGVAL_SPEC,
TAGVAL_PACKAGE,
},
{
{"interpreter", ATTRTYPE_ANY, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"script", ATTRTYPE_SCRIPT, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
{
{"interpreter", ATTRTYPE_ANY, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"script", ATTRTYPE_SCRIPT, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
{
{"source", ATTRTYPE_NUMERIC, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"path", ATTRTYPE_ANY, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
{
{"patch", ATTRTYPE_NUMERIC, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"level", ATTRTYPE_NUMERIC, 0},
{"path", ATTRTYPE_ANY, 0},
{NULL, ATTRTYPE_ANY, 1}
},
{
{"interpreter", ATTRTYPE_ANY, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"script", ATTRTYPE_SCRIPT, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
{
{"interpreter", ATTRTYPE_ANY, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"script", ATTRTYPE_SCRIPT, 0},
{NULL, ATTRTYPE_ANY, 1}
}
},
{
{"interpreter", ATTRTYPE_ANY, 0},
+ {"arch", ATTRTYPE_ANY, 0},
+ {"os", ATTRTYPE_ANY, 0},
{"script", ATTRTYPE_SCRIPT, 0},
{NULL, ATTRTYPE_ANY, 1}
}
TAGVAL_REQUIRE,
TAGVAL_OBSOLETES,
TAGVAL_OBSOLETE,
+ TAGVAL_CONFLICTS,
+ TAGVAL_CONFLICT,
TAGVAL_SUGGESTS,
TAGVAL_SUGGEST,
TAGVAL_SUMMARY,