From: Panu Matilainen Date: Thu, 12 Apr 2012 14:39:32 +0000 (+0300) Subject: Add rpmfiFooIndex() variants for the conflict handling methods X-Git-Tag: tznext/4.11.0.1.tizen20130304~573 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3f996a588a56141df146c33583a13c0542323977;p=tools%2Flibrpm-tizen.git Add rpmfiFooIndex() variants for the conflict handling methods - Preliminaries for handling file conflicts within a package: Using rpmfi's self-iterator limits access to the file info to one caller at a time, in order to self-file conflicts we'll need to be able to access the same rpmfi at different indexes simultaneously. - As these are public API's, add compat wrappers for the self-iterator use (although AFAIK nothing except rpm itself uses these) --- diff --git a/lib/rpmfi.c b/lib/rpmfi.c index ab1269c..f8e2c22 100644 --- a/lib/rpmfi.c +++ b/lib/rpmfi.c @@ -540,19 +540,19 @@ rpmFileTypes rpmfiWhatis(rpm_mode_t mode) return REG; } -int rpmfiCompare(const rpmfi afi, const rpmfi bfi) +int rpmfiCompareIndex(rpmfi afi, int aix, rpmfi bfi, int bix) { - rpmFileTypes awhat = rpmfiWhatis(rpmfiFMode(afi)); - rpmFileTypes bwhat = rpmfiWhatis(rpmfiFMode(bfi)); + rpmFileTypes awhat = rpmfiWhatis(rpmfiFModeIndex(afi, aix)); + rpmFileTypes bwhat = rpmfiWhatis(rpmfiFModeIndex(bfi, bix)); - if ((rpmfiFFlags(afi) & RPMFILE_GHOST) || - (rpmfiFFlags(bfi) & RPMFILE_GHOST)) return 0; + if ((rpmfiFFlagsIndex(afi, aix) & RPMFILE_GHOST) || + (rpmfiFFlagsIndex(bfi, bix) & RPMFILE_GHOST)) return 0; if (awhat != bwhat) return 1; if (awhat == LINK) { - const char * alink = rpmfiFLink(afi); - const char * blink = rpmfiFLink(bfi); + const char * alink = rpmfiFLinkIndex(afi, aix); + const char * blink = rpmfiFLinkIndex(bfi, bix); if (alink == blink) return 0; if (alink == NULL) return 1; if (blink == NULL) return -1; @@ -560,8 +560,9 @@ int rpmfiCompare(const rpmfi afi, const rpmfi bfi) } else if (awhat == REG) { size_t adiglen, bdiglen; int aalgo, balgo; - const unsigned char * adigest = rpmfiFDigest(afi, &aalgo, &adiglen); - const unsigned char * bdigest = rpmfiFDigest(bfi, &balgo, &bdiglen); + const unsigned char * adigest, * bdigest; + adigest = rpmfiFDigestIndex(afi, aix, &aalgo, &adiglen); + bdigest = rpmfiFDigestIndex(bfi, bix, &balgo, &bdiglen); if (adigest == bdigest) return 0; if (adigest == NULL) return 1; if (bdigest == NULL) return -1; @@ -573,10 +574,11 @@ int rpmfiCompare(const rpmfi afi, const rpmfi bfi) return 0; } -rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing) +rpmFileAction rpmfiDecideFateIndex(rpmfi ofi, int oix, rpmfi nfi, int nix, + int skipMissing) { - const char * fn = rpmfiFN(nfi); - rpmfileAttrs newFlags = rpmfiFFlags(nfi); + const char * fn = rpmfiFNIndex(nfi, nix); + rpmfileAttrs newFlags = rpmfiFFlagsIndex(nfi, nix); char buffer[1024]; rpmFileTypes dbWhat, newWhat, diskWhat; struct stat sb; @@ -597,8 +599,8 @@ rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing) } diskWhat = rpmfiWhatis((rpm_mode_t)sb.st_mode); - dbWhat = rpmfiWhatis(rpmfiFMode(ofi)); - newWhat = rpmfiWhatis(rpmfiFMode(nfi)); + dbWhat = rpmfiWhatis(rpmfiFModeIndex(ofi, oix)); + newWhat = rpmfiWhatis(rpmfiFModeIndex(nfi, nix)); /* * RPM >= 2.3.10 shouldn't create config directories -- we'll ignore @@ -625,7 +627,7 @@ rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing) int oalgo, nalgo; size_t odiglen, ndiglen; const unsigned char * odigest, * ndigest; - odigest = rpmfiFDigest(ofi, &oalgo, &odiglen); + odigest = rpmfiFDigestIndex(ofi, oix, &oalgo, &odiglen); if (diskWhat == REG) { if (rpmDoDigest(oalgo, fn, 0, (unsigned char *)buffer, NULL)) @@ -633,7 +635,7 @@ rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing) if (odigest && !memcmp(odigest, buffer, odiglen)) return FA_CREATE; /* unmodified config file, replace. */ } - ndigest = rpmfiFDigest(nfi, &nalgo, &ndiglen); + ndigest = rpmfiFDigestIndex(nfi, nix, &nalgo, &ndiglen); /* Can't compare different hash types, backup to avoid data loss */ if (oalgo != nalgo || odiglen != ndiglen) return save; @@ -641,7 +643,7 @@ rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing) return FA_SKIP; /* identical file, don't bother. */ } else /* dbWhat == LINK */ { const char * oFLink, * nFLink; - oFLink = rpmfiFLink(ofi); + oFLink = rpmfiFLinkIndex(ofi, oix); if (diskWhat == LINK) { ssize_t link_len = readlink(fn, buffer, sizeof(buffer) - 1); if (link_len == -1) @@ -650,7 +652,7 @@ rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing) if (oFLink && rstreq(oFLink, buffer)) return FA_CREATE; /* unmodified config file, replace. */ } - nFLink = rpmfiFLink(nfi); + nFLink = rpmfiFLinkIndex(nfi, nix); if (oFLink && nFLink && rstreq(oFLink, nFLink)) return FA_SKIP; /* identical file, don't bother. */ } @@ -664,10 +666,10 @@ rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing) return save; } -int rpmfiConfigConflict(const rpmfi fi) +int rpmfiConfigConflictIndex(rpmfi fi, int ix) { - const char * fn = rpmfiFN(fi); - rpmfileAttrs flags = rpmfiFFlags(fi); + const char * fn = rpmfiFNIndex(fi, ix); + rpmfileAttrs flags = rpmfiFFlagsIndex(fi, ix); char buffer[1024]; rpmFileTypes newWhat, diskWhat; struct stat sb; @@ -677,7 +679,7 @@ int rpmfiConfigConflict(const rpmfi fi) } diskWhat = rpmfiWhatis((rpm_mode_t)sb.st_mode); - newWhat = rpmfiWhatis(rpmfiFMode(fi)); + newWhat = rpmfiWhatis(rpmfiFModeIndex(fi, ix)); if (newWhat != LINK && newWhat != REG) return 1; @@ -689,7 +691,7 @@ int rpmfiConfigConflict(const rpmfi fi) if (newWhat == REG) { int algo; size_t diglen; - const unsigned char *ndigest = rpmfiFDigest(fi, &algo, &diglen); + const unsigned char *ndigest = rpmfiFDigestIndex(fi,ix, &algo, &diglen); if (rpmDoDigest(algo, fn, 0, (unsigned char *)buffer, NULL)) return 0; /* assume file has been removed */ if (ndigest && !memcmp(ndigest, buffer, diglen)) @@ -700,7 +702,7 @@ int rpmfiConfigConflict(const rpmfi fi) if (link_len == -1) return 0; /* assume file has been removed */ buffer[link_len] = '\0'; - nFLink = rpmfiFLink(fi); + nFLink = rpmfiFLinkIndex(fi, ix); if (nFLink && rstreq(nFLink, buffer)) return 0; /* unmodified config file */ } @@ -1315,3 +1317,20 @@ uint32_t rpmfiFDepends(rpmfi fi, const uint32_t ** fddictp) { return rpmfiFDependsIndex(fi, fi ? fi->i : -1, fddictp); } + +int rpmfiCompare(const rpmfi afi, const rpmfi bfi) +{ + return rpmfiCompareIndex(afi, afi ? afi->i : -1, bfi, bfi ? bfi->i : -1); +} + +rpmFileAction rpmfiDecideFate(const rpmfi ofi, rpmfi nfi, int skipMissing) +{ + return rpmfiDecideFateIndex(ofi, ofi ? ofi->i : -1, + nfi, nfi ? nfi->i : -1, + skipMissing); +} + +int rpmfiConfigConflict(const rpmfi fi) +{ + return rpmfiConfigConflictIndex(fi, fi ? fi->i : -1); +} diff --git a/lib/rpmfi_internal.h b/lib/rpmfi_internal.h index d9be7f5..9610d50 100644 --- a/lib/rpmfi_internal.h +++ b/lib/rpmfi_internal.h @@ -149,6 +149,16 @@ RPM_GNUC_INTERNAL struct fingerPrint_s *rpmfiFpsIndex(rpmfi fi, int ix); RPM_GNUC_INTERNAL +rpmFileAction rpmfiDecideFateIndex(rpmfi ofi, int oix, rpmfi nfi, int nix, + int skipMissing); + +RPM_GNUC_INTERNAL +int rpmfiCompareIndex(rpmfi afi, int aix, rpmfi bfi, int bix); + +RPM_GNUC_INTERNAL +int rpmfiConfigConflictIndex(rpmfi fi, int ix); + +RPM_GNUC_INTERNAL void rpmfiSetFReplacedSize(rpmfi fi, rpm_loff_t newsize); RPM_GNUC_INTERNAL