--- apt-0.5.15lorg3.94pt/apt-pkg/rpm/rpmcfgbackup.cc 2012-01-29 19:50:39.627475571 +0100 +++ apt-rpm/apt-pkg/rpm/rpmcfgbackup.cc 2010-09-09 13:08:28.000000000 +0200 @@ -96,64 +96,77 @@ bool pkgRPMCfgBackup::GetCfgFileList(const char *pkgName,vector<string> &FileList, string &pkgVersion, string &pkgRelease) { - rpmdb DB; - int Rc = 0; - DB = NULL; + stringstream rpmDbDump; + rpmReadConfigFiles(NULL, NULL); + rpmts ts = rpmtsCreate(); + Header hdr; + rpmfi fi = NULL; + int scareMem = 0; + int i; - rpmReadConfigFiles(NULL,NULL); - Rc = rpmdbOpen(NULL,&DB,O_RDONLY,0644); + rpmtsSetRootDir(ts, "/"); - if(Rc) - return false; + if (rpmtsGetRdb(ts) == NULL) { + int rc = rpmtsOpenDB(ts, O_RDONLY); + } - if(DB == NULL) - return false; + // Sanitize package name - removing architecture ".x86-64 .." + char *tmpName=(char *)malloc(strlen(pkgName)+1); + char *ptrTmpName; + strncpy(tmpName, pkgName,strlen(pkgName)); - Header h; - raptHeader header(h); - vector<string> FileNames; - vector<string> DirNames; - int CountF = 0; - int CountD = 0; - vector<raptInt> DirIndexes; - vector<raptInt> FileFlags; + if ((ptrTmpName=strchr(tmpName,'.')) != NULL) { + *ptrTmpName=0; + } - string S; - rpmdbMatchIterator MI; - MI = rpmdbInitIterator(DB, RPMTAG_NAME, pkgName,0); - if(MI == NULL) - return false; + rpmdbMatchIterator Iter = rpmtsInitIterator(ts, RPMTAG_NAME, tmpName, 0); - h = rpmdbNextIterator(MI); - if( h == NULL) - return false; + while ((hdr = rpmdbNextIterator(Iter)) != NULL) + { - S = header.format("%{VERSION}"); - pkgVersion = S.c_str(); - S = header.format("%{RELEASE}"); - pkgRelease = S.c_str(); + rpmtd tagdata = rpmtdNew(); - header.getTag(RPMTAG_BASENAMES,FileNames); - header.getTag(RPMTAG_DIRNAMES,DirNames); - header.getTag(RPMTAG_DIRINDEXES,DirIndexes); - header.getTag(RPMTAG_FILEFLAGS,FileFlags); + if (headerGet(hdr, RPMTAG_VERSION, tagdata, HEADERGET_RAW)) { + pkgVersion = rpmtdGetString(tagdata); + } + if (headerGet(hdr, RPMTAG_RELEASE, tagdata, HEADERGET_RAW)) { + pkgRelease = rpmtdGetString(tagdata); + } - for(int i = 0 ; i < DirIndexes.size(); i++) - { - if(FileFlags[i] & RPMFILE_CONFIG) - { - string FilePath = string(DirNames[DirIndexes[i]]) + string(FileNames[i]); - FileList.push_back(FilePath); + fi = rpmfiNew(ts, hdr, RPMTAG_BASENAMES, scareMem); + if (rpmfiFC(fi) <= 0) { + rpmtdFreeData(tagdata); + rpmtdFree(tagdata); + + break; } + + fi = rpmfiInit(fi, 0); + while ((i = rpmfiNext(fi)) >= 0) { + const char *fn = rpmfiFN(fi); + rpmfileAttrs fflags = rpmfiFFlags(fi); + if ((fflags & RPMFILE_CONFIG)) { + FileList.push_back(fn); } - rpmdbFreeIterator(MI); - rpmdbClose(DB); + + } + rpmtdFreeData(tagdata); + rpmtdFree(tagdata); + + } + + Iter = rpmdbFreeIterator(Iter); + fi = rpmfiFree(fi); + + int rc=rpmtsCloseDB(ts); return true; + + } /* --- apt-0.5.15lorg3.94pt/tools/genpkglist.cc.cm-rpm4.9 2012-02-05 03:28:08.028709840 +0100 +++ apt-0.5.15lorg3.94pt/tools/genpkglist.cc 2012-02-05 03:31:08.980432278 +0100 @@ -254,11 +254,11 @@ raptTagData dnameval, bnameval, dindexval; int res; - res = headerGetEntry(h, RPMTAG_DIRNAMES, &type1, + res = headerGetEntry(h, RPMTAG_DIRNAMES, (rpm_tagtype_t*)&type1, &dnameval, &count1); - res = headerGetEntry(h, RPMTAG_BASENAMES, &type2, + res = headerGetEntry(h, RPMTAG_BASENAMES, (rpm_tagtype_t*)&type2, &bnameval, &count2); - res = headerGetEntry(h, RPMTAG_DIRINDEXES, &type3, + res = headerGetEntry(h, RPMTAG_DIRINDEXES, (rpm_tagtype_t*)&type3, &dindexval, &count3); dnames = (char **)dnameval; @@ -282,9 +282,9 @@ char *srpm, *name; int res; - res = headerGetEntry(h, RPMTAG_NAME, &type, + res = headerGetEntry(h, RPMTAG_NAME, (rpm_tagtype_t*)&type, &nameval, &count); - res = headerGetEntry(h, RPMTAG_SOURCERPM, &type, + res = headerGetEntry(h, RPMTAG_SOURCERPM, (rpm_tagtype_t*)&type, &srpmval, &count); name = (char *)nameval; srpm = (char *)srpmval;