rpm/xmlspec/xml2rpm.c

583 lines
20 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stringbuf.h"
#include "rpmbuild.h"
#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;
static struct ReqComp {
const char* m_szCmp;
rpmsenseFlags m_rpmCmp;
} sReqComp[] = {
{"le", RPMSENSE_LESS | RPMSENSE_EQUAL },
{"lt", RPMSENSE_LESS },
{"eq", RPMSENSE_EQUAL },
{"ge", RPMSENSE_GREATER | RPMSENSE_EQUAL},
{"gt", RPMSENSE_GREATER },
{NULL, 0 }
};
Spec g_pSpec = NULL;
const char* g_szDefLang = "C";
#ifdef XML_DEBUG
void printSourceInfo(struct Source* pSource)
{
if (pSource) {
printf("D: Source (%08x){\n", (unsigned int)pSource);
printf("D: Source->fullSource (%08x): {%s}\n", (unsigned int)(pSource->fullSource), pSource->fullSource);
printf("D: Source->source (%08x): {%s}\n", (unsigned int)(pSource->source), pSource->source);
printf("D: Source->flags : {%08x}\n", pSource->flags);
printf("D: Source->num : {%d}\n", pSource->num);
printf("D: }\n");
}
}
#endif
#ifdef XML_DEBUG
void printHeaderInfo(Header pHeader)
{
int i = 0;
int j = 0;
int nVal = 0;
indexEntry pIdx;
const struct headerTagTableEntry_s* pEntry;
char* pData;
int nCnt;
char szType[20];
if (pHeader) {
printf("D: Header->indexUsed : {%d}\n", pHeader->indexUsed);
printf("D: Header->indexAlloced : {%d}\n", pHeader->indexAlloced);
printf("D: Header->flags : {%d}\n", pHeader->flags);
printf("D: Header->nrefs : {%d}\n", pHeader->nrefs);
printf("D: Header->hv {\n");
printf("D: HV.hdrvecs : {%08x}\n", (unsigned int)(pHeader->hv.hdrvecs));
printf("D: HV.hdrdata : {%08x}\n", (unsigned int)(pHeader->hv.hdrdata));
printf("D: HV.hdrversion : {%d}\n", pHeader->hv.hdrversion);
printf("D: }\n");
printf("D: Header->blob (%08x): {\n", (unsigned int)(pHeader->blob));
pIdx = pHeader->index;
for (i = 0; i < pHeader->indexUsed; i++, pIdx++) {
pEntry = rpmTagTable;
while (pEntry->name && pEntry->val != pIdx->info.tag)
pEntry++;
nCnt = pIdx->info.count;
pData = pIdx->data;
switch (pIdx->info.type) {
case RPM_STRING_TYPE: sprintf(szType, "STRING"); break;
case RPM_STRING_ARRAY_TYPE: sprintf(szType, "STRING_ARRAY"); break;
case RPM_I18NSTRING_TYPE: sprintf(szType, "STRING_I18N"); break;
case RPM_CHAR_TYPE: sprintf(szType, "CHAR"); break;
case RPM_INT8_TYPE: sprintf(szType, "INT8"); break;
case RPM_INT16_TYPE: sprintf(szType, "INT16"); break;
case RPM_INT32_TYPE: sprintf(szType, "INT32"); break;
default: sprintf(szType, "OTHER"); break;
}
printf("D: %02d %s(%02d) %s\n", i, pEntry->name, nCnt, szType);
switch (pIdx->info.type) {
case RPM_STRING_TYPE:
case RPM_STRING_ARRAY_TYPE:
case RPM_I18NSTRING_TYPE:
for (j = 0; j < nCnt; j++) {
if (strlen(pData))
printf("D: %02d {%s}\n", j, pData);
pData = strchr(pData, 0);
pData++;
}
break;
case RPM_CHAR_TYPE:
case RPM_INT8_TYPE:
case RPM_INT16_TYPE:
case RPM_INT32_TYPE:
for (j = 0; j < nCnt; j++) {
switch (pIdx->info.type) {
case RPM_CHAR_TYPE:
case RPM_INT8_TYPE:
nVal = *(((int_8*)pData)+j);
break;
case RPM_INT16_TYPE:
nVal = *(((uint_16*)pData)+j);
break;
case RPM_INT32_TYPE:
default:
nVal = *(((int_32*)pData)+j);
break;
}
printf("D: %02d {%08x}\n", j, nVal);
}
break;
default:
break;
}
}
printf("D: }\n");
}
}
#endif
#ifdef XML_DEBUG
void printMacroInfo(MacroContext pMacro)
{
int i = 0;
MacroEntry pEntry = NULL;
if (pMacro) {
for (i = 0; i < pMacro->firstFree; i++) {
if ((pEntry = pMacro->macroTable[i]) &&
(pEntry->level >= RMIL_SPEC)) {
printf("D: %03d % 3d %s", i, pEntry->level,
pEntry->name);
if ((pEntry->opts) &&
(*pEntry->opts))
printf("(%s)", pEntry->opts);
printf("\n");
if ((pEntry->level >= RMIL_SPEC) &&
(pEntry->body) &&
(*pEntry->body))
printf("D: {%s}\n", pEntry->body);
}
}
}
}
#endif
#ifdef XML_DEBUG
void printSpecInfo(Spec pSpec)
{
struct Source* pSource = NULL;
struct PackageStruct* pPackage = NULL;
printf("D: Spec(%08x) {\n", (unsigned int)pSpec);
if (pSpec) {
printf("D: Spec->specfile (%08x): {%s}\n", (unsigned int)(pSpec->specFile), pSpec->specFile);
printf("D: Spec->sourceRpmName (%08x): {%s}\n", (unsigned int)(pSpec->sourceRpmName), pSpec->sourceRpmName);
printf("D: Spec->buildRootURL (%08x): {%s}\n", (unsigned int)(pSpec->buildRootURL), pSpec->buildRootURL);
printf("D: Spec->buildSubdir (%08x): {%s}\n", (unsigned int)(pSpec->buildSubdir), pSpec->buildSubdir);
printf("D: Spec->rootURL (%08x): {%s}\n", (unsigned int)(pSpec->rootURL), pSpec->rootURL);
printf("D: Spec->BACount : {%d}\n", pSpec->BACount);
printf("D: Spec->recursing : {%d}\n", pSpec->recursing);
printf("D: Spec->force : {%d}\n", pSpec->force);
printf("D: Spec->anyarch : {%d}\n", pSpec->anyarch);
printf("D: Spec->gotBuildRootURL : {%d}\n", pSpec->gotBuildRootURL);
printf("D: Spec->timeCheck : {%d}\n", pSpec->timeCheck);
printf("D: Spec->passPhrase (%08x): {%s}\n", (unsigned int)(pSpec->passPhrase), pSpec->passPhrase);
printf("D: Spec->cookie (%08x): {%s}\n", (unsigned int)(pSpec->cookie), pSpec->cookie);
printf("D: Spec->numSources : {%d}\n", pSpec->numSources);
printf("D: Spec->noSource : {%d}\n", pSpec->noSource);
printf("D: Spec->sources : (%08x)\n", (unsigned int)(pSpec->sources));
pSource = pSpec->sources;
while (pSource) {
printSourceInfo(pSource);
pSource = pSource->next;
}
printf("D: Spec->buildRestrictions (%08x){\n", (unsigned int)(pSpec->buildRestrictions));
printHeaderInfo(pSpec->buildRestrictions);
printf("D: }\n");
printf("D: Spec->sourceHeader (%08x){\n", (unsigned int)(pSpec->sourceHeader));
printHeaderInfo(pSpec->sourceHeader);
printf("D: }\n");
printf("D: Spec->packages : {%08x}\n", (unsigned int)(pSpec->packages));
pPackage = pSpec->packages;
while (pPackage) {
printf("D: Package(%08x) {\n", (unsigned int)pPackage);
printf("D: Package->cpioList : {%08x}\n", (unsigned int)(pPackage->cpioList));
printf("D: Package->icon : {%08x}\n", (unsigned int)(pPackage->icon));
printf("D: Package->autoReq : {%d}\n", pPackage->autoReq);
printf("D: Package->autoProv : {%d}\n", pPackage->autoProv);
printf("D: Package->preInFile (%08x): {%s}\n", (unsigned int)(pPackage->preInFile), pPackage->preInFile);
printf("D: Package->postInFile (%08x): {%s}\n", (unsigned int)(pPackage->postInFile), pPackage->postInFile);
printf("D: Package->preUnFile (%08x): {%s}\n", (unsigned int)(pPackage->preUnFile), pPackage->preUnFile);
printf("D: Package->postUnFile (%08x): {%s}\n", (unsigned int)(pPackage->postUnFile), pPackage->postUnFile);
printf("D: Package->triggerFiles : {%08x}\n", (unsigned int)(pPackage->triggerFiles));
printf("D: Package->fileFile (%08x): {%s}\n", (unsigned int)(pPackage->fileFile), pPackage->fileFile);
printf("D: Package->fileFile (%08x): {%s}\n", (unsigned int)(pPackage->fileList), pPackage->fileList ? getStringBuf(pPackage->fileList) : NULL);
printf("D: Package->header (%08x){\n", (unsigned int)(pPackage->header));
printHeaderInfo(pPackage->header);
printf("D: }\n");
pPackage = pPackage->next;
printf("D: }\n");
}
printf("D: Spec->macros (%08x){\n", (unsigned int)(pSpec->macros));
printMacroInfo(pSpec->macros);
printf("D: }\n");
printf("D: Spec->prep (%08x): {%s}\n", (unsigned int)(pSpec->prep), pSpec->prep ? getStringBuf(pSpec->prep) : NULL);
printf("D: Spec->build (%08x): {%s}\n", (unsigned int)(pSpec->build), pSpec->build ? getStringBuf(pSpec->build) : NULL);
printf("D: Spec->install (%08x): {%s}\n", (unsigned int)(pSpec->install), pSpec->install ? getStringBuf(pSpec->install) : NULL);
printf("D: Spec->clean (%08x): {%s}\n", (unsigned int)(pSpec->clean), pSpec->clean ? getStringBuf(pSpec->clean) : NULL);
}
printf("D: }\n");
}
#endif
void createRPMSource(const char* szName, int nNum,
Spec pSpec, int nType)
{
struct Source* pSrc = NULL;
struct Source* pPrev = NULL;
char szTmpName[20];
char szPre[3];
char szType[7];
if (!szName || !pSpec)
return;
if ((nType & RPMBUILD_ISNO) == RPMBUILD_ISNO) {
pSpec->noSource++;
sprintf(szPre, "NO");
}
else {
pSpec->numSources++;
szPre[0] = '\0';
}
pSrc = malloc(sizeof(struct Source));
pSrc->fullSource = NULL;
newStrEx(szName, &(pSrc->fullSource));
if (!(pSrc->source = strrchr(pSrc->fullSource, '/')))
pSrc->source = pSrc->fullSource;
else
pSrc->source++;
pSrc->num = nNum;
pSrc->flags = nType;
pSrc->next = NULL;
if ((pPrev = pSpec->sources)) {
while (pPrev->next)
pPrev = pPrev->next;
pPrev->next = pSrc;
}
else
pSpec->sources = pSrc;
if ((nType & RPMBUILD_ISSOURCE) == RPMBUILD_ISSOURCE)
sprintf(szType, "SOURCE");
else
sprintf(szType, "PATCH");
sprintf(szTmpName, "%s%s%d", szPre, szType, nNum);
addMacro(pSpec->macros, szTmpName, NULL, pSrc->fullSource, RMIL_SPEC);
sprintf(szTmpName, "%s%sURL%d", szPre, szType, nNum);
addMacro(pSpec->macros, szTmpName, NULL, pSrc->source, RMIL_SPEC);
if (nNum > g_nMaxSourceNum)
g_nMaxSourceNum = nNum;
}
void convertXMLSource(const t_structXMLSource* pXMLSrc,
Spec pSpec, int nType)
{
if (!pXMLSrc || !pSpec)
return;
createRPMSource(pXMLSrc->m_szName, pXMLSrc->m_nNum, pSpec, nType);
convertXMLSource(pXMLSrc->m_pNext, pSpec, nType);
}
StringBuf scriptsToStringBuf(const t_structXMLScripts* pScripts,
Spec pSpec)
{
StringBuf pSb = NULL;
t_structXMLScript* pScript = NULL;
char* szTmp = NULL;
if (pScripts) {
pSb = newStringBuf();
if ((pScripts->m_szScript) &&
(szTmp = fileToStr(pScripts->m_szScript, NULL))) {
appendLineStringBuf(pSb, szTmp);
freeStr(&(szTmp));
createRPMSource(pScripts->m_szScript, g_nMaxSourceNum+1,
pSpec, RPMBUILD_ISSOURCE);
}
pScript = pScripts->m_pScripts;
while (pScript) {
if ((pScript->m_szScript) &&
(szTmp = fileToStr(pScript->m_szScript, NULL))) {
appendLineStringBuf(pSb, szTmp);
freeStr(&(szTmp));
createRPMSource(pScript->m_szScript, g_nMaxSourceNum+1,
pSpec, RPMBUILD_ISSOURCE);
}
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;
}
}
return pSb;
}
void convertXMLScripts(const t_structXMLScripts* pScripts,
struct PackageStruct* pPkg,
Spec pSpec,
int nScript, int nInterpreter)
{
StringBuf pSb = NULL;
if (!pScripts || !pPkg)
return;
if ((pSb = scriptsToStringBuf(pScripts, pSpec))) {
headerAddEntry(pPkg->header,
nScript, RPM_STRING_TYPE,
getStringBuf(pSb), 1);
freeStringBuf(pSb);
}
if (pScripts->m_szInterpreter)
headerAddEntry(pPkg->header,
nInterpreter, RPM_STRING_TYPE,
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)
{
struct PackageStruct* pPkg = NULL;
char* szPlatform = NULL;
char* szArch = NULL;
char* szOs = NULL;
char* szTmp = NULL;
if (!pXMLPkg || !pSpec)
return;
pPkg = newPackage(pSpec);
pPkg->autoReq = pXMLPkg->m_nAutoRequire;
pPkg->autoProv = pXMLPkg->m_nAutoProvide;
pPkg->header = headerNew();
szPlatform = rpmExpand("%{_target_platform}", NULL);
szArch = rpmExpand("%{_target_cpu}", NULL);
szOs = rpmExpand("%{_target_os}", NULL);
headerAddOrAppendEntry(pPkg->header, RPMTAG_OS, RPM_STRING_TYPE, szOs, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_ARCH, RPM_STRING_TYPE, szArch, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_RHNPLATFORM, RPM_STRING_TYPE, szArch, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_PLATFORM, RPM_STRING_TYPE, szPlatform, 1);
_free(szPlatform);
_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);
else
headerAddOrAppendEntry(pPkg->header, RPMTAG_NAME,
RPM_STRING_TYPE, pXMLSpec->m_szName, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_VERSION,
RPM_STRING_TYPE, pXMLSpec->m_szVersion, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_RELEASE,
RPM_STRING_TYPE, pXMLSpec->m_szRelease, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_GROUP,
RPM_STRING_TYPE, pXMLPkg->m_szGroup, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_RELEASE,
RPM_STRING_TYPE, pXMLSpec->m_szRelease, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_LICENSE,
RPM_STRING_TYPE, pXMLSpec->m_szCopyright, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_URL,
RPM_STRING_TYPE, pXMLSpec->m_szURL, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_DISTRIBUTION,
RPM_STRING_TYPE, pXMLSpec->m_szDistribution, 1);
headerAddOrAppendEntry(pPkg->header, RPMTAG_VENDOR,
RPM_STRING_TYPE, pXMLSpec->m_szVendor, 1);
headerAddOrAppendEntry(pPkg->header, HEADER_I18NTABLE,
RPM_STRING_ARRAY_TYPE, &g_szDefLang, 1);
headerAddI18NString(pPkg->header, RPMTAG_SUMMARY,
pXMLPkg->m_szSummary, g_szDefLang);
headerAddI18NString(pPkg->header, RPMTAG_DESCRIPTION,
pXMLPkg->m_szSummary, g_szDefLang);
if (pXMLSpec->m_szPackagerEmail || pXMLSpec->m_szPackager) {
szTmp = malloc(strlen(pXMLSpec->m_szPackager)+strlen(pXMLSpec->m_szPackagerEmail)+4);
if (pXMLSpec->m_szPackagerEmail && pXMLSpec->m_szPackager)
sprintf(szTmp, "%s <%s>", pXMLSpec->m_szPackager,
pXMLSpec->m_szPackagerEmail);
else
sprintf(szTmp, "%s", pXMLSpec->m_szPackager ? pXMLSpec->m_szPackager : pXMLSpec->m_szPackagerEmail);
headerAddOrAppendEntry(pPkg->header, RPMTAG_PACKAGER,
RPM_STRING_TYPE, szTmp, 1);
free(szTmp);
}
if (pXMLPkg->m_pFiles)
pPkg->fileList = fileToStrBuf(pXMLPkg->m_pFiles->m_szFileList, NULL);
convertXMLScripts(pXMLPkg->m_pPre, pPkg, pSpec,
RPMTAG_PREIN, RPMTAG_PREINPROG);
convertXMLScripts(pXMLPkg->m_pPost, pPkg, pSpec,
RPMTAG_POSTIN, RPMTAG_POSTINPROG);
convertXMLScripts(pXMLPkg->m_pPreUn, pPkg, pSpec,
RPMTAG_PREUN, RPMTAG_PREUNPROG);
convertXMLScripts(pXMLPkg->m_pPostUn, pPkg, pSpec,
RPMTAG_POSTUN, RPMTAG_POSTUNPROG);
convertXMLScripts(pXMLPkg->m_pVerify, pPkg, pSpec,
RPMTAG_VERIFYSCRIPT, RPMTAG_VERIFYSCRIPTPROG);
convertXMLPackage(pXMLPkg->m_pNext, pXMLSpec, pSpec);
}
void convertXMLMacro(const t_structXMLMacro* pMacro,
Spec pSpec)
{
if (!pMacro || !pSpec)
return;
addMacroEx(pMacro->m_szName, (char**)&(pMacro->m_szValue), 1);
convertXMLMacro(pMacro->m_pNext, pSpec);
}
void convertXMLBuildRequires(const t_structXMLSpec* pXMLSpec,
Spec pSpec)
{
t_structXMLRequire* pRequire = NULL;
char* szTmp = NULL;
char* szVal = NULL;
int i = 0;
int nFlags = 0;
int nIndex = 0;
char* szVersion = NULL;
pRequire = pXMLSpec->m_pBuildRequires;
szVal = malloc(1);
szVal[0] = '\0';
while (pRequire) {
if (pRequire->m_szName) {
szTmp = malloc(strlen(szVal)+strlen(pRequire->m_szName)+2);
if (strlen(szVal))
sprintf(szTmp, "%s", pRequire->m_szName);
else
sprintf(szTmp, "%s %s", szVal, pRequire->m_szName);
free(szVal);
szVal = szTmp;
}
szVersion = NULL;
nFlags = 0;
if (pRequire->m_szCompare && pRequire->m_szVersion) {
for (i = 0; sReqComp[i].m_szCmp; i++)
if (!strcasecmp(sReqComp[i].m_szCmp, pRequire->m_szCompare)) {
nFlags = (sReqComp[i].m_rpmCmp | RPMSENSE_ANY) & ~RPMSENSE_SENSEMASK;
szVersion = pRequire->m_szVersion;
}
}
addReqProv(pSpec, pSpec->buildRestrictions, nFlags,
pRequire->m_szName, pRequire->m_szVersion, nIndex);
addReqProv(pSpec, pSpec->sourceHeader, nFlags,
pRequire->m_szName, pRequire->m_szVersion, nIndex);
pRequire = pRequire->m_pNext;
nIndex++;
}
if (pXMLSpec->m_szPackagerEmail || pXMLSpec->m_szPackager) {
szTmp = malloc(strlen(pXMLSpec->m_szPackager)+strlen(pXMLSpec->m_szPackagerEmail)+4);
if (pXMLSpec->m_szPackagerEmail && pXMLSpec->m_szPackager)
sprintf(szTmp, "%s <%s>", pXMLSpec->m_szPackager, pXMLSpec->m_szPackagerEmail);
else
sprintf(szTmp, "%s", pXMLSpec->m_szPackager ? pXMLSpec->m_szPackager : pXMLSpec->m_szPackagerEmail);
headerAddOrAppendEntry(pSpec->packages->header, RPMTAG_PACKAGER,
RPM_STRING_TYPE, szTmp, 1);
free(szTmp);
}
free(szVal);
}
Spec toRPMStruct(const t_structXMLSpec* pXMLSpec)
{
Spec pSpec = NULL;
char* szTmp = NULL;
if (!pXMLSpec)
return NULL;
pSpec = g_pSpec;
newStrEx(pXMLSpec->m_szSpecName, (char**)&(pSpec->specFile));
if (pXMLSpec->m_pPackages) {
addMacroEx("group",
(char**)&(pXMLSpec->m_pPackages->m_szGroup), RMIL_SPEC);
addMacroEx("summary",
(char**)&(pXMLSpec->m_pPackages->m_szSummary), RMIL_SPEC);
}
pSpec->gotBuildRootURL = 1;
newStrEx(pXMLSpec->m_szBuildRootDir, (char**)(&(pSpec->buildRootURL)));
newStrEx(pXMLSpec->m_szBuildSubdir, (char**)(&(pSpec->buildSubdir)));
newStrEx(pXMLSpec->m_szRootDir, (char**)(&(pSpec->rootURL)));
convertXMLSource(pXMLSpec->m_pSources, pSpec, RPMBUILD_ISSOURCE);
convertXMLSource(pXMLSpec->m_pPatches, pSpec, RPMBUILD_ISPATCH);
pSpec->prep = scriptsToStringBuf(pXMLSpec->m_pPrep, pSpec);
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);
if (pXMLSpec->m_szPackagerEmail || pXMLSpec->m_szPackager) {
szTmp = malloc(strlen(pXMLSpec->m_szPackager)+strlen(pXMLSpec->m_szPackagerEmail)+4);
if (pXMLSpec->m_szPackagerEmail && pXMLSpec->m_szPackager)
sprintf(szTmp, "%s <%s>", pXMLSpec->m_szPackager,
pXMLSpec->m_szPackagerEmail);
else
sprintf(szTmp, "%s", pXMLSpec->m_szPackager ? pXMLSpec->m_szPackager : pXMLSpec->m_szPackagerEmail);
headerAddOrAppendEntry(pSpec->sourceHeader, RPMTAG_PACKAGER,
RPM_STRING_TYPE, szTmp, 1);
free(szTmp);
}
pSpec->buildRestrictions = headerNew();
convertXMLBuildRequires(pXMLSpec, pSpec);
#ifdef XML_DEBUG
printSpecInfo(pSpec);
#endif
return pSpec;
}