#include #include #include #include #include "stringbuf.h" #include "rpmbuild.h" #include "xmlmisc.h" #include "xmlstruct.h" #include "xmlverify.h" extern Spec g_pSpec; char* g_szSpecPath = NULL; void attrSetStr(const t_structXMLAttr* pAttr, const char* szParam, char** pszVar) { if (pAttr && !strcasecmp(pAttr->m_szName, szParam)) newStrEx(pAttr->m_szValue, pszVar); } void attrSetInt(const t_structXMLAttr* pAttr, const char* szParam, int* pnVar) { if (pAttr && !strcasecmp(pAttr->m_szName, szParam)) (*pnVar) = atoi(pAttr->m_szValue); } void attrSetBool(const t_structXMLAttr* pAttr, const char* szParam, int* pnVar) { if (pAttr && !strcasecmp(pAttr->m_szName, szParam)) (*pnVar) = strToBool(pAttr->m_szValue); } t_structXMLAttr* newXMLAttr(const char* szName, const char* szValue, int nType) { t_structXMLAttr* pAttr = NULL; if ((pAttr = malloc(sizeof(t_structXMLAttr)))) { pAttr->m_szName = NULL; pAttr->m_szValue = NULL; pAttr->m_nType = nType; pAttr->m_pNext = NULL; newStrEx(szName, &(pAttr->m_szName)); newStrEx(szValue, &(pAttr->m_szValue)); } return pAttr; } int freeXMLAttr(t_structXMLAttr** ppAttr) { if (*ppAttr) { freeStr(&((*ppAttr)->m_szName)); freeStr(&((*ppAttr)->m_szValue)); freeXMLAttr(&((*ppAttr)->m_pNext)); free(*ppAttr); *ppAttr = NULL; } return 0; } t_structXMLAttr* addXMLAttr(const char* szName, const char* szValue, int nType, t_structXMLAttr** ppAttr) { t_structXMLAttr* pAttr = NULL; if ((pAttr = getLastXMLAttr(*ppAttr))) pAttr = (pAttr->m_pNext = newXMLAttr(szName, szValue, nType)); else pAttr = (*ppAttr = newXMLAttr(szName, szValue, nType)); return pAttr; } t_structXMLAttr* getLastXMLAttr(t_structXMLAttr* pAttr) { while (pAttr && (pAttr->m_pNext)) pAttr = pAttr->m_pNext; return pAttr; } t_structXMLAttr* getXMLAttr(const char* szName, t_structXMLAttr* pAttr) { while (pAttr && (strcasecmp(szName, pAttr->m_szName) != 0)) pAttr = pAttr->m_pNext; return pAttr; } t_structXMLMacro* newXMLMacro(const t_structXMLAttr* pAttrs) { t_structXMLMacro* pMacro = NULL; t_structXMLAttr* pAttr = NULL; if ((pMacro = malloc(sizeof(t_structXMLMacro)))) { pMacro->m_szName = NULL; pMacro->m_szValue = NULL; pMacro->m_pNext = NULL; pAttr = (t_structXMLAttr*)pAttrs; do { attrSetStr(pAttr, "name", &(pMacro->m_szName)); } while ((pAttr = pAttr->m_pNext)); //addMacroEx(pMacro->m_szName, (char**)&(pMacro->m_szValue), 1); } return pMacro; } int freeXMLMacro(t_structXMLMacro** ppMacro) { if (*ppMacro) { freeStr(&((*ppMacro)->m_szName)); freeStr(&((*ppMacro)->m_szValue)); freeXMLMacro(&((*ppMacro)->m_pNext)); free(*ppMacro); } *ppMacro = NULL; return 0; } t_structXMLMacro* addXMLMacro(const t_structXMLAttr* pAttrs, t_structXMLMacro** ppMacro) { t_structXMLMacro* pMacro = NULL; if ((pMacro = getLastXMLMacro(*ppMacro))) pMacro = (pMacro->m_pNext = newXMLMacro(pAttrs)); else pMacro = (*ppMacro = newXMLMacro(pAttrs)); return pMacro; } t_structXMLMacro* getLastXMLMacro(t_structXMLMacro* pMacro) { while (pMacro && (pMacro->m_pNext)) pMacro = pMacro->m_pNext; return pMacro; } t_structXMLMirror* newXMLMirror(const t_structXMLAttr* pAttrs) { t_structXMLMirror* pMirror = NULL; t_structXMLAttr* pAttr = NULL; if ((pMirror = malloc(sizeof(t_structXMLMirror)))) { pMirror->m_szName = NULL; pMirror->m_szLocation = NULL; pMirror->m_szCountry = NULL; pMirror->m_szPath = NULL; pMirror->m_nTries = 0; pMirror->m_pNext = NULL; pAttr = (t_structXMLAttr*)pAttrs; do { attrSetStr(pAttr, "name", &(pMirror->m_szName)); attrSetStr(pAttr, "location", &(pMirror->m_szLocation)); attrSetStr(pAttr, "country", &(pMirror->m_szCountry)); attrSetStr(pAttr, "path", &(pMirror->m_szPath)); } while ((pAttr = pAttr->m_pNext)); } return pMirror; } int freeXMLMirror(t_structXMLMirror** ppMirror) { if (*ppMirror) { freeStr(&((*ppMirror)->m_szName)); freeStr(&((*ppMirror)->m_szLocation)); freeStr(&((*ppMirror)->m_szCountry)); freeStr(&((*ppMirror)->m_szPath)); freeXMLMirror(&((*ppMirror)->m_pNext)); free(*ppMirror); } *ppMirror = NULL; return 0; } t_structXMLMirror* addXMLMirror(const t_structXMLAttr* pAttrs, t_structXMLMirror** ppMirror) { t_structXMLMirror* pMirror = NULL; if ((pMirror = getLastXMLMirror(*ppMirror))) pMirror = (pMirror->m_pNext = newXMLMirror(pAttrs)); else pMirror = (*ppMirror = newXMLMirror(pAttrs)); return pMirror; } t_structXMLMirror* getLastXMLMirror(t_structXMLMirror* pMirror) { while (pMirror && (pMirror->m_pNext)) pMirror = pMirror->m_pNext; return pMirror; } t_structXMLSource* newXMLSource(const t_structXMLAttr* pAttrs) { t_structXMLSource* pSource = NULL; t_structXMLAttr* pAttr = NULL; if ((pSource = malloc(sizeof(t_structXMLSource)))) { pSource->m_szName = NULL; pSource->m_szMD5 = NULL; pSource->m_szDirectory = NULL; pSource->m_nSize = 0; pSource->m_nNum = -1; pSource->m_pMirrors = NULL; pSource->m_pNext = NULL; pAttr = (t_structXMLAttr*)pAttrs; do { attrSetStr(pAttr, "name", &(pSource->m_szName)); attrSetInt(pAttr, "size", &(pSource->m_nSize)); attrSetStr(pAttr, "md5", &(pSource->m_szMD5)); attrSetStr(pAttr, "directory", &(pSource->m_szDirectory)); attrSetInt(pAttr, "id", &(pSource->m_nNum)); } while ((pAttr = pAttr->m_pNext)); } return pSource; } int freeXMLSource(t_structXMLSource** ppSource) { if (*ppSource) { freeStr(&((*ppSource)->m_szName)); freeStr(&((*ppSource)->m_szMD5)); freeStr(&((*ppSource)->m_szDirectory)); freeXMLMirror(&((*ppSource)->m_pMirrors)); freeXMLSource(&((*ppSource)->m_pNext)); free(*ppSource); } *ppSource = NULL; return 0; } t_structXMLSource* addXMLSource(const t_structXMLAttr* pAttrs, t_structXMLSource** ppSource) { t_structXMLSource* pSource = NULL; if ((pSource = getLastXMLSource(*ppSource))) { pSource->m_pNext = newXMLSource(pAttrs); if (pSource->m_pNext->m_nNum == -1) pSource->m_pNext->m_nNum = pSource->m_nNum + 1; pSource = pSource->m_pNext; } else { pSource = (*ppSource = newXMLSource(pAttrs)); if (pSource->m_nNum == -1) pSource->m_nNum = 0; } return pSource; } t_structXMLSource* getLastXMLSource(t_structXMLSource* pSource) { while (pSource && (pSource->m_pNext)) pSource = pSource->m_pNext; return pSource; } t_structXMLSource* getXMLSource(int nNum, t_structXMLSource* pSource) { while (pSource && (pSource->m_nNum != nNum)) pSource = pSource->m_pNext; return pSource; } t_structXMLRequire* newXMLRequire(const t_structXMLAttr* pAttrs) { t_structXMLRequire* pRequire = NULL; t_structXMLAttr* pAttr = NULL; if ((pRequire = malloc(sizeof(t_structXMLRequire)))) { pRequire->m_szName = NULL; pRequire->m_szVersion = NULL; pRequire->m_szRelease = NULL; pRequire->m_szEpoch = NULL; pRequire->m_szCompare = NULL; pRequire->m_pNext = NULL; pAttr = (t_structXMLAttr*)pAttrs; do { attrSetStr(pAttr, "name", &(pRequire->m_szName)); attrSetStr(pAttr, "version", &(pRequire->m_szVersion)); attrSetStr(pAttr, "release", &(pRequire->m_szRelease)); attrSetStr(pAttr, "epoch", &(pRequire->m_szEpoch)); attrSetStr(pAttr, "compare", &(pRequire->m_szCompare)); } while ((pAttr = pAttr->m_pNext)); } return pRequire; } int freeXMLRequire(t_structXMLRequire** ppRequire) { if (*ppRequire) { freeStr(&((*ppRequire)->m_szName)); freeStr(&((*ppRequire)->m_szVersion)); freeStr(&((*ppRequire)->m_szRelease)); freeStr(&((*ppRequire)->m_szEpoch)); freeStr(&((*ppRequire)->m_szCompare)); freeXMLRequire(&((*ppRequire)->m_pNext)); free(*ppRequire); } *ppRequire = NULL; return 0; } t_structXMLRequire* addXMLRequire(const t_structXMLAttr* pAttrs, t_structXMLRequire** ppRequire) { t_structXMLRequire* pRequire = NULL; if ((pRequire = getLastXMLRequire(*ppRequire))) pRequire = (pRequire->m_pNext = newXMLRequire(pAttrs)); else pRequire = (*ppRequire = newXMLRequire(pAttrs)); return pRequire; } t_structXMLRequire* getLastXMLRequire(t_structXMLRequire* pRequire) { while (pRequire && (pRequire->m_pNext)) pRequire = pRequire->m_pNext; return pRequire; } t_structXMLScript* newXMLScript(const t_structXMLAttr* pAttrs) { t_structXMLScript* pScript = NULL; t_structXMLAttr* pAttr = NULL; 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; if ((pAttr = (t_structXMLAttr*)pAttrs)) { 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)); } } return pScript; } int freeXMLScript(t_structXMLScript** ppScript) { 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)); free(*ppScript); } *ppScript = NULL; return 0; } t_structXMLScript* addXMLScript(const t_structXMLAttr* pAttrs, t_structXMLScript** ppScript) { t_structXMLScript* pScript = NULL; if ((pScript = getLastXMLScript(*ppScript))) pScript = (pScript->m_pNext = newXMLScript(pAttrs)); else pScript = (*ppScript = newXMLScript(pAttrs)); return pScript; } t_structXMLScript* getLastXMLScript(t_structXMLScript* pScript) { while (pScript && (pScript->m_pNext)) pScript = pScript->m_pNext; return pScript; } t_structXMLScripts* newXMLScripts(const t_structXMLAttr* pAttrs) { t_structXMLScripts* pScripts = NULL; t_structXMLAttr* pAttr = NULL; if ((pScripts = malloc(sizeof(t_structXMLScripts)))) { pScripts->m_szInterpreter = NULL; pScripts->m_szScript = NULL; pScripts->m_pScripts = NULL; if ((pAttr = (t_structXMLAttr*)pAttrs)) { do { attrSetStr(pAttr, "interpreter", &(pScripts->m_szInterpreter)); attrSetStr(pAttr, "script", &(pScripts->m_szScript)); } while ((pAttr = pAttr->m_pNext)); } } return pScripts; } int freeXMLScripts(t_structXMLScripts** ppScripts) { if (*ppScripts) { freeStr(&((*ppScripts)->m_szInterpreter)); freeStr(&((*ppScripts)->m_szScript)); freeXMLScript(&((*ppScripts)->m_pScripts)); free(*ppScripts); } *ppScripts = NULL; return 0; } t_structXMLFiles* newXMLFiles(const t_structXMLAttr* pAttrs) { t_structXMLFiles* pFiles = NULL; t_structXMLAttr* pAttr = NULL; if ((pFiles = malloc(sizeof(t_structXMLFiles)))) { pFiles->m_szFileList = NULL; pFiles->m_szUID = NULL; pFiles->m_szGID = NULL; pAttr = (t_structXMLAttr*)pAttrs; do { attrSetStr(pAttr, "list", &(pFiles->m_szFileList)); attrSetStr(pAttr, "uid", &(pFiles->m_szUID)); attrSetStr(pAttr, "gid", &(pFiles->m_szGID)); } while ((pAttr = pAttr->m_pNext)); } return pFiles; } int freeXMLFiles(t_structXMLFiles** ppFiles) { if (*ppFiles) { freeStr(&((*ppFiles)->m_szFileList)); freeStr(&((*ppFiles)->m_szUID)); freeStr(&((*ppFiles)->m_szGID)); free(*ppFiles); } *ppFiles = NULL; 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; t_structXMLAttr* pAttr = 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_pPre = NULL; pPackage->m_pPost = NULL; pPackage->m_pPreUn = NULL; pPackage->m_pPostUn = NULL; pPackage->m_pVerify = NULL; pPackage->m_nAutoRequire = 1; pPackage->m_nAutoProvide = 1; pPackage->m_nAutoSuggest = 0; pPackage->m_pFiles = 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)); } return pPackage; } int freeXMLPackage(t_structXMLPackage** ppPackage) { if (*ppPackage) { freeStr(&((*ppPackage)->m_szName)); freeStr(&((*ppPackage)->m_szVersion)); freeStr(&((*ppPackage)->m_szGroup)); freeStr(&((*ppPackage)->m_szSummary)); freeStr(&((*ppPackage)->m_szDescription)); freeXMLFiles(&((*ppPackage)->m_pFiles)); freeXMLScripts(&((*ppPackage)->m_pPre)); freeXMLScripts(&((*ppPackage)->m_pPost)); freeXMLScripts(&((*ppPackage)->m_pPreUn)); freeXMLScripts(&((*ppPackage)->m_pPostUn)); freeXMLScripts(&((*ppPackage)->m_pVerify)); 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); } *ppPackage = NULL; return 0; } t_structXMLPackage* addXMLPackage(const t_structXMLAttr* pAttrs, t_structXMLPackage** ppPackage) { t_structXMLPackage* pPackage = NULL; if ((pPackage = getLastXMLPackage(*ppPackage))) pPackage = (pPackage->m_pNext = newXMLPackage(pAttrs)); else pPackage = (*ppPackage = newXMLPackage(pAttrs)); return pPackage; } t_structXMLPackage* getLastXMLPackage(t_structXMLPackage* pPackage) { while (pPackage && (pPackage->m_pNext)) pPackage = pPackage->m_pNext; return pPackage; } t_structXMLChange* newXMLChange(const t_structXMLAttr* pAttrs) { t_structXMLChange* pChange = NULL; if ((pChange = malloc(sizeof(t_structXMLChange)))) { pChange->m_szValue = NULL; pChange->m_pNext = NULL; } return pChange; } int freeXMLChange(t_structXMLChange** ppChange) { if (*ppChange) { freeStr(&((*ppChange)->m_szValue)); freeXMLChange(&((*ppChange)->m_pNext)); free(*ppChange); } *ppChange = NULL; return 0; } t_structXMLChange* addXMLChange(const t_structXMLAttr* pAttrs, t_structXMLChange** ppChange) { t_structXMLChange* pChange = NULL; if ((pChange = getLastXMLChange(*ppChange))) pChange = (pChange->m_pNext = newXMLChange(pAttrs)); else pChange = (*ppChange = newXMLChange(pAttrs)); return pChange; } t_structXMLChange* getLastXMLChange(t_structXMLChange* pChange) { while (pChange && (pChange->m_pNext)) pChange = pChange->m_pNext; return pChange; } t_structXMLChanges* newXMLChanges(const t_structXMLAttr* pAttrs) { t_structXMLChanges* pChanges = NULL; t_structXMLAttr* pAttr = NULL; if ((pChanges = malloc(sizeof(t_structXMLChanges)))) { pChanges->m_szDate = NULL; pChanges->m_szVersion = NULL; pChanges->m_szAuthor = NULL; pChanges->m_szAuthorEmail = NULL; pChanges->m_pChanges = NULL; pChanges->m_pNext = NULL; pAttr = (t_structXMLAttr*)pAttrs; do { attrSetStr(pAttr, "date", &(pChanges->m_szDate)); attrSetStr(pAttr, "version", &(pChanges->m_szVersion)); attrSetStr(pAttr, "author", &(pChanges->m_szAuthor)); attrSetStr(pAttr, "author-email", &(pChanges->m_szAuthorEmail)); } while ((pAttr = pAttr->m_pNext)); } return pChanges; } int freeXMLChanges(t_structXMLChanges** ppChanges) { if (*ppChanges) { freeStr(&((*ppChanges)->m_szDate)); freeStr(&((*ppChanges)->m_szVersion)); freeStr(&((*ppChanges)->m_szAuthor)); freeStr(&((*ppChanges)->m_szAuthorEmail)); freeXMLChanges(&((*ppChanges)->m_pNext)); free(*ppChanges); } *ppChanges = NULL; return 0; } t_structXMLChanges* addXMLChanges(const t_structXMLAttr* pAttrs, t_structXMLChanges** ppChanges) { t_structXMLChanges* pChanges = NULL; if ((pChanges = getLastXMLChanges(*ppChanges))) pChanges = (pChanges->m_pNext = newXMLChanges(pAttrs)); else pChanges = (*ppChanges = newXMLChanges(pAttrs)); return pChanges; } t_structXMLChanges* getLastXMLChanges(t_structXMLChanges* pChanges) { while (pChanges && (pChanges->m_pNext)) pChanges = pChanges->m_pNext; return pChanges; } t_structXMLSpec* newXMLSpec(const t_structXMLAttr* pAttrs, const char* szXMLFile) { t_structXMLSpec* pSpec = NULL; t_structXMLAttr* pAttr = NULL; char* szTmp = NULL; int nLen; if ((pSpec = malloc(sizeof(t_structXMLSpec)))) { pSpec->m_szSpecName = NULL; pSpec->m_szBuildRootDir = NULL; pSpec->m_szBuildSubdir = NULL; pSpec->m_szRootDir = NULL; pSpec->m_szName = NULL; pSpec->m_szVersion = NULL; pSpec->m_szRelease = NULL; pSpec->m_szEpoch = NULL; pSpec->m_szDistribution = NULL; pSpec->m_szVendor = NULL; pSpec->m_szPackager = NULL; pSpec->m_szPackagerEmail = NULL; pSpec->m_szCopyright = NULL; pSpec->m_szURL = NULL; pSpec->m_pBuildRequires = NULL; pSpec->m_pBuildConflicts = NULL; pSpec->m_pBuildSuggests = NULL; pSpec->m_pPrep = NULL; pSpec->m_pBuild = NULL; pSpec->m_pInstall = NULL; pSpec->m_pClean = NULL; pSpec->m_pMacros = NULL; pSpec->m_pSources = NULL; pSpec->m_pPatches = NULL; pSpec->m_pPackages = NULL; pSpec->m_pChangelog = NULL; g_pSpec = newSpec(); pAttr = (t_structXMLAttr*)pAttrs; do { attrSetStr(pAttr, "name", &(pSpec->m_szName)); attrSetStr(pAttr, "version", &(pSpec->m_szVersion)); attrSetStr(pAttr, "release", &(pSpec->m_szRelease)); attrSetStr(pAttr, "epoch", &(pSpec->m_szEpoch)); attrSetStr(pAttr, "distribution", &(pSpec->m_szDistribution)); attrSetStr(pAttr, "vendor", &(pSpec->m_szVendor)); attrSetStr(pAttr, "packager", &(pSpec->m_szPackager)); attrSetStr(pAttr, "packager-email", &(pSpec->m_szPackagerEmail)); attrSetStr(pAttr, "copyright", &(pSpec->m_szCopyright)); attrSetStr(pAttr, "url", &(pSpec->m_szURL)); attrSetStr(pAttr, "buildroot", &(pSpec->m_szBuildRootDir)); attrSetStr(pAttr, "builddir", &(pSpec->m_szBuildSubdir)); } while ((pAttr = pAttr->m_pNext)); addMacro(NULL, "_docdir", NULL, "%{_defaultdocdir}", RMIL_SPEC); szTmp = (char*)rpmGetPath(szXMLFile, NULL); newStr(szTmp, &(pSpec->m_szSpecName)); free(szTmp); if ((szTmp = rindex(pSpec->m_szSpecName, '/'))) { szTmp++; nLen = szTmp-(pSpec->m_szSpecName); g_szSpecPath = malloc(nLen+1); snprintf(g_szSpecPath, nLen, "%s", pSpec->m_szSpecName); } szTmp = malloc(4097); if (pSpec->m_szBuildRootDir == NULL) { snprintf(szTmp, 4096, "%%{_tmppath}/rpmxml-%s-%s", pSpec->m_szName, pSpec->m_szVersion); newStrEx(szTmp, &(pSpec->m_szBuildRootDir)); } if (pSpec->m_szBuildSubdir == NULL) { snprintf(szTmp, 4096, "%s-%s", pSpec->m_szName, pSpec->m_szVersion); newStrEx(szTmp, &(pSpec->m_szBuildSubdir)); } free(szTmp); if (pSpec->m_szRootDir == NULL) newStrEx("/", &(pSpec->m_szRootDir)); addMacroEx("name", (char**)&(pSpec->m_szName), RMIL_SPEC); addMacroEx("version", (char**)&(pSpec->m_szVersion), RMIL_SPEC); addMacroEx("PACKAGE_VERSION", (char**)&(pSpec->m_szVersion), -1); addMacroEx("release", (char**)&(pSpec->m_szRelease), RMIL_SPEC); addMacroEx("PACKAGE_RELEASE", (char**)&(pSpec->m_szRelease), -2); addMacroEx("copyright", (char**)&(pSpec->m_szCopyright), RMIL_SPEC); addMacroEx("url", (char**)&(pSpec->m_szURL), RMIL_SPEC); addMacroEx("distribution", (char**)&(pSpec->m_szDistribution), RMIL_SPEC); addMacroEx("vendor", (char**)&(pSpec->m_szVendor), RMIL_SPEC); addMacroEx("buildroot", (char**)&(pSpec->m_szBuildRootDir), RMIL_SPEC); addMacroEx("buildsubdir", (char**)&(pSpec->m_szBuildSubdir), RMIL_SPEC); if (pSpec->m_szPackagerEmail || pSpec->m_szPackager) { szTmp = malloc(strlen(pSpec->m_szPackager)+strlen(pSpec->m_szPackagerEmail)+4); if (pSpec->m_szPackagerEmail && pSpec->m_szPackager) sprintf(szTmp, "%s <%s>", pSpec->m_szPackager, pSpec->m_szPackagerEmail); else sprintf(szTmp, "%s", pSpec->m_szPackager ? pSpec->m_szPackager : pSpec->m_szPackagerEmail); addMacroEx("packager", (char**)&(szTmp), RMIL_SPEC); free(szTmp); } } return pSpec; } int freeXMLSpec(t_structXMLSpec** ppSpec) { if (*ppSpec) { freeStr(&((*ppSpec)->m_szSpecName)); freeStr(&((*ppSpec)->m_szBuildRootDir)); freeStr(&((*ppSpec)->m_szBuildSubdir)); freeStr(&((*ppSpec)->m_szRootDir)); freeStr(&((*ppSpec)->m_szName)); freeStr(&((*ppSpec)->m_szVersion)); freeStr(&((*ppSpec)->m_szRelease)); freeStr(&((*ppSpec)->m_szEpoch)); freeStr(&((*ppSpec)->m_szDistribution)); freeStr(&((*ppSpec)->m_szVendor)); freeStr(&((*ppSpec)->m_szPackager)); freeStr(&((*ppSpec)->m_szPackagerEmail)); freeStr(&((*ppSpec)->m_szCopyright)); freeStr(&((*ppSpec)->m_szURL)); freeXMLRequire(&((*ppSpec)->m_pBuildRequires)); freeXMLRequire(&((*ppSpec)->m_pBuildConflicts)); freeXMLRequire(&((*ppSpec)->m_pBuildSuggests)); freeXMLScripts(&((*ppSpec)->m_pPrep)); freeXMLScripts(&((*ppSpec)->m_pBuild)); freeXMLScripts(&((*ppSpec)->m_pInstall)); freeXMLScripts(&((*ppSpec)->m_pClean)); freeXMLMacro(&((*ppSpec)->m_pMacros)); freeXMLSource(&((*ppSpec)->m_pSources)); freeXMLSource(&((*ppSpec)->m_pPatches)); freeXMLPackage(&((*ppSpec)->m_pPackages)); freeXMLChanges(&((*ppSpec)->m_pChangelog)); if (g_pSpec) freeSpec(g_pSpec); g_pSpec = NULL; if (g_szSpecPath) freeStr(&g_szSpecPath); free(*ppSpec); } *ppSpec = NULL; return 0; }