summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.lclintrc10
-rw-r--r--CHANGES3
-rw-r--r--build.c6
-rwxr-xr-xdb3/configure6
-rw-r--r--lib/.lclintrc10
-rw-r--r--lib/depends.c436
-rw-r--r--lib/depends.h29
-rw-r--r--lib/formats.c23
-rw-r--r--lib/header.c14
-rw-r--r--lib/header.h31
-rw-r--r--lib/md5.h14
-rw-r--r--lib/misc.h12
-rw-r--r--lib/package.c10
-rw-r--r--lib/problems.c14
-rw-r--r--lib/psm.c2
-rw-r--r--lib/rpminstall.c8
-rw-r--r--lib/rpmlib.h184
-rw-r--r--lib/rpmrc.c6
-rw-r--r--lib/signature.c10
-rw-r--r--lib/signature.h9
-rw-r--r--lib/verify.c27
-rw-r--r--python/rpmmodule.c6
-rw-r--r--rpm.spec.in2
-rw-r--r--rpmdb/Makefile.am2
-rw-r--r--rpmdb/db3.c5
-rw-r--r--tools/rpmsort.c2
26 files changed, 560 insertions, 321 deletions
diff --git a/.lclintrc b/.lclintrc
index ab0bbbb6a..17dbf5031 100644
--- a/.lclintrc
+++ b/.lclintrc
@@ -10,6 +10,16 @@
# XXX ignore doxygen markings
-unrecogcomments
+#+mustmod # segfault in psm.c:597
+#+proto-param-match
+
+#-cpp-names
+#-declundef # db3 is noisy
+#-deepbreak # 485 cases
+#-export-local
+#-export-header
+#-export-header-var
+
# don't-bother-me-yet parameters
-branchstate # painful
-mustfree # alloca is painful
diff --git a/CHANGES b/CHANGES
index 8e0213452..f49e3232d 100644
--- a/CHANGES
+++ b/CHANGES
@@ -71,6 +71,9 @@
- fix: popt exec doesn't add '--', --target et al no longer need '='.
- fix: popt consume-next-arg "!#:+" w/o side effect (#41956).
- fix: for busted db1, attempt chain reconnection to following record.
+ - return multiple suggested packages
+ (Pawel Kolodziej <pawelk@pld.org.pl>).
+ - fix: return suggested packages when using Depends cache.
4.0 -> 4.0.[12]
- add doxygen and lclint annotations most everywhere.
diff --git a/build.c b/build.c
index 2f920d328..d7ecc095d 100644
--- a/build.c
+++ b/build.c
@@ -22,7 +22,7 @@ static int checkSpec(Header h)
rpmdb db = NULL;
int mode = O_RDONLY;
rpmTransactionSet ts;
- struct rpmDependencyConflict * conflicts;
+ rpmDependencyConflict conflicts;
int numConflicts;
int rc;
@@ -30,7 +30,7 @@ static int checkSpec(Header h)
return 0;
if (rpmdbOpen(rootdir, &db, mode, 0644)) {
- const char *dn;
+ const char * dn;
dn = rpmGetPath( (rootdir ? rootdir : ""), "%{_dbpath}", NULL);
rpmError(RPMERR_OPEN, _("cannot open rpm database in %s\n"), dn);
dn = _free(dn);
@@ -44,7 +44,7 @@ static int checkSpec(Header h)
if (rc == 0 && conflicts) {
rpmMessage(RPMMESS_ERROR, _("failed build dependencies:\n"));
printDepProblems(stderr, conflicts, numConflicts);
- rpmdepFreeConflicts(conflicts, numConflicts);
+ conflicts = rpmdepFreeConflicts(conflicts, numConflicts);
rc = 1;
}
diff --git a/db3/configure b/db3/configure
index e4782e41d..f1f1ac2df 100755
--- a/db3/configure
+++ b/db3/configure
@@ -9,7 +9,7 @@ ln -sf ../dist $db_dist/../db/dist
ln -sf ../dist $db_dist
CC="$CC" CFLAGS="$CFLAGS" $db_dist/configure \
- `echo $* | sed -e "s% --cache-file=.*$% --enable-shared --enable-static --enable-debug --enable-rpc --with-uniquename=rpmdb --srcdir=$db_dist%"`
+ `echo $* | sed -e "s% --cache-file=.*$% --enable-shared --enable-static --enable-debug --enable-rpc --with-uniquename=_rpmdb --srcdir=$db_dist%"`
# XXX hack to get db-3.3.4 to configure properly
rm -f $db_dist/../db/dist $db_dist/dist
@@ -26,9 +26,9 @@ db3_install: all install_setip \\' > Makefile
mv db.h db.h.orig
cat db.h.orig | sed \
- -e '/^struct __db;/i \
+ -e '/^struct __db;/i\
/*@-incondefs@*/' \
- -e '/^struct __key_range;/a \
+ -e '/^struct __key_range;/a\
/*@=incondefs@*/' > db.h
# Generate manifest for rpmdb.
diff --git a/lib/.lclintrc b/lib/.lclintrc
index 5026ef6d5..978f15600 100644
--- a/lib/.lclintrc
+++ b/lib/.lclintrc
@@ -10,6 +10,16 @@
# XXX ignore doxygen markings
-unrecogcomments
+#+mustmod # segfault in psm.c:597
++proto-param-match
+
+#-cpp-names
+#-declundef # db3 is noisy
+#-deepbreak # 485 cases
+#-export-local
+#-export-header
+#-export-header-var
+
# don't-bother-me-yet parameters
-branchstate # ~140 painful
-mustfree # ~588 alloca is painful
diff --git a/lib/depends.c b/lib/depends.c
index 90809c6a3..5539b8e09 100644
--- a/lib/depends.c
+++ b/lib/depends.c
@@ -20,6 +20,8 @@ int _depends_debug = 0;
/*@access rpmdb@*/ /* XXX compared with NULL */
/*@access rpmdbMatchIterator@*/ /* XXX compared with NULL */
/*@access rpmTransactionSet@*/
+/*@access rpmDependencyConflict@*/
+/*@access availableList@*/
int headerNVR(Header h, const char **np, const char **vp, const char **rp)
{
@@ -50,8 +52,9 @@ int headerNVR(Header h, const char **np, const char **vp, const char **rp)
* @param keyFlags dependency logical range qualifiers
* @return formatted dependency (malloc'ed)
*/
-static /*@only@*/ char *printDepend(const char * depend, const char * key,
- const char * keyEVR, int keyFlags) /*@*/
+static /*@only@*/ char * printDepend(const char * depend, const char * key,
+ const char * keyEVR, int keyFlags)
+ /*@*/
{
char *tbuf, *t;
size_t nb;
@@ -118,8 +121,8 @@ struct orderListIndex {
* Destroy available item index.
* @param al available list
*/
-static void alFreeIndex(struct availableList * al)
- /*@modifies al->index @*/
+static void alFreeIndex(availableList al)
+ /*@modifies al @*/
{
if (al->index.size) {
al->index.index = _free(al->index.index);
@@ -131,8 +134,8 @@ static void alFreeIndex(struct availableList * al)
* Initialize available packckages, items, and directories list.
* @param al available list
*/
-static void alCreate(struct availableList * al)
- /*@modifies *al @*/
+static void alCreate(availableList al)
+ /*@modifies al @*/
{
al->alloced = al->delta;
al->size = 0;
@@ -149,7 +152,8 @@ static void alCreate(struct availableList * al)
* Free available packages, items, and directories members.
* @param al available list
*/
-static void alFree(struct availableList * al)
+static void alFree(availableList al)
+ /*@modifies al @*/
{
HFD_t hfd = headerFreeData;
struct availablePackage * p;
@@ -226,9 +230,11 @@ static int dirInfoCompare(const void * one, const void * two) /*@*/
* @param relocs package file relocations
* @return available package pointer
*/
-static /*@exposed@*/ struct availablePackage * alAddPackage(struct availableList * al,
+static /*@exposed@*/ struct availablePackage *
+alAddPackage(availableList al,
Header h, /*@null@*/ /*@dependent@*/ const void * key,
/*@null@*/ FD_t fd, /*@null@*/ rpmRelocation * relocs)
+ /*@modifies al, h @*/
{
HGE_t hge = (HGE_t)headerGetEntryMinMemory;
HFD_t hfd = headerFreeData;
@@ -410,7 +416,7 @@ static /*@exposed@*/ struct availablePackage * alAddPackage(struct availableList
* @param two 2nd available index entry
* @return result of comparison
*/
-static int indexcmp(const void * one, const void * two)
+static int indexcmp(const void * one, const void * two) /*@*/
{
const struct availableIndexEntry * a = one;
const struct availableIndexEntry * b = two;
@@ -426,8 +432,8 @@ static int indexcmp(const void * one, const void * two)
* Generate index for available list.
* @param al available list
*/
-static void alMakeIndex(struct availableList * al)
- /*@modifies al->index @*/
+static void alMakeIndex(availableList al)
+ /*@modifies al @*/
{
struct availableIndex * ai = &al->index;
int i, j, k;
@@ -470,10 +476,11 @@ static void alMakeIndex(struct availableList * al)
* @retval *vp pointer to version
* @retval *rp pointer to release
*/
-static void parseEVR(char *evr,
- /*@exposed@*/ /*@out@*/ const char **ep,
- /*@exposed@*/ /*@out@*/ const char **vp,
- /*@exposed@*/ /*@out@*/const char **rp) /*@modifies evr,*ep,*vp,*rp @*/
+static void parseEVR(char * evr,
+ /*@exposed@*/ /*@out@*/ const char ** ep,
+ /*@exposed@*/ /*@out@*/ const char ** vp,
+ /*@exposed@*/ /*@out@*/ const char ** rp)
+ /*@modifies *ep, *vp, *rp @*/
{
const char *epoch;
const char *version; /* assume only version is present */
@@ -509,8 +516,8 @@ const char *rpmNAME = PACKAGE;
const char *rpmEVR = VERSION;
int rpmFLAGS = RPMSENSE_EQUAL;
-int rpmRangesOverlap(const char *AName, const char *AEVR, int AFlags,
- const char *BName, const char *BEVR, int BFlags)
+int rpmRangesOverlap(const char * AName, const char * AEVR, int AFlags,
+ const char * BName, const char * BEVR, int BFlags)
{
const char *aDepend = printDepend(NULL, AName, AEVR, AFlags);
const char *bDepend = printDepend(NULL, BName, BEVR, BFlags);
@@ -587,7 +594,9 @@ exit:
typedef int (*dbrecMatch_t) (Header h, const char *reqName, const char * reqEVR, int reqFlags);
-static int rangeMatchesDepFlags (Header h, const char *reqName, const char * reqEVR, int reqFlags)
+static int rangeMatchesDepFlags (Header h,
+ const char * reqName, const char * reqEVR, int reqFlags)
+ /*@*/
{
HGE_t hge = (HGE_t)headerGetEntryMinMemory;
HFD_t hfd = headerFreeData;
@@ -641,7 +650,7 @@ static int rangeMatchesDepFlags (Header h, const char *reqName, const char * req
}
int headerMatchesDepFlags(Header h,
- const char * reqName, const char * reqEVR, int reqFlags)
+ const char * reqName, const char * reqEVR, int reqFlags)
{
HGE_t hge = (HGE_t)headerGetEntryMinMemory;
const char *name, *version, *release;
@@ -722,7 +731,7 @@ rpmTransactionSet rpmtransCreateSet(rpmdb rpmdb, const char * rootDir)
* @param b 2nd instance address
* @return result of comparison
*/
-static int intcmp(const void * a, const void *b)
+static int intcmp(const void * a, const void * b) /*@*/
{
const int * aptr = a;
const int * bptr = b;
@@ -903,11 +912,12 @@ void rpmtransFree(rpmTransactionSet ts)
ts = _free(ts);
}
-void rpmdepFreeConflicts(struct rpmDependencyConflict * conflicts,
- int numConflicts)
+rpmDependencyConflict rpmdepFreeConflicts(rpmDependencyConflict conflicts,
+ int numConflicts)
{
int i;
+ if (conflicts)
for (i = 0; i < numConflicts; i++) {
conflicts[i].byHeader = headerFree(conflicts[i].byHeader);
conflicts[i].byName = _free(conflicts[i].byName);
@@ -915,37 +925,40 @@ void rpmdepFreeConflicts(struct rpmDependencyConflict * conflicts,
conflicts[i].byRelease = _free(conflicts[i].byRelease);
conflicts[i].needsName = _free(conflicts[i].needsName);
conflicts[i].needsVersion = _free(conflicts[i].needsVersion);
+ conflicts[i].suggestedPackages = _free(conflicts[i].suggestedPackages);
}
- conflicts = _free(conflicts);
+ return (conflicts = _free(conflicts));
}
/**
- * Check added package file lists for a file.
+ * Check added package file lists for package(s) that provide a file.
* @param al available list
* @param keyType type of dependency
* @param fileName file name to search for
* @return available package pointer
*/
-/*@dependent@*/ /*@null@*/ static struct availablePackage *
-alFileSatisfiesDepend(struct availableList * al,
- const char * keyType, const char * fileName)
+static /*@only@*/ /*@null@*/ struct availablePackage **
+alAllFileSatisfiesDepend(const availableList al,
+ const char * keyType, const char * fileName)
+ /*@*/
{
- int i;
+ int i, found;
const char * dirName;
const char * baseName;
struct dirInfo_s dirNeedle;
dirInfo dirMatch;
+ struct availablePackage ** ret;
/* Solaris 2.6 bsearch sucks down on this. */
if (al->numDirs == 0 || al->dirs == NULL || al->list == NULL)
return NULL;
- { char * chptr = xstrdup(fileName);
- dirName = chptr;
- if ((chptr = strrchr(chptr, '/')) != NULL) {
- chptr++; /* leave the trailing '/' */
- *chptr = '\0';
+ { char * t;
+ dirName = t = xstrdup(fileName);
+ if ((t = strrchr(t, '/')) != NULL) {
+ t++; /* leave the trailing '/' */
+ *t = '\0';
}
}
@@ -953,36 +966,83 @@ alFileSatisfiesDepend(struct availableList * al,
dirNeedle.dirNameLen = strlen(dirName);
dirMatch = bsearch(&dirNeedle, al->dirs, al->numDirs,
sizeof(dirNeedle), dirInfoCompare);
- dirName = _free(dirName);
- if (dirMatch == NULL) return NULL;
+ if (dirMatch == NULL) {
+ dirName = _free(dirName);
+ return NULL;
+ }
- baseName = strrchr(fileName, '/') + 1;
+ /* rewind to the first match */
+ while (dirMatch > al->dirs && dirInfoCompare(dirMatch-1, &dirNeedle) == 0)
+ dirMatch--;
- /* XXX FIXME: these file lists should be sorted and bsearched */
- for (i = 0; i < dirMatch->numFiles; i++) {
- if (dirMatch->files[i].baseName == NULL ||
- strcmp(dirMatch->files[i].baseName, baseName))
- continue;
+ baseName = strrchr(fileName, '/') + 1;
- /*
- * If a file dependency would be satisfied by a file
- * we are not going to install, skip it.
- */
- if (al->list[dirMatch->files[i].pkgNum].multiLib &&
- !isFileMULTILIB(dirMatch->files[i].fileFlags))
- continue;
+ for (found = 0, ret = NULL;
+ dirMatch <= al->dirs + al->numDirs &&
+ dirInfoCompare(dirMatch, &dirNeedle) == 0;
+ dirMatch++)
+ {
+ /* XXX FIXME: these file lists should be sorted and bsearched */
+ for (i = 0; i < dirMatch->numFiles; i++) {
+ if (dirMatch->files[i].baseName == NULL ||
+ strcmp(dirMatch->files[i].baseName, baseName))
+ continue;
- if (keyType)
- rpmMessage(RPMMESS_DEBUG, _("%s: %-45s YES (added files)\n"),
- keyType, fileName);
- return al->list + dirMatch->files[i].pkgNum;
+ /*
+ * If a file dependency would be satisfied by a file
+ * we are not going to install, skip it.
+ */
+ if (al->list[dirMatch->files[i].pkgNum].multiLib &&
+ !isFileMULTILIB(dirMatch->files[i].fileFlags))
+ continue;
+
+ if (keyType)
+ rpmMessage(RPMMESS_DEBUG, _("%s: %-45s YES (added files)\n"),
+ keyType, fileName);
+
+ ret = xrealloc(ret, (found+2) * sizeof(*ret));
+ if (ret) /* can't happen */
+ ret[found++] = al->list + dirMatch->files[i].pkgNum;
+ break;
+ }
}
+ dirName = _free(dirName);
+ /*@-mods@*/ /* FIX: al->list might be modified. */
+ if (ret)
+ ret[found] = NULL;
+ /*@=mods@*/
+ return ret;
+}
+
+#ifdef DYING
+/**
+ * Check added package file lists for first package that provides a file.
+ * @param al available list
+ * @param keyType type of dependency
+ * @param fileName file name to search for
+ * @return available package pointer
+ */
+/*@unused@*/ static /*@dependent@*/ /*@null@*/ struct availablePackage *
+alFileSatisfiesDepend(const availableList al,
+ const char * keyType, const char * fileName)
+ /*@*/
+{
+ struct availablePackage * ret;
+ struct availablePackage ** tmp =
+ alAllFileSatisfiesDepend(al, keyType, fileName);
+
+ if (tmp) {
+ ret = tmp[0];
+ tmp = _free(tmp);
+ return ret;
+ }
return NULL;
}
+#endif /* DYING */
/**
- * Check added package file lists for a provide.
+ * Check added package file lists for package(s) that have a provide.
* @param al available list
* @param keyType type of dependency
* @param keyDepend dependency string representation
@@ -991,17 +1051,18 @@ alFileSatisfiesDepend(struct availableList * al,
* @param keyFlags dependency logical range qualifiers
* @return available package pointer
*/
-/*@dependent@*/ /*@null@*/ static struct availablePackage * alSatisfiesDepend(
- struct availableList * al,
- const char * keyType, const char * keyDepend,
- const char * keyName, const char * keyEVR, int keyFlags)
+static /*@only@*/ /*@null@*/ struct availablePackage **
+alAllSatisfiesDepend(const availableList al,
+ const char * keyType, const char * keyDepend,
+ const char * keyName, const char * keyEVR, int keyFlags)
+ /*@*/
{
struct availableIndexEntry needle, * match;
- struct availablePackage * p;
- int i, rc;
+ struct availablePackage * p, ** ret = NULL;
+ int i, rc, found;
if (*keyName == '/')
- return alFileSatisfiesDepend(al, keyType, keyName);
+ return alAllFileSatisfiesDepend(al, keyType, keyName);
if (!al->index.size || al->index.index == NULL) return NULL;
@@ -1012,51 +1073,99 @@ alFileSatisfiesDepend(struct availableList * al,
if (match == NULL) return NULL;
- p = match->package;
- rc = 0;
- switch (match->type) {
- case IET_PROVIDES:
- for (i = 0; i < p->providesCount; i++) {
- const char *proEVR;
- int proFlags;
-
- /* Filter out provides that came along for the ride. */
- if (strcmp(p->provides[i], keyName))
- continue;
+ /* rewind to the first match */
+ while (match > al->index.index && indexcmp(match-1,&needle) == 0)
+ match--;
+
+ for (ret = NULL, found = 0;
+ match <= al->index.index + al->index.size &&
+ indexcmp(match,&needle) == 0;
+ match++)
+ {
+
+ p = match->package;
+ rc = 0;
+ switch (match->type) {
+ case IET_PROVIDES:
+ for (i = 0; i < p->providesCount; i++) {
+ const char * proEVR;
+ int proFlags;
+
+ /* Filter out provides that came along for the ride. */
+ if (strcmp(p->provides[i], keyName))
+ continue;
+
+ proEVR = (p->providesEVR ? p->providesEVR[i] : NULL);
+ proFlags = (p->provideFlags ? p->provideFlags[i] : 0);
+ rc = rpmRangesOverlap(p->provides[i], proEVR, proFlags,
+ keyName, keyEVR, keyFlags);
+ if (rc) break;
+ }
+ if (keyType && keyDepend && rc)
+ rpmMessage(RPMMESS_DEBUG, _("%s: %-45s YES (added provide)\n"),
+ keyType, keyDepend+2);
+ break;
+ }
- proEVR = (p->providesEVR ? p->providesEVR[i] : NULL);
- proFlags = (p->provideFlags ? p->provideFlags[i] : 0);
- rc = rpmRangesOverlap(p->provides[i], proEVR, proFlags,
- keyName, keyEVR, keyFlags);
- if (rc) break;
+ if (rc) {
+ ret = xrealloc(ret, (found + 2) * sizeof(*ret));
+ if (ret) /* can't happen */
+ ret[found++] = p;
}
- if (keyType && keyDepend && rc)
- rpmMessage(RPMMESS_DEBUG, _("%s: %-45s YES (added provide)\n"),
- keyType, keyDepend+2);
- break;
}
- if (rc)
- return p;
+ if (ret)
+ ret[found] = NULL;
- return NULL;
+ return ret;
}
/**
+ * Check added package file lists for first package that has a provide.
+ * @todo Eliminate.
+ * @param al available list
+ * @param keyType type of dependency
+ * @param keyDepend dependency string representation
+ * @param keyName dependency name string
+ * @param keyEVR dependency [epoch:]version[-release] string
+ * @param keyFlags dependency logical range qualifiers
+ * @return available package pointer
+ */
+static inline /*@only@*/ /*@null@*/ struct availablePackage *
+alSatisfiesDepend(const availableList al,
+ const char * keyType, const char * keyDepend,
+ const char * keyName, const char * keyEVR, int keyFlags)
+ /*@*/
+{
+ struct availablePackage * ret;
+ struct availablePackage ** tmp =
+ alAllSatisfiesDepend(al, keyType, keyDepend, keyName, keyEVR, keyFlags);
+
+ if (tmp) {
+ ret = tmp[0];
+ tmp = _free(tmp);
+ return ret;
+ }
+ return NULL;
+ }
+
+/**
* Check key for an unsatisfied dependency.
+ * @todo Eliminate rpmrc provides.
* @param al available list
* @param keyType type of dependency
* @param keyDepend dependency string representation
* @param keyName dependency name string
* @param keyEVR dependency [epoch:]version[-release] string
* @param keyFlags dependency logical range qualifiers
- * @retval suggestion possible package to resolve dependency
+ * @retval suggestion possible package(s) to resolve dependency
* @return 0 if satisfied, 1 if not satisfied, 2 if error
*/
static int unsatisfiedDepend(rpmTransactionSet ts,
- const char * keyType, const char * keyDepend,
- const char * keyName, const char * keyEVR, int keyFlags,
- /*@out@*/ struct availablePackage ** suggestion)
+ const char * keyType, const char * keyDepend,
+ const char * keyName, const char * keyEVR, int keyFlags,
+ /*@null@*/ /*@out@*/ struct availablePackage *** suggestion)
+ /*@modifies *suggestion @*/
{
static int _cacheDependsRC = 1;
rpmdbMatchIterator mi;
@@ -1086,6 +1195,11 @@ static int unsatisfiedDepend(rpmTransactionSet ts,
rpmMessage(RPMMESS_DEBUG, _("%s: %-45s %-s (cached)\n"),
keyType, keyDepend, (rc ? _("NO ") : _("YES")));
xx = dbiCclose(dbi, NULL, 0);
+
+ if (suggestion && rc == 1)
+ *suggestion = alAllSatisfiesDepend(&ts->availablePackages,
+ NULL, NULL, keyName, keyEVR, keyFlags);
+
return rc;
}
xx = dbiCclose(dbi, dbcursor, 0);
@@ -1131,7 +1245,9 @@ static int unsatisfiedDepend(rpmTransactionSet ts,
goto unsatisfied;
}
- if (alSatisfiesDepend(&ts->addedPackages, keyType, keyDepend, keyName, keyEVR, keyFlags)) {
+ if (alSatisfiesDepend(&ts->addedPackages, keyType, keyDepend,
+ keyName, keyEVR, keyFlags))
+ {
goto exit;
}
@@ -1167,7 +1283,7 @@ static int unsatisfiedDepend(rpmTransactionSet ts,
}
mi = rpmdbFreeIterator(mi);
-#ifndef DYING
+#ifdef DYING
mi = rpmdbInitIterator(ts->rpmdb, RPMTAG_NAME, keyName, 0);
(void) rpmdbPruneIterator(mi,
ts->removedPackages, ts->numRemovedPackages, 1);
@@ -1185,10 +1301,8 @@ static int unsatisfiedDepend(rpmTransactionSet ts,
}
if (suggestion)
- /*@-dependenttrans@*/
- *suggestion = alSatisfiesDepend(&ts->availablePackages, NULL, NULL,
+ *suggestion = alAllSatisfiesDepend(&ts->availablePackages, NULL, NULL,
keyName, keyEVR, keyFlags);
- /*@=dependenttrans@*/
unsatisfied:
rpmMessage(RPMMESS_DEBUG, _("%s: %-45s NO\n"), keyType, keyDepend+2);
@@ -1220,8 +1334,18 @@ exit:
return rc;
}
-static int checkPackageDeps(rpmTransactionSet ts, struct problemsSet * psp,
+/**
+ * Check header requires/conflicts against against installed+added packages.
+ * @param ts transaction set
+ * @param psp dependency problems
+ * @param h header to check
+ * @param keyName dependency name
+ * @param multiLib skip multilib colored dependencies?
+ * @return 0 no problems found
+ */
+static int checkPackageDeps(rpmTransactionSet ts, problemsSet psp,
Header h, const char * keyName, uint_32 multiLib)
+ /*@modifies h, psp */
{
HGE_t hge = (HGE_t)headerGetEntryMinMemory;
HFD_t hfd = headerFreeData;
@@ -1239,7 +1363,7 @@ static int checkPackageDeps(rpmTransactionSet ts, struct problemsSet * psp,
int type;
int i, rc;
int ourrc = 0;
- struct availablePackage * suggestion;
+ struct availablePackage ** suggestion;
(void) headerNVR(h, &name, &version, &release);
@@ -1290,10 +1414,25 @@ static int checkPackageDeps(rpmTransactionSet ts, struct problemsSet * psp,
psp->problems[psp->num].needsFlags = requireFlags[i];
psp->problems[psp->num].sense = RPMDEP_SENSE_REQUIRES;
- if (suggestion)
- psp->problems[psp->num].suggestedPackage = suggestion->key;
- else
- psp->problems[psp->num].suggestedPackage = NULL;
+ if (suggestion) {
+ int j;
+ for (j = 0; suggestion[j]; j++)
+ ;
+ psp->problems[psp->num].suggestedPackages =
+ xmalloc( (j + 1) * sizeof(void *) );
+ for (j = 0; suggestion[j]; j++)
+ psp->problems[psp->num].suggestedPackages[j]
+ = suggestion[j]->key;
+ psp->problems[psp->num].suggestedPackages[j] = NULL;
+#ifdef DYING
+ psp->problems[psp->num].suggestedPackage = suggestion[0]->key;
+#endif
+ } else {
+ psp->problems[psp->num].suggestedPackages = NULL;
+#ifdef DYING
+ psp->problems[psp->num].suggestedPackage = NULL;
+#endif
+ }
psp->num++;
break;
@@ -1357,7 +1496,10 @@ static int checkPackageDeps(rpmTransactionSet ts, struct problemsSet * psp,
psp->problems[psp->num].needsVersion = xstrdup(conflictsEVR[i]);
psp->problems[psp->num].needsFlags = conflictFlags[i];
psp->problems[psp->num].sense = RPMDEP_SENSE_CONFLICTS;
+ psp->problems[psp->num].suggestedPackages = NULL;
+#ifdef DYING
psp->problems[psp->num].suggestedPackage = NULL;
+#endif
psp->num++;
break;
@@ -1380,11 +1522,18 @@ static int checkPackageDeps(rpmTransactionSet ts, struct problemsSet * psp,
}
/**
+ * Check dependency against installed packages.
* Adding: check name/provides key against each conflict match,
* Erasing: check name/provides/filename key against each requiredby match.
+ * @param ts transaction set
+ * @param psp dependency problems
+ * @param key dependency name
+ * @param mi rpm database iterator
+ * @return 0 no problems found
*/
-static int checkPackageSet(rpmTransactionSet ts, struct problemsSet * psp,
- const char * key, /*@only@*/ /*@null@*/ rpmdbMatchIterator mi)
+static int checkPackageSet(rpmTransactionSet ts, problemsSet psp,
+ const char * key, /*@only@*/ /*@null@*/ rpmdbMatchIterator mi)
+ /*@modifies mi, psp @*/
{
Header h;
int rc = 0;
@@ -1404,9 +1553,14 @@ static int checkPackageSet(rpmTransactionSet ts, struct problemsSet * psp,
/**
* Erasing: check name/provides/filename key against requiredby matches.
+ * @param ts transaction set
+ * @param psp dependency problems
+ * @param key requires name
+ * @return 0 no problems found
*/
static int checkDependentPackages(rpmTransactionSet ts,
- struct problemsSet * psp, const char * key)
+ problemsSet psp, const char * key)
+ /*@modifies psp @*/
{
rpmdbMatchIterator mi;
mi = rpmdbInitIterator(ts->rpmdb, RPMTAG_REQUIRENAME, key, 0);
@@ -1415,9 +1569,14 @@ static int checkDependentPackages(rpmTransactionSet ts,
/**
* Adding: check name/provides key against conflicts matches.
+ * @param ts transaction set
+ * @param psp dependency problems
+ * @param key conflicts name
+ * @return 0 no problems found
*/
static int checkDependentConflicts(rpmTransactionSet ts,
- struct problemsSet * psp, const char * key)
+ problemsSet psp, const char * key)
+ /*@modifies psp @*/
{
int rc = 0;
@@ -1463,7 +1622,9 @@ static struct badDeps_s {
{ NULL, NULL }
};
-static int ignoreDep(struct availablePackage * p, struct availablePackage * q)
+static int ignoreDep(const struct availablePackage * p,
+ const struct availablePackage * q)
+ /*@*/
{
struct badDeps_s *bdp;
@@ -1481,6 +1642,7 @@ static int ignoreDep(struct availablePackage * p, struct availablePackage * q)
* @param q predecessor
*/
static void markLoop(struct tsortInfo * tsi, struct availablePackage * q)
+ /*@modifies *tsi @*/
{
struct availablePackage * p;
@@ -1494,7 +1656,8 @@ static void markLoop(struct tsortInfo * tsi, struct availablePackage * q)
}
}
-static inline /*@observer@*/ const char * const identifyDepend(int_32 f) {
+static inline /*@observer@*/ const char * const identifyDepend(int_32 f)
+{
if (isLegacyPreReq(f))
return "PreReq:";
f = _notpre(f);
@@ -1526,7 +1689,8 @@ static inline /*@observer@*/ const char * const identifyDepend(int_32 f) {
*/
static /*@owned@*/ /*@null@*/ const char *
zapRelation(struct availablePackage * q, struct availablePackage * p,
- int zap, int * nzaps)
+ int zap, /*@in@*/ /*@out@*/ int * nzaps)
+ /*@modifies q, p, *nzaps @*/
{
struct tsortInfo * tsi_prev;
struct tsortInfo * tsi;
@@ -1552,21 +1716,14 @@ zapRelation(struct availablePackage * q, struct availablePackage * p,
p->requires[j], p->requiresEVR[j], p->requireFlags[j]);
/*
- * XXX Attempt to unravel a dependency loop by eliminating PreReq's.
- * This hack "works" for the (relatively) more important autogenerated
- * Requires: lib*.so.*
- * but may cause package %pre/%post scriptlets with, for example,
- * PreReq: /bin/sh
- * to fail.
+ * Attempt to unravel a dependency loop by eliminating Requires's.
*/
if (zap && !(p->requireFlags[j] & RPMSENSE_PREREQ)) {
rpmMessage(RPMMESS_WARNING,
_("removing %s-%s-%s \"%s\" from tsort relations.\n"),
p->name, p->version, p->release, dp);
p->tsi.tsi_count--;
- /*@-nullderef@*/
- tsi_prev->tsi_next = tsi->tsi_next;
- /*@=nullderef@*/
+ if (tsi_prev) tsi_prev->tsi_next = tsi->tsi_next;
tsi->tsi_next = NULL;
tsi->tsi_suc = NULL;
tsi = _free(tsi);
@@ -1591,12 +1748,15 @@ zapRelation(struct availablePackage * q, struct availablePackage * p,
*/
static inline int addRelation( const rpmTransactionSet ts,
struct availablePackage * p, unsigned char * selected, int j)
+ /*@modifies p->tsi.tsi_u.count, p->depth, *selected @*/
{
struct availablePackage * q;
struct tsortInfo * tsi;
int matchNum;
- /*@-nullderef@*/
+ if (!p->requires || !p->requiresEVR || !p->requireFlags)
+ return 0;
+
q = alSatisfiesDepend(&ts->addedPackages, NULL, NULL,
p->requires[j], p->requiresEVR[j], p->requireFlags[j]);
@@ -1607,7 +1767,6 @@ static inline int addRelation( const rpmTransactionSet ts,
/* Avoid rpmlib feature dependencies. */
if (!strncmp(p->requires[j], "rpmlib(", sizeof("rpmlib(")-1))
return 0;
- /*@=nullderef@*/
#if defined(DEPENDENCY_WHITEOUT)
/* Avoid certain dependency relations. */
@@ -1642,7 +1801,7 @@ static inline int addRelation( const rpmTransactionSet ts,
* @param b 2nd ordered list entry
* @return result of comparison
*/
-static int orderListIndexCmp(const void * one, const void * two)
+static int orderListIndexCmp(const void * one, const void * two) /*@*/
{
int a = ((const struct orderListIndex *)one)->alIndex;
int b = ((const struct orderListIndex *)two)->alIndex;
@@ -1655,9 +1814,10 @@ static int orderListIndexCmp(const void * one, const void * two)
* @retval qp address of first element
* @retval rp address of last element
*/
-static void addQ(/*@kept@*/ struct availablePackage * p,
- /*@in@*/ /*@out@*/ struct availablePackage ** qp,
- /*@in@*/ /*@out@*/ struct availablePackage ** rp)
+static void addQ(struct availablePackage * p,
+ /*@in@*/ /*@out@*/ struct availablePackage ** qp,
+ /*@in@*/ /*@out@*/ struct availablePackage ** rp)
+ /*@modifies p->tsi, *qp, *rp @*/
{
struct availablePackage *q, *qprev;
@@ -1782,9 +1942,7 @@ rescan:
if (p->tsi.tsi_count != 0)
continue;
p->tsi.tsi_suc = NULL;
- /*@-ownedtrans@*/
addQ(p, &q, &r);
- /*@=ownedtrans@*/
qlen++;
}
@@ -1809,7 +1967,7 @@ rescan:
if (p && (--p->tsi.tsi_count) <= 0) {
/* XXX FIXME: add control bit. */
p->tsi.tsi_suc = NULL;
- /*@-nullstate@*/
+ /*@-nullstate@*/ /* FIX: q->tsi.tsi_u.suc may be NULL */
addQ(p, &q->tsi.tsi_suc, &r);
/*@=nullstate@*/
qlen++;
@@ -1961,7 +2119,7 @@ rescan:
}
int rpmdepCheck(rpmTransactionSet ts,
- struct rpmDependencyConflict ** conflicts, int * numConflicts)
+ rpmDependencyConflict * conflicts, int * numConflicts)
{
HGE_t hge = (HGE_t)headerGetEntryMinMemory;
HFD_t hfd = headerFreeData;
@@ -1971,11 +2129,11 @@ int rpmdepCheck(rpmTransactionSet ts,
int rc;
rpmdbMatchIterator mi = NULL;
Header h = NULL;
- struct problemsSet ps;
+ problemsSet ps = alloca(sizeof(*ps));
- ps.alloced = 5;
- ps.num = 0;
- ps.problems = xcalloc(ps.alloced, sizeof(struct rpmDependencyConflict));
+ ps->alloced = 5;
+ ps->num = 0;
+ ps->problems = xcalloc(ps->alloced, sizeof(*ps->problems));
*conflicts = NULL;
*numConflicts = 0;
@@ -1993,12 +2151,12 @@ int rpmdepCheck(rpmTransactionSet ts,
rpmMessage(RPMMESS_DEBUG, ("========== +++ %s-%s-%s\n"),
p->name, p->version, p->release);
- rc = checkPackageDeps(ts, &ps, p->h, NULL, p->multiLib);
+ rc = checkPackageDeps(ts, ps, p->h, NULL, p->multiLib);
if (rc)
goto exit;
/* Adding: check name against conflicts matches. */
- rc = checkDependentConflicts(ts, &ps, p->name);
+ rc = checkDependentConflicts(ts, ps, p->name);
if (rc)
goto exit;
@@ -2008,7 +2166,7 @@ int rpmdepCheck(rpmTransactionSet ts,
rc = 0;
for (j = 0; j < p->providesCount; j++) {
/* Adding: check provides key against conflicts matches. */
- if (!checkDependentConflicts(ts, &ps, p->provides[j]))
+ if (!checkDependentConflicts(ts, ps, p->provides[j]))
continue;
rc = 1;
break;
@@ -2032,7 +2190,7 @@ int rpmdepCheck(rpmTransactionSet ts,
name, version, release);
/* Erasing: check name against requiredby matches. */
- rc = checkDependentPackages(ts, &ps, name);
+ rc = checkDependentPackages(ts, ps, name);
if (rc)
goto exit;
}
@@ -2047,7 +2205,7 @@ int rpmdepCheck(rpmTransactionSet ts,
rc = 0;
for (j = 0; j < providesCount; j++) {
/* Erasing: check provides against requiredby matches. */
- if (!checkDependentPackages(ts, &ps, provides[j]))
+ if (!checkDependentPackages(ts, ps, provides[j]))
continue;
rc = 1;
break;
@@ -2081,7 +2239,7 @@ int rpmdepCheck(rpmTransactionSet ts,
*fileName = '\0';
(void) stpcpy( stpcpy(fileName, dirNames[dirIndexes[j]]) , baseNames[j]);
/* Erasing: check filename against requiredby matches. */
- if (!checkDependentPackages(ts, &ps, fileName))
+ if (!checkDependentPackages(ts, ps, fileName))
continue;
rc = 1;
break;
@@ -2099,15 +2257,15 @@ int rpmdepCheck(rpmTransactionSet ts,
mi = rpmdbFreeIterator(mi);
}
- if (ps.num) {
- *conflicts = ps.problems;
- ps.problems = NULL;
- *numConflicts = ps.num;
+ if (ps->num) {
+ *conflicts = ps->problems;
+ ps->problems = NULL;
+ *numConflicts = ps->num;
}
rc = 0;
exit:
mi = rpmdbFreeIterator(mi);
- ps.problems = _free(ps.problems);
+ ps->problems = _free(ps->problems);
return rc;
}
diff --git a/lib/depends.h b/lib/depends.h
index fd59c78dc..5a8e2c880 100644
--- a/lib/depends.h
+++ b/lib/depends.h
@@ -14,12 +14,12 @@
struct tsortInfo {
union {
int count;
- /*@kept@*//*@null@*/ struct availablePackage * suc;
+ /*@kept@*/ /*@null@*/ struct availablePackage * suc;
} tsi_u;
#define tsi_count tsi_u.count
#define tsi_suc tsi_u.suc
-/*@owned@*//*@null@*/ struct tsortInfo * tsi_next;
-/*@kept@*//*@null@*/ struct availablePackage * tsi_pkg;
+/*@owned@*/ /*@null@*/ struct tsortInfo * tsi_next;
+/*@kept@*/ /*@null@*/ struct availablePackage * tsi_pkg;
int tsi_reqx;
int tsi_qcnt;
} ;
@@ -94,7 +94,7 @@ typedef struct dirInfo_s {
/** \ingroup rpmdep
* Set of available packages, items, and directories.
*/
-struct availableList {
+typedef /*@abstract@*/ struct availableList_s {
/*@owned@*/ /*@null@*/ struct availablePackage * list; /*!< Set of packages. */
struct availableIndex index; /*!< Set of available items. */
int delta; /*!< Delta for pkg list reallocation. */
@@ -102,7 +102,7 @@ struct availableList {
int alloced; /*!< No. of pkgs allocated for list. */
int numDirs; /*!< No. of directories. */
/*@owned@*/ /*@null@*/ dirInfo dirs; /*!< Set of directories. */
-} ;
+} * availableList;
/** \ingroup rpmdep
* A single package instance to be installed/removed atomically.
@@ -126,8 +126,9 @@ struct transactionElement {
*/
struct rpmTransactionSet_s {
rpmtransFlags transFlags; /*!< Bit(s) to control operation. */
- rpmCallbackFunction notify; /*!< Callback function. */
-/*@observer@*/ rpmCallbackData notifyData;/*!< Callback private data. */
+/*@null@*/ rpmCallbackFunction notify; /*!< Callback function. */
+/*@observer@*/ /*@null@*/ rpmCallbackData notifyData;
+ /*!< Callback private data. */
/*@dependent@*/ rpmProblemSet probs; /*!< Current problems in transaction. */
rpmprobFilterFlags ignoreSet; /*!< Bits to filter current problems. */
int filesystemCount; /*!< No. of mounted filesystems. */
@@ -137,8 +138,9 @@ struct rpmTransactionSet_s {
/*@only@*/ int * removedPackages; /*!< Set of packages being removed. */
int numRemovedPackages; /*!< No. removed rpmdb instances. */
int allocedRemovedPackages; /*!< Size of removed packages array. */
- struct availableList addedPackages; /*!< Set of packages being installed. */
- struct availableList availablePackages;
+ struct availableList_s addedPackages;
+ /*!< Set of packages being installed. */
+ struct availableList_s availablePackages;
/*!< Universe of possible packages. */
/*@only@*/ struct transactionElement * order;
/*!< Packages sorted by dependencies. */
@@ -157,11 +159,11 @@ struct rpmTransactionSet_s {
/** \ingroup rpmdep
* Problems encountered while checking dependencies.
*/
-struct problemsSet {
- struct rpmDependencyConflict * problems; /*!< Problems encountered. */
+typedef /*@abstract@*/ struct problemsSet_s {
+ rpmDependencyConflict problems; /*!< Problems encountered. */
int num; /*!< No. of problems found. */
int alloced; /*!< No. of problems allocated. */
-} ;
+} * problemsSet;
#ifdef __cplusplus
extern "C" {
@@ -178,7 +180,8 @@ extern "C" {
* @return 1 if dependency overlaps, 0 otherwise
*/
int headerMatchesDepFlags(Header h,
- const char *reqName, const char * reqEVR, int reqFlags);
+ const char * reqName, const char * reqEVR, int reqFlags)
+ /*@*/;
#ifdef __cplusplus
}
diff --git a/lib/formats.c b/lib/formats.c
index 018d2c59d..7a920743c 100644
--- a/lib/formats.c
+++ b/lib/formats.c
@@ -175,10 +175,11 @@ static int fsnamesTag( /*@unused@*/ Header h, /*@out@*/ int_32 * type,
* @retval freedata address of data-was-malloc'ed indicator
* @return 0 on success
*/
-static int instprefixTag(Header h, /*@out@*/ int_32 * type,
- /*@out@*/ const void ** data, /*@out@*/ int_32 * count,
- /*@out@*/ int * freeData)
- /*@modifies h, *type, *data, *count, *freeData @*/
+static int instprefixTag(Header h, /*@null@*/ /*@out@*/ int_32 * type,
+ /*@null@*/ /*@out@*/ const void ** data,
+ /*@null@*/ /*@out@*/ int_32 * count,
+ /*@null@*/ /*@out@*/ int * freeData)
+ /*@modifies *type, *data, *count, *freeData @*/
{
HGE_t hge = (HGE_t)headerGetEntryMinMemory;
HFD_t hfd = headerFreeData;
@@ -186,12 +187,12 @@ static int instprefixTag(Header h, /*@out@*/ int_32 * type,
char ** array;
if (hge(h, RPMTAG_INSTALLPREFIX, type, (void **)data, count)) {
- *freeData = 0;
+ if (freeData) *freeData = 0;
return 0;
} else if (hge(h, RPMTAG_INSTPREFIXES, &ipt, (void **) &array, count)) {
- *data = xstrdup(array[0]);
- *freeData = 1;
- *type = RPM_STRING_TYPE;
+ if (data) *data = xstrdup(array[0]);
+ if (freeData) *freeData = 1;
+ if (type) *type = RPM_STRING_TYPE;
array = hfd(array, ipt);
return 0;
}
@@ -417,7 +418,7 @@ static char * _macro_i18ndomains = "%{?_i18ndomains:%{_i18ndomains}}";
static int i18nTag(Header h, int_32 tag, /*@out@*/ int_32 * type,
/*@out@*/ const void ** data, /*@out@*/ int_32 * count,
/*@out@*/ int * freeData)
- /*@modifies h, *type, *data, *count, *freeData @*/
+ /*@modifies *type, *data, *count, *freeData @*/
{
HGE_t hge = (HGE_t)headerGetEntryMinMemory;
char * dstring = rpmExpand(_macro_i18ndomains, NULL);
@@ -501,7 +502,7 @@ static int i18nTag(Header h, int_32 tag, /*@out@*/ int_32 * type,
static int summaryTag(Header h, /*@out@*/ int_32 * type,
/*@out@*/ const void ** data, /*@out@*/ int_32 * count,
/*@out@*/ int * freeData)
- /*@modifies h, *type, *data, *count, *freeData @*/
+ /*@modifies *type, *data, *count, *freeData @*/
{
return i18nTag(h, RPMTAG_SUMMARY, type, data, count, freeData);
}
@@ -517,7 +518,7 @@ static int summaryTag(Header h, /*@out@*/ int_32 * type,
static int descriptionTag(Header h, /*@out@*/ int_32 * type,
/*@out@*/ const void ** data, /*@out@*/ int_32 * count,
/*@out@*/ int * freeData)
- /*@modifies h, *type, *data, *count, *freeData @*/
+ /*@modifies *type, *data, *count, *freeData @*/
{
return i18nTag(h, RPMTAG_DESCRIPTION, type, data, count, freeData);
}
diff --git a/lib/header.c b/lib/header.c
index a35c71959..8cb2c8aed 100644
--- a/lib/header.c
+++ b/lib/header.c
@@ -428,10 +428,10 @@ HeaderIterator headerInitIterator(Header h)
return hi;
}
-void headerFreeIterator(HeaderIterator iter)
+void headerFreeIterator(HeaderIterator hi)
{
- iter->h = headerFree(iter->h);
- iter = _free(iter);
+ hi->h = headerFree(hi->h);
+ hi = _free(hi);
}
int headerNextIterator(HeaderIterator hi,
@@ -2398,7 +2398,7 @@ static int getExtension(Header h, headerTagTagFunction fn,
static char * formatValue(struct sprintfTag * tag, Header h,
const struct headerSprintfExtension * extensions,
struct extensionCache * extCache, int element)
- /*@modifies h, extCache->avail @*/
+ /*@modifies extCache->avail @*/
{
int len;
char buf[20];
@@ -2680,7 +2680,7 @@ static void freeExtensionCache(const struct headerSprintfExtension * extensions,
cache = _free(cache);
}
-char * headerSprintf(Header h, const char * origFmt,
+char * headerSprintf(Header h, const char * fmt,
const struct headerTagTableEntry * tags,
const struct headerSprintfExtension * extensions,
errmsg_t * errmsg)
@@ -2694,8 +2694,8 @@ char * headerSprintf(Header h, const char * origFmt,
int i;
struct extensionCache * extCache;
- /*fmtString = escapeString(origFmt);*/
- fmtString = xstrdup(origFmt);
+ /*fmtString = escapeString(fmt);*/
+ fmtString = xstrdup(fmt);
if (parseFormat(fmtString, tags, extensions, &format, &numTokens,
NULL, PARSER_BEGIN, errmsg)) {
diff --git a/lib/header.h b/lib/header.h
index e3145dc75..15a3178b1 100644
--- a/lib/header.h
+++ b/lib/header.h
@@ -205,24 +205,24 @@ unsigned int headerSizeof(/*@null@*/ Header h, enum hMagic magicp)
/** \ingroup header
* Convert header to in-memory representation.
- * @param p on-disk header (with offsets)
+ * @param uh on-disk header blob (i.e. with offsets)
* @return header
*/
/*@-exportlocal@*/
-/*@null@*/ Header headerLoad(/*@kept@*/ void * p) /*@*/;
+/*@null@*/ Header headerLoad(/*@kept@*/ void * uh) /*@*/;
/*@=exportlocal@*/
/** \ingroup header
* Make a copy and convert header to in-memory representation.
- * @param p on-disk header (with offsets)
+ * @param uh on-disk header blob (i.e. with offsets)
* @return header
*/
-/*@null@*/ Header headerCopyLoad(void * p) /*@*/;
+/*@null@*/ Header headerCopyLoad(void * uh) /*@*/;
/** \ingroup header
* Convert header to on-disk representation.
* @param h header (with pointers)
- * @return on-disk header (with offsets)
+ * @return on-disk header blob (i.e. with offsets)
*/
/*@only@*/ /*@null@*/ void * headerUnload(Header h)
/*@modifies h @*/;
@@ -286,13 +286,13 @@ typedef const char * errmsg_t;
* @param h header
* @param fmt format to use
* @param tags array of tag name/value pairs
- * @param extentions chained table of formatting extensions.
+ * @param extensions chained table of formatting extensions.
* @retval errmsg error message (if any)
* @return formatted output string (malloc'ed)
*/
/*@only@*/ char * headerSprintf(Header h, const char * fmt,
const struct headerTagTableEntry * tags,
- const struct headerSprintfExtension * extentions,
+ const struct headerSprintfExtension * extensions,
/*@null@*/ /*@out@*/ errmsg_t * errmsg)
/*@modifies *errmsg @*/;
@@ -466,27 +466,28 @@ int headerRemoveEntry(Header h, int_32 tag)
* @return header tag iterator
*/
HeaderIterator headerInitIterator(Header h)
- /*@modifies h*/;
+ /*@modifies h */;
/** \ingroup header
* Return next tag from header.
- * @param iter header tag iterator
+ * @param hi header tag iterator
* @retval tag address of tag
* @retval type address of tag value data type
* @retval p address of pointer to tag value(s)
* @retval c address of number of values
* @return 1 on success, 0 on failure
*/
-int headerNextIterator(HeaderIterator iter,
- /*@out@*/ int_32 * tag, /*@out@*/ int_32 * type,
- /*@out@*/ const void ** p, /*@out@*/ int_32 * c)
- /*@modifies iter, *tag, *type, *p, *c @*/;
+int headerNextIterator(HeaderIterator hi,
+ /*@null@*/ /*@out@*/ int_32 * tag, /*@null@*/ /*@out@*/ int_32 * type,
+ /*@null@*/ /*@out@*/ const void ** p, /*@null@*/ /*@out@*/ int_32 * c)
+ /*@modifies hi, *tag, *type, *p, *c @*/;
/** \ingroup header
* Destroy header tag iterator.
- * @param iter header tag iterator
+ * @param hi header tag iterator
*/
-void headerFreeIterator( /*@only@*/ HeaderIterator iter);
+void headerFreeIterator(/*@only@*/ HeaderIterator hi)
+ /*@modifies hi @*/;
/** \ingroup header
* Duplicate a header.
diff --git a/lib/md5.h b/lib/md5.h
index 13d60cfbc..98fb4d0e7 100644
--- a/lib/md5.h
+++ b/lib/md5.h
@@ -34,27 +34,27 @@ extern "C" {
/**
* Initialize MD5 hash.
* Set bit count to 0 and buffer to mysterious initialization constants.
- * @param context MD5 private data
+ * @param ctx MD5 private data
* @param brokenEndian calculate broken MD5 sum?
*/
-void rpmMD5Init( /*@out@*/ struct MD5Context *context, int brokenEndian);
+void rpmMD5Init( /*@out@*/ struct MD5Context * ctx, int brokenEndian);
/**
- * Update context to reflect the concatenation of another buffer full
+ * Update context to reflect the concatenation of another buffer full.
* of bytes.
- * @param context MD5 private data
+ * @param ctx MD5 private data
* @param data next data buffer
* @param len no. bytes of data
*/
-void rpmMD5Update(struct MD5Context *context, unsigned char const *buf,
+void rpmMD5Update(struct MD5Context * ctx, unsigned char const *buf,
unsigned len);
/**
* Return MD5 digest, and reset context.
* @retval MD5 digest
- * @param context MD5 private data
+ * @param ctx MD5 private data
*/
/*@-fixedformalarray@*/
-void rpmMD5Final(unsigned char digest[16], struct MD5Context *context);
+void rpmMD5Final(unsigned char digest[16], struct MD5Context * ctx);
/*@=fixedformalarray@*/
/**
diff --git a/lib/misc.h b/lib/misc.h
index 8cb435647..83858c1d2 100644
--- a/lib/misc.h
+++ b/lib/misc.h
@@ -42,18 +42,20 @@ void freeSplitString( /*@only@*/ char ** list);
/**
*/
-int rpmfileexists(const char * filespec) /*@*/;
+int rpmfileexists(const char * urlfn) /*@*/;
/**
*/
-int rpmvercmp(const char * one, const char * two);
+int rpmvercmp(const char * a, const char * b);
-/* these are like the normal functions, but they malloc() the space which
- is needed */
+/*
+ * These are like the libc functions, but they malloc() the space which
+ * is needed.
+ */
/**
*/
-int dosetenv(const char *name, const char *value, int overwrite);
+int dosetenv(const char * name, const char * value, int overwrite);
/**
*/
diff --git a/lib/package.c b/lib/package.c
index d9e1d2217..d71953e82 100644
--- a/lib/package.c
+++ b/lib/package.c
@@ -89,8 +89,10 @@ Header headerRegenSigHeader(const Header h)
* @param hdrPtr address of header (or NULL)
* @return rpmRC return code
*/
-static rpmRC readPackageHeaders(FD_t fd, /*@out@*/ struct rpmlead * leadPtr,
- /*@out@*/ Header * sigs, /*@out@*/ Header *hdrPtr)
+static rpmRC readPackageHeaders(FD_t fd,
+ /*@null@*/ /*@out@*/ struct rpmlead * leadPtr,
+ /*@null@*/ /*@out@*/ Header * sigs,
+ /*@null@*/ /*@out@*/ Header * hdrPtr)
/*@modifies fd, *leadPtr, *sigs, *hdrPtr @*/
{
Header hdrBlock;
@@ -200,7 +202,9 @@ rpmRC rpmReadPackageInfo(FD_t fd, Header * sigp, Header * hdrp)
rpmRC rc = readPackageHeaders(fd, NULL, sigp, hdrp);
if (rc == RPMRC_FAIL)
return rc;
- if (hdrp && *hdrp && sigp && *sigp)
+ if (hdrp == NULL || sigp == NULL)
+ return rc;
+ if (*hdrp && *sigp)
headerMergeLegacySigs(*hdrp, *sigp);
return rc;
}
diff --git a/lib/problems.c b/lib/problems.c
index 6a5ce589d..b7e578dee 100644
--- a/lib/problems.c
+++ b/lib/problems.c
@@ -12,6 +12,7 @@
/*@access rpmProblemSet@*/
/*@access rpmProblem@*/
+/*@access rpmDependencyConflict@*/
/* XXX FIXME: merge into problems */
/* XXX used in verify.c rpmlibprov.c */
@@ -31,8 +32,9 @@ void printDepFlags(FILE * fp, const char * version, int flags)
fprintf(fp, " %s", version);
}
-static int sameProblem(struct rpmDependencyConflict * ap,
- struct rpmDependencyConflict * bp)
+static int sameProblem(const rpmDependencyConflict ap,
+ const rpmDependencyConflict bp)
+ /*@*/
{
if (ap->sense != bp->sense)
@@ -56,8 +58,8 @@ static int sameProblem(struct rpmDependencyConflict * ap,
}
/* XXX FIXME: merge into problems */
-void printDepProblems(FILE * fp, struct rpmDependencyConflict * conflicts,
- int numConflicts)
+void printDepProblems(FILE * fp,
+ const rpmDependencyConflict conflicts, int numConflicts)
{
int i;
@@ -105,7 +107,7 @@ static inline int snprintf(char * buf, int nb, const char * fmt, ...)
}
#endif
-const char * rpmProblemString(rpmProblem prob)
+const char * rpmProblemString(const rpmProblem prob)
{
/*@observer@*/ const char * pkgNEVR = (prob->pkgNEVR ? prob->pkgNEVR : "");
/*@observer@*/ const char * altNEVR = (prob->altNEVR ? prob->altNEVR : "");
@@ -184,7 +186,7 @@ const char * rpmProblemString(rpmProblem prob)
void rpmProblemPrint(FILE *fp, rpmProblem prob)
{
- const char *msg = rpmProblemString(prob);
+ const char * msg = rpmProblemString(prob);
fprintf(fp, "%s\n", msg);
msg = _free(msg);
}
diff --git a/lib/psm.c b/lib/psm.c
index e7f3692a6..d6ac22850 100644
--- a/lib/psm.c
+++ b/lib/psm.c
@@ -722,7 +722,7 @@ rpmRC rpmInstallSourcePackage(const char * rootDir, FD_t fd,
if (rc) rc = RPMRC_FAIL;
exit:
- if (rc == RPMRC_OK && specFile && specFilePtr)
+ if (specFilePtr && specFile && rc == RPMRC_OK)
*specFilePtr = specFile;
else
specFile = _free(specFile);
diff --git a/lib/rpminstall.c b/lib/rpminstall.c
index 7be27da73..c3b95cdd1 100644
--- a/lib/rpminstall.c
+++ b/lib/rpminstall.c
@@ -479,7 +479,7 @@ restart:
if (numFailed) goto exit;
if (numRPMS && !(interfaceFlags & INSTALL_NODEPS)) {
- struct rpmDependencyConflict * conflicts;
+ rpmDependencyConflict conflicts;
int numConflicts;
if (rpmdepCheck(ts, &conflicts, &numConflicts)) {
@@ -490,7 +490,7 @@ restart:
if (!stopInstall && conflicts) {
rpmMessage(RPMMESS_ERROR, _("failed dependencies:\n"));
printDepProblems(stderr, conflicts, numConflicts);
- rpmdepFreeConflicts(conflicts, numConflicts);
+ conflicts = rpmdepFreeConflicts(conflicts, numConflicts);
numFailed = numPkgs;
stopInstall = 1;
}
@@ -567,7 +567,7 @@ int rpmErase(const char * rootdir, const char ** argv,
const char ** arg;
int numFailed = 0;
rpmTransactionSet ts;
- struct rpmDependencyConflict * conflicts;
+ rpmDependencyConflict conflicts;
int numConflicts;
int stopUninstall = 0;
int numPackages = 0;
@@ -625,7 +625,7 @@ int rpmErase(const char * rootdir, const char ** argv,
rpmMessage(RPMMESS_ERROR, _("removing these packages would break "
"dependencies:\n"));
printDepProblems(stderr, conflicts, numConflicts);
- rpmdepFreeConflicts(conflicts, numConflicts);
+ conflicts = rpmdepFreeConflicts(conflicts, numConflicts);
numFailed += numPackages;
stopUninstall = 1;
}
diff --git a/lib/rpmlib.h b/lib/rpmlib.h
index c08580d02..aeb111da1 100644
--- a/lib/rpmlib.h
+++ b/lib/rpmlib.h
@@ -43,28 +43,30 @@ extern "C" {
/**
* Return package signatures and header from file handle.
+ * @deprecated Signature tags are appended to header in rpm-4.0.2.
+ * @todo Eliminate.
* @param fd file handle
- * @retval signatures address of signatures pointer (or NULL)
- * @retval hdr address of header pointer (or NULL)
+ * @retval sigp address of signature header (or NULL)
+ * @retval hdrp address of header (or NULL)
* @return rpmRC return code
*/
-rpmRC rpmReadPackageInfo(FD_t fd, /*@out@*/ Header * signatures,
- /*@out@*/ Header * hdr)
- /*@modifies fd, *signatures, *hdr @*/;
+rpmRC rpmReadPackageInfo(FD_t fd, /*@null@*/ /*@out@*/ Header * sigp,
+ /*@null@*/ /*@out@*/ Header * hdrp)
+ /*@modifies fd, *sigp, *hdrp @*/;
/**
* Return package header and lead info from file handle.
* @param fd file handle
- * @retval hdr address of header (or NULL)
- * @retval isSource
- * @retval major
- * @retval minor
+ * @retval hdrp address of header (or NULL)
+ * @retval isSource address to return lead source flag (or NULL)
+ * @retval major address to return lead major (or NULL)
+ * @retval minor address to return lead minor (or NULL)
* @return rpmRC return code
*/
-rpmRC rpmReadPackageHeader(FD_t fd, /*@out@*/ Header * hdr,
- /*@out@*/ int * isSource, /*@out@*/ int * major,
- /*@out@*/ int * minor)
- /*@modifies fd, *hdr, *isSource, *major, *minor @*/;
+rpmRC rpmReadPackageHeader(FD_t fd, /*@null@*/ /*@out@*/ Header * hdrp,
+ /*@null@*/ /*@out@*/ int * isSource, /*@null@*/ /*@out@*/ int * major,
+ /*@null@*/ /*@out@*/ int * minor)
+ /*@modifies fd, *hdrp, *isSource, *major, *minor @*/;
/** \ingroup header
* Return name, version, release strings from header.
@@ -484,10 +486,10 @@ int rpmReadConfigFiles(/*@null@*/ const char * file,
/** \ingroup rpmrc
* Read rpmrc (and macro) configuration file(s).
- * @param file colon separated files to read (NULL uses default)
+ * @param rcfiles colon separated files to read (NULL uses default)
* @return 0 on succes
*/
-int rpmReadRC(/*@null@*/ const char * file);
+int rpmReadRC(/*@null@*/ const char * rcfiles);
/** \ingroup rpmrc
* Return current arch name and/or number.
@@ -526,10 +528,10 @@ int rpmMachineScore(int type, const char * name);
/** \ingroup rpmrc
* Display current rpmrc (and macro) configuration.
- * @param f output file handle
+ * @param fp output file handle
* @return 0 always
*/
-int rpmShowRC(FILE *f);
+int rpmShowRC(FILE * fp);
/** \ingroup rpmrc
* @deprecated Use addMacro to set _target_* macros.
@@ -845,26 +847,32 @@ void printDepFlags(FILE *fp, const char *version, int flags)
/**
*/
-struct rpmDependencyConflict {
+typedef /*@abstract@*/ struct rpmDependencyConflict_s {
const char * byName;
const char * byVersion;
const char * byRelease;
Header byHeader;
- /* these needs fields are misnamed -- they are used for the package
- which isn't needed as well */
+ /*
+ * These needs fields are misnamed -- they are used for the package
+ * which isn't needed as well.
+ */
const char * needsName;
const char * needsVersion;
int needsFlags;
-/*@observer@*/ /*@null@*/ const void * suggestedPackage; /* NULL if none */
+/*@owned@*/ /*@null@*/ const void ** suggestedPackages; /* terminated by NULL */
enum {
RPMDEP_SENSE_REQUIRES, /*!< requirement not satisfied. */
RPMDEP_SENSE_CONFLICTS /*!< conflict was found. */
} sense;
-} ;
+} * rpmDependencyConflict;
/**
+ * Print results of rpmdepCheck() dependency check.
+ * @param fp output file
+ * @param conflicts dependency problems
+ * @param numConflicts no. of dependency problems
*/
-void printDepProblems(FILE *fp, struct rpmDependencyConflict *conflicts,
+void printDepProblems(FILE * fp, const rpmDependencyConflict conflicts,
int numConflicts)
/*@modifies *fp @*/;
@@ -874,8 +882,7 @@ void printDepProblems(FILE *fp, struct rpmDependencyConflict *conflicts,
* @param prob rpm problem
* @return formatted string
*/
-/*@only@*/ extern const char * rpmProblemString(rpmProblem prob)
- /*@modifies prob @*/;
+/*@only@*/ extern const char * rpmProblemString(const rpmProblem prob) /*@*/;
/**
* Output formatted string representation of problem to file handle.
@@ -929,19 +936,20 @@ typedef struct rpmRelocation_s {
/**
* Install source package.
- * @param root path to top of install tree
+ * @param rootDir path to top of install tree (or NULL)
* @param fd file handle
- * @retval specFile address of spec file name
+ * @retval specFilePtr address of spec file name (or NULL)
* @param notify progress callback
* @param notifyData progress callback private data
- * @retval cooke address of cookie pointer
+ * @retval cooke address of cookie pointer (or NULL)
* @return rpmRC return code
*/
-rpmRC rpmInstallSourcePackage(/*@null@*/ const char * root, FD_t fd,
- /*@out@*/ const char ** specFile,
- rpmCallbackFunction notify, rpmCallbackData notifyData,
- /*@out@*/ char ** cookie)
- /*@modifies fd, *specFile, *cookie @*/;
+rpmRC rpmInstallSourcePackage(/*@null@*/ const char * rootDir, FD_t fd,
+ /*@null@*/ /*@out@*/ const char ** specFilePtr,
+ /*@null@*/ rpmCallbackFunction notify,
+ /*@null@*/ rpmCallbackData notifyData,
+ /*@null@*/ /*@out@*/ char ** cookie)
+ /*@modifies fd, *specFilePtr, *cookie @*/;
/**
* Compare headers to determine which header is "newer".
@@ -1024,7 +1032,8 @@ typedef /*@abstract@*/ struct rpmTransactionSet_s * rpmTransactionSet;
*/
/*@only@*/ rpmTransactionSet rpmtransCreateSet(
/*@null@*/ /*@kept@*/ rpmdb rpmdb,
- /*@null@*/ const char * rootdir);
+ /*@null@*/ const char * rootDir)
+ /*@*/;
/** \ingroup rpmtrans
* Add package to be installed to unordered transaction set.
@@ -1038,13 +1047,14 @@ typedef /*@abstract@*/ struct rpmTransactionSet_s * rpmTransactionSet;
* @param h package header
* @param fd package file handle
* @param key package private data
- * @param update is package being upgraded?
+ * @param upgrade is package being upgraded?
* @param relocs package file relocations
* @return 0 on success, 1 on I/O error, 2 needs capabilities
*/
int rpmtransAddPackage(rpmTransactionSet ts, Header h, /*@null@*/ FD_t fd,
- /*@null@*/ /*@owned@*/ const void * key, int update,
- /*@null@*/ rpmRelocation * relocs);
+ /*@null@*/ /*@owned@*/ const void * key, int upgrade,
+ /*@null@*/ rpmRelocation * relocs)
+ /*@modifies fd, h, ts @*/;
/** \ingroup rpmtrans
* Add package to universe of possible packages to install in transaction set.
@@ -1053,20 +1063,23 @@ int rpmtransAddPackage(rpmTransactionSet ts, Header h, /*@null@*/ FD_t fd,
* @param key package private data
*/
void rpmtransAvailablePackage(rpmTransactionSet ts, Header h,
- /*@null@*/ /*@owned@*/ const void * key);
+ /*@null@*/ /*@owned@*/ const void * key)
+ /*@modifies h, ts @*/;
/** \ingroup rpmtrans
* Add package to be removed to unordered transaction set.
* @param ts transaction set
* @param dboffset rpm database instance
*/
-void rpmtransRemovePackage(rpmTransactionSet ts, int dboffset);
+void rpmtransRemovePackage(rpmTransactionSet ts, int dboffset)
+ /*@modifies ts @*/;
/** \ingroup rpmtrans
* Destroy transaction set.
* @param ts transaction set
*/
-void rpmtransFree( /*@only@*/ rpmTransactionSet ts);
+void rpmtransFree( /*@only@*/ rpmTransactionSet ts)
+ /*@modifies ts @*/;
/** \ingroup rpmtrans
* Save file handle to be used as stderr when running package scripts.
@@ -1091,13 +1104,14 @@ int rpmtransGetKeys(const rpmTransactionSet ts,
/** \ingroup rpmtrans
* Check that all dependencies can be resolved.
* @param ts transaction set
- * @retval conflicts
- * @retval numConflicts
+ * @retval conflicts dependency problems
+ * @retval numConflicts no. of dependency problems
* @return 0 on success
*/
int rpmdepCheck(rpmTransactionSet ts,
- /*@exposed@*/ /*@out@*/ struct rpmDependencyConflict ** conflicts,
- /*@exposed@*/ /*@out@*/ int * numConflicts);
+ /*@exposed@*/ /*@out@*/ rpmDependencyConflict * conflicts,
+ /*@exposed@*/ /*@out@*/ int * numConflicts)
+ /*@modifies ts, *conflicts, *numConflicts @*/;
/** \ingroup rpmtrans
* Determine package order in a transaction set according to dependencies.
@@ -1118,15 +1132,18 @@ int rpmdepCheck(rpmTransactionSet ts,
* @param ts transaction set
* @return 0 if packages are successfully ordered, 1 otherwise
*/
-int rpmdepOrder(rpmTransactionSet ts) /*@modifies ts @*/;
+int rpmdepOrder(rpmTransactionSet ts)
+ /*@modifies ts @*/;
/** \ingroup rpmtrans
* Destroy dependency conflicts storage.
- * @param conflicts dependency conflicts
- * @param numConflicts no. of dependency conflicts
+ * @param conflicts dependency problems
+ * @param numConflicts no. of dependency problems
+ * @retrun NULL always
*/
-void rpmdepFreeConflicts( /*@only@*/ struct rpmDependencyConflict * conflicts,
- int numConflicts);
+/*@null@*/ rpmDependencyConflict rpmdepFreeConflicts(
+ /*@only@*/ /*@null@*/ rpmDependencyConflict conflicts, int numConflicts)
+ /*@modifies conflicts @*/;
/** \ingroup rpmtrans
* Bit(s) to control rpmRunTransaction() operation.
@@ -1200,8 +1217,9 @@ int rpmGetRpmlibProvides(/*@out@*/ const char *** provNames,
* @param BFlags 2nd dependency logical range qualifiers
* @return 1 if dependencies overlap, 0 otherwise
*/
-int rpmRangesOverlap(const char *AName, const char *AEVR, int AFlags,
- const char *BName, const char *BEVR, int BFlags) /*@*/;
+int rpmRangesOverlap(const char * AName, const char * AEVR, int AFlags,
+ const char * BName, const char * BEVR, int BFlags)
+ /*@*/;
/** \ingroup rpmtrans
* Check dependency against internal rpmlib feature provides.
@@ -1252,7 +1270,8 @@ int rpmRunTransactions(rpmTransactionSet ts,
rpmProblemSet okProbs,
/*@out@*/ rpmProblemSet * newProbs,
rpmtransFlags transFlags,
- rpmprobFilterFlags ignoreSet);
+ rpmprobFilterFlags ignoreSet)
+ /*@modifies ts, *newProbs @*/;
/*@}*/
@@ -1261,8 +1280,7 @@ int rpmRunTransactions(rpmTransactionSet ts,
* @param tag tag value
* @return name of tag
*/
-/*@observer@*/ extern const char *const tagName(int tag)
- /*@*/;
+/*@observer@*/ extern const char *const tagName(int tag) /*@*/;
/**
* Return value of tag from name.
@@ -1301,28 +1319,30 @@ struct rpmlead {
/**
* Release storage used by file system usage cache.
*/
-void freeFilesystems(void);
+void freeFilesystems(void) /*@modifies internalState@*/;
/**
* Return (cached) file system mount points.
- * @retval addess of file system names (or NULL)
- * @retval num address of number of file systems
+ * @retval listptr addess of file system names (or NULL)
+ * @retval num address of number of file systems (or NULL)
* @return 0 on success, 1 on error
*/
-int rpmGetFilesystemList( /*@out@*/ const char *** listptr, /*@out@*/ int * num)
- /*@modifies *listptr, *num @*/;
+int rpmGetFilesystemList( /*@null@*/ /*@out@*/ const char *** listptr,
+ /*@null@*/ /*@out@*/ int * num)
+ /*@modifies *listptr, *num @*/;
/**
* Determine per-file system usage for a list of files.
- * @param filelist array of absolute file names
+ * @param fileList array of absolute file names
* @param fssizes array of file sizes
* @param numFiles number of files in list
- * @retval usagesPtr address of per-file system usage array.
+ * @retval usagesPtr address of per-file system usage array (or NULL)
* @param flags (unused)
* @return 0 on success, 1 on error
*/
-int rpmGetFilesystemUsage(const char ** filelist, int_32 * fssizes,
- int numFiles, /*@out@*/ uint_32 ** usagesPtr, int flags);
+int rpmGetFilesystemUsage(const char ** fileList, int_32 * fssizes,
+ int numFiles, /*@null@*/ /*@out@*/ uint_32 ** usagesPtr, int flags)
+ /*@modifies *usagesPtr @*/;
/* ==================================================================== */
/** \name RPMBT */
@@ -1494,29 +1514,30 @@ extern struct poptOption rpmQueryPoptTable[];
* Display list of tags that can be used in --queryformat.
* @param f file handle to use for display
*/
-void rpmDisplayQueryTags(FILE * f);
+void rpmDisplayQueryTags(FILE * f) /*@modifies f@*/;
/** \ingroup rpmcli
* Common query/verify source interface, called once for each CLI arg.
* @param qva parsed query/verify options
* @param source type of source to query/verify
* @param arg name of source to query/verify
- * @param db rpm database
+ * @param rpmdb rpm database
* @param showPackage query/verify specific display routine
* @return showPackage() result, 1 if rpmdbInitIterator() is NULL
*/
int rpmQueryVerify(QVA_t qva, rpmQVSources source, const char * arg,
- rpmdb db, QVF_t showPackage);
+ rpmdb rpmdb, QVF_t showPackage)
+ /*@modifies fileSystem@*/;
/** \ingroup rpmcli
* Display results of package query.
* @todo Devise a meaningful return code.
* @param qva parsed query/verify options
- * @param db rpm database (unused for queries)
+ * @param rpmdb rpm database (unused for queries)
* @param h header to use for query
* @return 0 always
*/
-int showQueryPackage(QVA_t qva, rpmdb db, Header h);
+int showQueryPackage(QVA_t qva, rpmdb rpmdb, Header h);
/** \ingroup rpmcli
* Display package information.
@@ -1525,7 +1546,8 @@ int showQueryPackage(QVA_t qva, rpmdb db, Header h);
* @param arg name of source to query
* @return rpmQueryVerify() result, or 1 on rpmdbOpen() failure
*/
-int rpmQuery(QVA_t qva, rpmQVSources source, const char * arg);
+int rpmQuery(QVA_t qva, rpmQVSources source, const char * arg)
+ /*@modifies fileSystem@*/;
/** \ingroup rpmcli
*/
@@ -1534,11 +1556,12 @@ extern struct poptOption rpmVerifyPoptTable[];
/** \ingroup rpmcli
* Display results of package verify.
* @param qva parsed query/verify options
- * @param db rpm database
+ * @param rpmdb rpm database
* @param h header to use for verify
* @return result of last non-zero verify return
*/
-int showVerifyPackage(QVA_t qva, /*@only@*/ rpmdb db, Header h);
+int showVerifyPackage(QVA_t qva, /*@only@*/ rpmdb rpmdb, Header h)
+ /*@modifies fileSystem@*/;
/** \ingroup rpmcli
* Verify package install.
@@ -1547,7 +1570,8 @@ int showVerifyPackage(QVA_t qva, /*@only@*/ rpmdb db, Header h);
* @param arg name of source to verify
* @return rpmQueryVerify() result, or 1 on rpmdbOpen() failure
*/
-int rpmVerify(QVA_t qva, rpmQVSources source, const char *arg);
+int rpmVerify(QVA_t qva, rpmQVSources source, const char *arg)
+ /*@modifies fileSystem@*/;
/*@}*/
/* ==================================================================== */
@@ -1572,29 +1596,33 @@ typedef enum rpmInstallInterfaceFlags_e {
/** \ingroup rpmcli
* Install/upgrade/freshen binary rpm package.
* @param rootdir path to top of install tree
- * @param argv array of package file names (NULL terminated)
+ * @param fileArgv array of package file names (NULL terminated)
* @param transFlags bits to control rpmRunTransactions()
* @param interfaceFlags bits to control rpmInstall()
* @param probFilter bits to filter problem types
* @param relocations package file relocations
* @return 0 on success
*/
-int rpmInstall(/*@null@*/ const char * rootdir, /*@null@*/ const char ** argv,
+int rpmInstall(/*@null@*/ const char * rootdir,
+ /*@null@*/ const char ** fileArgv,
rpmtransFlags transFlags,
rpmInstallInterfaceFlags interfaceFlags,
rpmprobFilterFlags probFilter,
- /*@null@*/ rpmRelocation * relocations);
+ /*@null@*/ rpmRelocation * relocations)
+ /*@modifies fileSystem, *relocations @*/;
/** \ingroup rpmcli
* Install source rpm package.
- * @param prefix path to top of install tree
+ * @param rootdir path to top of install tree
* @param arg source rpm file name
* @retval specFile address of (installed) spec file name
* @retval cookie
* @return 0 on success
*/
-int rpmInstallSource(const char * prefix, const char * arg,
- /*@out@*/ const char ** specFile, /*@out@*/ char ** cookie);
+int rpmInstallSource(const char * rootdir, const char * arg,
+ /*@null@*/ /*@out@*/ const char ** specFile,
+ /*@null@*/ /*@out@*/ char ** cookie)
+ /*@modifies fileSystem, *specFile, *cookie @*/;
/** \ingroup rpmcli
* Bit(s) to control rpmErase() operation.
diff --git a/lib/rpmrc.c b/lib/rpmrc.c
index 0c281c61c..94a085868 100644
--- a/lib/rpmrc.c
+++ b/lib/rpmrc.c
@@ -1389,7 +1389,7 @@ void rpmGetOsInfo(const char ** name, int * num) {
getMachineInfo(OS, name, num);
}
-void rpmRebuildTargetVars(const char ** buildtarget, const char ** canontarget)
+void rpmRebuildTargetVars(const char ** target, const char ** canontarget)
{
char *ca = NULL, *co = NULL, *ct = NULL;
@@ -1401,10 +1401,10 @@ void rpmRebuildTargetVars(const char ** buildtarget, const char ** canontarget)
rpmSetTables(RPM_MACHTABLE_INSTARCH, RPM_MACHTABLE_INSTOS);
rpmSetTables(RPM_MACHTABLE_BUILDARCH, RPM_MACHTABLE_BUILDOS);
- if (buildtarget && *buildtarget) {
+ if (target && *target) {
char *c;
/* Set arch and os from specified build target */
- ca = xstrdup(*buildtarget);
+ ca = xstrdup(*target);
if ((c = strchr(ca, '-')) != NULL) {
*c++ = '\0';
diff --git a/lib/signature.c b/lib/signature.c
index 1f004df4f..a760ecfc5 100644
--- a/lib/signature.c
+++ b/lib/signature.c
@@ -413,7 +413,7 @@ static int makeGPGSignature(const char * file, /*@out@*/ void ** sig,
return 0;
}
-int rpmAddSignature(Header header, const char * file, int_32 sigTag,
+int rpmAddSignature(Header h, const char * file, int_32 sigTag,
const char *passPhrase)
{
struct stat st;
@@ -427,25 +427,25 @@ int rpmAddSignature(Header header, const char * file, int_32 sigTag,
(void) stat(file, &st);
size = st.st_size;
ret = 0;
- (void) headerAddEntry(header, RPMSIGTAG_SIZE, RPM_INT32_TYPE, &size, 1);
+ (void) headerAddEntry(h, RPMSIGTAG_SIZE, RPM_INT32_TYPE, &size, 1);
break;
case RPMSIGTAG_MD5:
ret = mdbinfile(file, buf);
if (ret == 0)
- (void) headerAddEntry(header, sigTag, RPM_BIN_TYPE, buf, 16);
+ (void) headerAddEntry(h, sigTag, RPM_BIN_TYPE, buf, 16);
break;
case RPMSIGTAG_PGP5: /* XXX legacy */
case RPMSIGTAG_PGP:
rpmMessage(RPMMESS_VERBOSE, _("Generating signature using PGP.\n"));
ret = makePGPSignature(file, &sig, &size, passPhrase);
if (ret == 0)
- (void) headerAddEntry(header, sigTag, RPM_BIN_TYPE, sig, size);
+ (void) headerAddEntry(h, sigTag, RPM_BIN_TYPE, sig, size);
break;
case RPMSIGTAG_GPG:
rpmMessage(RPMMESS_VERBOSE, _("Generating signature using GPG.\n"));
ret = makeGPGSignature(file, &sig, &size, passPhrase);
if (ret == 0)
- (void) headerAddEntry(header, sigTag, RPM_BIN_TYPE, sig, size);
+ (void) headerAddEntry(h, sigTag, RPM_BIN_TYPE, sig, size);
break;
}
diff --git a/lib/signature.h b/lib/signature.h
index 4e88d21a6..d81f82b53 100644
--- a/lib/signature.h
+++ b/lib/signature.h
@@ -46,12 +46,13 @@ Header rpmNewSignature(void) /*@*/;
* Read (and verify header+archive size) signature header.
* If an old-style signature is found, we emulate a new style one.
* @param fd file handle
- * @retval header address of (signature) header
- * @param sig_type type of signature header to read (from lead).
+ * @retval headerp address of (signature) header (or NULL)
+ * @param sig_type type of signature header to read (from lead)
* @return rpmRC return code
*/
-rpmRC rpmReadSignature(FD_t fd, /*@out@*/ Header *header, sigType sig_type)
- /*@modifies fd, *header @*/;
+rpmRC rpmReadSignature(FD_t fd, /*@null@*/ /*@out@*/ Header *headerp,
+ sigType sig_type)
+ /*@modifies fd, *headerp @*/;
/** \ingroup signature
* Write signature header.
diff --git a/lib/verify.c b/lib/verify.c
index c0b3bb057..2aa421ce2 100644
--- a/lib/verify.c
+++ b/lib/verify.c
@@ -72,7 +72,7 @@ struct poptOption rpmVerifyPoptTable[] = {
};
/* ======================================================================== */
-int rpmVerifyFile(const char * prefix, Header h, int filenum,
+int rpmVerifyFile(const char * root, Header h, int filenum,
int * result, int omitMask)
{
HGE_t hge = (HGE_t)headerGetEntryMinMemory;
@@ -126,8 +126,8 @@ int rpmVerifyFile(const char * prefix, Header h, int filenum,
(void) hge(h, RPMTAG_DIRNAMES, &dnt, (void **) &dirNames, NULL);
filespec = alloca(strlen(dirNames[dirIndexes[filenum]]) +
- strlen(baseNames[filenum]) + strlen(prefix) + 5);
- sprintf(filespec, "%s/%s%s", prefix, dirNames[dirIndexes[filenum]],
+ strlen(baseNames[filenum]) + strlen(root) + 5);
+ sprintf(filespec, "%s/%s%s", root, dirNames[dirIndexes[filenum]],
baseNames[filenum]);
baseNames = hfd(baseNames, bnt);
dirNames = hfd(dirNames, dnt);
@@ -326,6 +326,11 @@ int rpmVerifyScript(const char * rootDir, Header h, /*@null@*/ FD_t scriptFd)
}
/* ======================================================================== */
+/**
+ * Check file info from header against what's actually installed.
+ * @param h header
+ * @return 0 no problems, 1 problems found
+ */
static int verifyHeader(QVA_t qva, Header h)
{
HGE_t hge = (HGE_t)headerGetEntryMinMemory;
@@ -338,7 +343,7 @@ static int verifyHeader(QVA_t qva, Header h)
rpmVerifyAttrs verifyResult = 0;
rpmVerifyAttrs omitMask = !(qva->qva_flags & VERIFY_MD5)
? RPMVERIFY_MD5 : RPMVERIFY_NONE;
- int ec = 0;
+ int ec = 0; /* assume no problems */
int i;
te = t = buf;
@@ -407,16 +412,22 @@ static int verifyHeader(QVA_t qva, Header h)
}
exit:
- if (fileNames) free(fileNames);
+ fileNames = _free(fileNames);
return ec;
}
+/**
+ * Check installed package dependencies for problems.
+ * @param rpmdb rpm database
+ * @param h header
+ * @return 0 no problems, 1 problems found
+ */
static int verifyDependencies(rpmdb rpmdb, Header h)
{
rpmTransactionSet rpmdep;
- struct rpmDependencyConflict * conflicts;
+ rpmDependencyConflict conflicts;
int numConflicts;
- int rc = 0;
+ int rc = 0; /* assume no problems */
int i;
rpmdep = rpmtransCreateSet(rpmdb, NULL);
@@ -454,7 +465,7 @@ static int verifyDependencies(rpmdb rpmdb, Header h)
te = stpcpy(te, conflicts[i].needsVersion);
}
}
- rpmdepFreeConflicts(conflicts, numConflicts);
+ conflicts = rpmdepFreeConflicts(conflicts, numConflicts);
if (te > t) {
*te++ = '\n';
*te = '\0';
diff --git a/python/rpmmodule.c b/python/rpmmodule.c
index 147141ce0..324284746 100644
--- a/python/rpmmodule.c
+++ b/python/rpmmodule.c
@@ -5,6 +5,7 @@
#include <alloca.h>
#include <errno.h>
#include <fcntl.h>
+#include <time.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <unistd.h>
@@ -16,6 +17,7 @@
#include "rpmlib.h"
#include "misc.h"
#include "rpmmacro.h"
+#include "rpmio_internal.h"
#include "upgrade.h"
extern int _rpmio_debug;
@@ -325,7 +327,7 @@ static PyObject * hdrVerifyFile(hdrObject * s, PyObject * args) {
}
/* RPMVERIFY_USER and RPM_VERIFY_GROUP are handled wrong here, but rpmlib.a
- doesn't do these correctly either. At least this is consisten */
+ doesn't do these correctly either. At least this is consistent. */
if (verifyResult & RPMVERIFY_USER) {
if (!s->uids) {
headerGetEntry(s->h, RPMTAG_FILEUIDS, &type, (void **) &s->uids,
@@ -2232,7 +2234,6 @@ static int closeCallback(FILE * f) {
return 0;
}
-#if 0
/** \ingroup python
*/
static PyObject * doFopen(PyObject * self, PyObject * args) {
@@ -2282,7 +2283,6 @@ static PyObject * doFopen(PyObject * self, PyObject * args) {
return PyFile_FromFile (node->f, path, mode, closeCallback);
}
-#endif
/** \ingroup python
*/
diff --git a/rpm.spec.in b/rpm.spec.in
index 8c69622fc..233d675cb 100644
--- a/rpm.spec.in
+++ b/rpm.spec.in
@@ -148,7 +148,7 @@ for dbi in \
Basenames Conflictname Dirnames Group Installtid Name Providename \
Provideversion Removetid Requirename Requireversion Triggername
do
- touch $RPM_BUILD_ROOT/var/lib/rpm/dbi
+ touch $RPM_BUILD_ROOT/var/lib/rpm/$dbi
done
%endif
diff --git a/rpmdb/Makefile.am b/rpmdb/Makefile.am
index 19513171b..c80af813c 100644
--- a/rpmdb/Makefile.am
+++ b/rpmdb/Makefile.am
@@ -48,7 +48,7 @@ falloc.lo: falloc.c $(top_srcdir)/system.h $(top_srcdir)/rpmio/rpmio.h falloc.h
touch $@
clean-local:
- rm -f $(DB3LOBJS)
+ rm -f $(DB3LOBJS) *.o .created
.PHONY: sources
sources:
diff --git a/rpmdb/db3.c b/rpmdb/db3.c
index 04c64bd57..e83826bbf 100644
--- a/rpmdb/db3.c
+++ b/rpmdb/db3.c
@@ -656,7 +656,12 @@ static int db3stat(dbiIndex dbi, unsigned int flags)
#endif
flags = 0;
dbi->dbi_stats = _free(dbi->dbi_stats);
+/* XXX 3.3.4 change. */
+#if DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR == 3
rc = db->stat(db, &dbi->dbi_stats, flags);
+#else
+ rc = db->stat(db, &dbi->dbi_stats, NULL, flags);
+#endif
rc = cvtdberr(dbi, "db->stat", rc, _debug);
return rc;
}
diff --git a/tools/rpmsort.c b/tools/rpmsort.c
index 83f507f4e..af4fc66ef 100644
--- a/tools/rpmsort.c
+++ b/tools/rpmsort.c
@@ -207,7 +207,7 @@ restart:
if (conflicts) {
rpmMessage(RPMMESS_ERROR, _("failed dependencies:\n"));
printDepProblems(stderr, conflicts, numConflicts);
- rpmdepFreeConflicts(conflicts, numConflicts);
+ conflicts = rpmdepFreeConflicts(conflicts, numConflicts);
rc = -1;
goto exit;
}