static rpmte * rpmalAllFileSatisfiesDepend(const rpmal al, const char *fileName, const rpmds filterds) { const char *slash; rpmte * ret = NULL; if (al == NULL || fileName == NULL || *fileName != '/') return NULL; /* Split path into dirname and basename components for lookup */ if ((slash = strrchr(fileName, '/')) != NULL) { availableIndexFileEntry result; int resultCnt = 0; size_t bnStart = (slash - fileName) + 1; rpmsid baseName; if (al->fileHash == NULL) rpmalMakeFileIndex(al); baseName = rpmstrPoolId(al->pool, fileName + bnStart, 0); if (!baseName) return NULL; /* no match possible */ rpmalFileHashGetEntry(al->fileHash, baseName, &result, &resultCnt, NULL); if (resultCnt > 0) { int i, found; ret = xmalloc((resultCnt+1) * sizeof(*ret)); fingerPrint * fp = NULL; rpmsid dirName = rpmstrPoolIdn(al->pool, fileName, bnStart, 1); if (!al->fpc) al->fpc = fpCacheCreate(1001, NULL); fpLookup(al->fpc, rpmstrPoolStr(al->pool, dirName), fileName + bnStart, &fp); for (found = i = 0; i < resultCnt; i++) { availablePackage alp = al->list + result[i].pkgNum; if (alp->p == NULL) /* deleted */ continue; /* ignore self-conflicts/obsoletes */ if (filterds && rpmteDS(alp->p, rpmdsTagN(filterds)) == filterds) continue; if (result[i].dirName != dirName && !fpLookupEquals(al->fpc, fp, rpmstrPoolStr(al->pool, result[i].dirName), fileName + bnStart)) continue; ret[found] = alp->p; found++; } _free(fp); ret[found] = NULL; } } return ret; }
static rpmte * rpmalAllFileSatisfiesDepend(const rpmal al, const rpmds ds) { const char *fileName = rpmdsN(ds); const char *slash; rpmte * ret = NULL; if (al == NULL || fileName == NULL || *fileName != '/') return NULL; /* Split path into dirname and basename components for lookup */ if ((slash = strrchr(fileName, '/')) != NULL) { availableIndexEntry result; int resultCnt = 0; size_t bnStart = (slash - fileName) + 1; char dirName[bnStart + 1]; struct fileNameEntry_s fne = { .baseName = fileName + bnStart, .dirName = dirName, }; strncpy(dirName, fileName, bnStart); dirName[bnStart] = '\0'; rpmalFileHashGetEntry(al->fileHash, fne, &result, &resultCnt, NULL); if (resultCnt > 0) { int i, found; ret = xmalloc((resultCnt+1) * sizeof(*ret)); for (found = i = 0; i < resultCnt; i++) { availablePackage alp = al->list + result[i].pkgNum; if (alp->p == NULL) // deleted continue; rpmdsNotify(ds, "(added files)", 0); ret[found] = alp->p; found++; } ret[found] = NULL; } } return ret; }