if (rp) *rp = release;
}
-typedef int (*dbrecMatch_t) (Header h, const char *reqName, const char * reqInfo, int reqFlags);
+typedef int (*dbrecMatch_t) (Header h, const char *reqName, const char * reqEVR, int reqFlags);
/* Provide the rpm version in case nothing else does. */
-static int rpmMatchesDepFlags(const char *reqName, const char * reqInfo, int reqFlags)
+static int rpmMatchesDepFlags(const char *reqName, const char * reqEVR, int reqFlags)
{
static const char *name = PACKAGE;
static const char *epoch = "0";
const char * reqEpoch = NULL;
const char * reqVersion = NULL;
const char * reqRelease = NULL;
- char *Revr;
+ char *rEVR;
int result;
int sense;
if (strcmp(name, reqName)) return 0;
/* Parse requires version into components */
- Revr = strdup(reqInfo);
- parseEVR(Revr, &reqEpoch, &reqVersion, &reqRelease);
+ rEVR = strdup(reqEVR);
+ parseEVR(rEVR, &reqEpoch, &reqVersion, &reqRelease);
/* Compare {package,requires} [epoch:]version[-release] */
sense = ((reqEpoch != NULL) ? rpmvercmp(epoch, reqEpoch) : 0);
sense = rpmvercmp(release, reqRelease);
}
}
- if (Revr) free(Revr);
+ if (rEVR) free(rEVR);
result = 0;
if ((reqFlags & RPMSENSE_LESS) && sense < 0) {
return result;
}
-static int rangeMatchesDepFlags (Header h, const char *reqName, const char * reqInfo, int reqFlags)
+static int rangeMatchesDepFlags (Header h, const char *reqName, const char * reqEVR, int reqFlags)
{
- char ** provides;
- char ** providesVersion;
- int * providesFlags;
+ const char ** provides;
+ const char ** providesEVR;
+ int_32 * providesFlags;
int providesCount;
const char * proEpoch = NULL;
const char * proVersion = NULL;
const char * proRelease = NULL;
- char *Pevr;
+ char *pEVR;
const char * reqEpoch = NULL;
const char * reqVersion = NULL;
const char * reqRelease = NULL;
- char *Revr;
+ char *rEVR;
int result;
int sense;
int type;
int i;
- if (!(reqFlags & RPMSENSE_SENSEMASK) || !reqInfo || !strlen(reqInfo))
+ if (!(reqFlags & RPMSENSE_SENSEMASK) || !reqEVR || !strlen(reqEVR))
return 1;
/* Get provides information from header */
* If no provides version info is available, match any requires.
*/
if (!headerGetEntry(h, RPMTAG_PROVIDEVERSION, &type,
- (void **) &providesVersion, &providesCount))
+ (void **) &providesEVR, &providesCount))
return 1;
headerGetEntry(h, RPMTAG_PROVIDEFLAGS, &type,
if (!headerGetEntry(h, RPMTAG_PROVIDENAME, &type,
(void **) &provides, &providesCount)) {
- if (providesVersion) xfree(providesVersion);
+ if (providesEVR) xfree(providesEVR);
return 0; /* XXX should never happen */
}
/* Parse requires version into components */
- Revr = strdup(reqInfo);
- parseEVR(Revr, &reqEpoch, &reqVersion, &reqRelease);
+ rEVR = strdup(reqEVR);
+ parseEVR(rEVR, &reqEpoch, &reqVersion, &reqRelease);
result = 0;
for (i = 0; i < providesCount; i++) {
continue;
/* Parse provides version into components */
- Pevr = strdup(providesVersion[i]);
- parseEVR(Pevr, &proEpoch, &proVersion, &proRelease);
+ pEVR = strdup(providesEVR[i]);
+ parseEVR(pEVR, &proEpoch, &proVersion, &proRelease);
/* Compare {provides,requires} [epoch:]version[-release] range */
sense = ((proEpoch != NULL && reqEpoch != NULL)
sense = rpmvercmp(proRelease, reqRelease);
}
}
- free(Pevr); Pevr = NULL;
+ free(pEVR); pEVR = NULL;
if ((reqFlags & RPMSENSE_LESS) && sense < 0) {
result = 1;
}
if (provides) xfree(provides);
- if (providesVersion) xfree(providesVersion);
- if (Revr) free(Revr);
+ if (providesEVR) xfree(providesEVR);
+ if (rEVR) free(rEVR);
return result;
}
-int headerMatchesDepFlags(Header h, const char *reqName, const char * reqInfo, int reqFlags)
+int headerMatchesDepFlags(Header h, const char *reqName, const char * reqEVR, int reqFlags)
{
const char * epoch, * version, * release;
const char * reqEpoch = NULL;
const char * reqVersion = NULL;
const char * reqRelease = NULL;
- char *Revr;
+ char *rEVR;
int type, count;
int_32 * epochval;
char buf[20];
int result;
int sense;
- if (!(reqFlags & RPMSENSE_SENSEMASK) || !reqInfo || !strlen(reqInfo))
+ if (!(reqFlags & RPMSENSE_SENSEMASK) || !reqEVR || !strlen(reqEVR))
return 1;
/* Get package information from header */
headerNVR(h, NULL, &version, &release);
/* Parse requires version into components */
- Revr = strdup(reqInfo);
- parseEVR(Revr, &reqEpoch, &reqVersion, &reqRelease);
+ rEVR = strdup(reqEVR);
+ parseEVR(rEVR, &reqEpoch, &reqVersion, &reqRelease);
/* Compare {package,requires} [epoch:]version[-release] */
sense = ((reqEpoch != NULL) ? rpmvercmp(epoch, reqEpoch) : 0);
sense = rpmvercmp(release, reqRelease);
}
}
- if (Revr) free(Revr);
+ if (rEVR) free(rEVR);
result = 0;
if ((reqFlags & RPMSENSE_LESS) && sense < 0) {
}
static inline int dbrecMatchesDepFlags(rpmTransactionSet rpmdep, int recOffset,
- const char * reqName, const char * reqVersion,
+ const char * reqName, const char * reqEVR,
int reqFlags, dbrecMatch_t matchDepFlags)
{
Header h;
return 0;
}
- rc = matchDepFlags(h, reqName, reqVersion, reqFlags);
+ rc = matchDepFlags(h, reqName, reqEVR, reqFlags);
headerFree(h);
}
if (headerGetEntry(h, RPMTAG_OBSOLETENAME, NULL, (void **) &obsoletes, &count)) {
- const char **obsoletesVersion;
- int *obsoletesFlags;
+ const char **obsoletesEVR;
+ int_32 *obsoletesFlags;
- headerGetEntry(h, RPMTAG_OBSOLETEVERSION, NULL, (void **) &obsoletesVersion, NULL);
+ headerGetEntry(h, RPMTAG_OBSOLETEVERSION, NULL, (void **) &obsoletesEVR, NULL);
headerGetEntry(h, RPMTAG_OBSOLETEFLAGS, NULL, (void **) &obsoletesFlags, NULL);
for (j = 0; j < count; j++) {
* Rpm prior to 3.0.3 does not have versioned obsoletes.
* If no obsoletes version info is available, match all names.
*/
- if (obsoletesVersion == NULL ||
+ if (obsoletesEVR == NULL ||
dbrecMatchesDepFlags(rpmdep, recOffset,
- obsoletes[j], obsoletesVersion[j], obsoletesFlags[j],
+ obsoletes[j], obsoletesEVR[j], obsoletesFlags[j],
headerMatchesDepFlags)) {
removePackage(rpmdep, recOffset, alNum);
}
dbiFreeIndexRecord(matches);
}
- if (obsoletesVersion) free(obsoletesVersion);
+ if (obsoletesEVR) free(obsoletesEVR);
free(obsoletes);
}
}
static struct availablePackage * alSatisfiesDepend(struct availableList * al,
- const char * reqName, const char * reqVersion, int reqFlags)
+ const char * reqName, const char * reqEVR, int reqFlags)
{
struct availableIndexEntry needle, * match;
if (!match) return NULL;
if (match->type != IET_NAME) return match->package;
- if (headerMatchesDepFlags(match->package->h, reqName, reqVersion, reqFlags))
+ if (headerMatchesDepFlags(match->package->h, reqName, reqEVR, reqFlags))
return match->package;
return NULL;
/* 2 == error */
/* 1 == dependency not satisfied */
static int unsatisfiedDepend(rpmTransactionSet rpmdep, const char * reqName,
- const char * reqVersion, int reqFlags,
+ const char * reqEVR, int reqFlags,
struct availablePackage ** suggestion)
{
dbiIndexSet matches;
int i;
- char * rcProvidesString;
- char * start;
rpmMessage(RPMMESS_DEBUG, _("dependencies: looking for %s\n"), reqName);
if (suggestion) *suggestion = NULL;
+ { const char * rcProvidesString;
+ const char * start;
if (!(reqFlags & RPMSENSE_SENSEMASK) &&
(rcProvidesString = rpmGetVar(RPMVAR_PROVIDES))) {
i = strlen(reqName);
while ((start = strstr(rcProvidesString, reqName))) {
- if (isspace(start[i]) || !start[i])
+ if (isspace(start[i]) || start[i] == '\0' || start[i] == ',')
return 0;
rcProvidesString = start + 1;
}
}
+ }
- if (alSatisfiesDepend(&rpmdep->addedPackages, reqName, reqVersion,
- reqFlags))
+ if (alSatisfiesDepend(&rpmdep->addedPackages, reqName, reqEVR, reqFlags))
return 0;
if (rpmdep->db != NULL) {
sizeof(int), intcmp))
continue;
if (dbrecMatchesDepFlags(rpmdep, recOffset,
- reqName, reqVersion, reqFlags, rangeMatchesDepFlags)) {
+ reqName, reqEVR, reqFlags, rangeMatchesDepFlags)) {
break;
}
}
continue;
if (dbrecMatchesDepFlags(rpmdep, recOffset,
- reqName, reqVersion, reqFlags, headerMatchesDepFlags)) {
+ reqName, reqEVR, reqFlags, headerMatchesDepFlags)) {
break;
}
}
}
/*
- * New features in rpm spec files add implicit dependencies.
- * Provide implicit rpm version in last ditch effort to satisfy.
+ * New features in rpm spec files add implicit dependencies on rpm
+ * version. Provide implicit rpm version in last ditch effort to
+ * satisfy an rpm dependency.
*/
- if (rpmMatchesDepFlags(reqName, reqVersion, reqFlags))
+ if (rpmMatchesDepFlags(reqName, reqEVR, reqFlags))
return 0;
}
if (suggestion)
*suggestion = alSatisfiesDepend(&rpmdep->availablePackages, reqName,
- reqVersion, reqFlags);
+ reqEVR, reqFlags);
return 1;
}
Header h, const char * requirement)
{
const char * name, * version, * release;
- const char ** requires, ** requiresVersion;
- const char ** conflicts, ** conflictsVersion;
+ const char ** requires, ** requiresEVR;
+ const char ** conflicts, ** conflictsEVR;
int requiresCount = 0, conflictsCount;
int type;
int i, rc;
int ourrc = 0;
- int * requireFlags, * conflictsFlags;
+ int_32 * requireFlags, * conflictsFlags;
struct availablePackage * suggestion;
if (!headerGetEntry(h, RPMTAG_REQUIRENAME, &type, (void **) &requires,
headerGetEntry(h, RPMTAG_REQUIREFLAGS, &type, (void **) &requireFlags,
&requiresCount);
headerGetEntry(h, RPMTAG_REQUIREVERSION, &type,
- (void **) &requiresVersion, &requiresCount);
+ (void **) &requiresEVR, &requiresCount);
}
if (!headerGetEntry(h, RPMTAG_CONFLICTNAME, &type, (void **) &conflicts,
headerGetEntry(h, RPMTAG_CONFLICTFLAGS, &type,
(void **) &conflictsFlags, &conflictsCount);
headerGetEntry(h, RPMTAG_CONFLICTVERSION, &type,
- (void **) &conflictsVersion, &conflictsCount);
+ (void **) &conflictsEVR, &conflictsCount);
}
for (i = 0; i < requiresCount && !ourrc; i++) {
if (requirement && strcmp(requirement, requires[i])) continue;
- rc = unsatisfiedDepend(rpmdep, requires[i], requiresVersion[i],
+ rc = unsatisfiedDepend(rpmdep, requires[i], requiresEVR[i],
requireFlags[i], &suggestion);
if (rc == 1) {
headerNVR(h, &name, &version, &release);
psp->problems[psp->num].byVersion = strdup(version);
psp->problems[psp->num].byRelease = strdup(release);
psp->problems[psp->num].needsName = strdup(requires[i]);
- psp->problems[psp->num].needsVersion = strdup(requiresVersion[i]);
+ psp->problems[psp->num].needsVersion = strdup(requiresEVR[i]);
psp->problems[psp->num].needsFlags = requireFlags[i];
psp->problems[psp->num].sense = RPMDEP_SENSE_REQUIRES;
for (i = 0; i < conflictsCount && !ourrc; i++) {
if (requirement && strcmp(requirement, conflicts[i])) continue;
- rc = unsatisfiedDepend(rpmdep, conflicts[i], conflictsVersion[i],
+ rc = unsatisfiedDepend(rpmdep, conflicts[i], conflictsEVR[i],
conflictsFlags[i], NULL);
/* 1 == unsatisfied, 0 == satsisfied */
psp->problems[psp->num].byVersion = strdup(version);
psp->problems[psp->num].byRelease = strdup(release);
psp->problems[psp->num].needsName = strdup(conflicts[i]);
- psp->problems[psp->num].needsVersion = strdup(conflictsVersion[i]);
+ psp->problems[psp->num].needsVersion = strdup(conflictsEVR[i]);
psp->problems[psp->num].needsFlags = conflictsFlags[i];
psp->problems[psp->num].sense = RPMDEP_SENSE_CONFLICTS;
psp->problems[psp->num].suggestedPackage = NULL;
}
if (conflictsCount) {
- free(conflictsVersion);
+ free(conflictsEVR);
free(conflicts);
}
if (requiresCount) {
- free(requiresVersion);
+ free(requiresEVR);
free(requires);
}
int satisfyDepends, const char ** errorStack)
{
const char ** requires;
- const char ** requiresVersion;
+ const char ** requiresEVR;
int_32 * requireFlags;
int requiresCount;
int matchNum;
headerGetEntry(package->h, RPMTAG_REQUIREFLAGS, NULL,
(void **) &requireFlags, NULL);
headerGetEntry(package->h, RPMTAG_REQUIREVERSION, NULL,
- (void **) &requiresVersion, NULL);
+ (void **) &requiresEVR, NULL);
for (i = 0; rc == 0 && i < requiresCount; i++) {
if (!(satisfyDepends || (requireFlags[i] & RPMSENSE_PREREQ)))
continue;
match = alSatisfiesDepend(&rpmdep->addedPackages,
- requires[i], requiresVersion[i], requireFlags[i]);
+ requires[i], requiresEVR[i], requireFlags[i]);
/* broken dependencies don't concern us */
if (!match) continue;
}
free(requires);
- free(requiresVersion);
+ free(requiresEVR);
}
/* whew -- add this package */