RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [EMAIL PROTECTED] Module: rpm Date: 05-Jun-2008 17:06:22 Branch: rpm-4_5 Handle: 2008060515062100 Modified files: (Branch: rpm-4_5) rpm CHANGES rpm/rpmdb librpmdb.vers rpmdb.c rpmdb.h Log: - fix: is_selinux_enbled() > 0 is the correct test. - rpm.org: Mask signals while moving rebuilt rpmdb into place. - rpm.org: Restore rpmdb selinux contexts to default after rebuild (#442149) - jbj: debuginfo: add general rpmdbCount() to get number of items for any tag index, not just RPMTAG_NAME as was in rpmdbCountPackages(). Summary: Revision Changes Path 1.1360.2.95 +5 -0 rpm/CHANGES 1.3.2.8 +2 -0 rpm/rpmdb/librpmdb.vers 1.128.2.9 +61 -38 rpm/rpmdb/rpmdb.c 1.57.2.4 +14 -1 rpm/rpmdb/rpmdb.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.1360.2.94 -r1.1360.2.95 CHANGES --- rpm/CHANGES 5 Jun 2008 13:44:40 -0000 1.1360.2.94 +++ rpm/CHANGES 5 Jun 2008 15:06:21 -0000 1.1360.2.95 @@ -1,6 +1,11 @@ 4.4.9 -> 4.5: + - jbj: fix: is_selinux_enbled() > 0 is the correct test. + - rpm.org: Mask signals while moving rebuilt rpmdb into place. + - rpm.org: Restore rpmdb selinux contexts to default after rebuild (#442149) - jbj: debuginfo: refactor 2 existing upgrade policy rules before adding a new contextually sensitive rule for -debuginfo packages. + - jbj: debuginfo: add general rpmdbCount() to get number of items for + any tag index, not just RPMTAG_NAME as was in rpmdbCountPackages(). - jbj: install rpmmtree.8, update POTFILES.in & Doxyfiles.in. - jbj: add %_build_iconsize macro to permit configuration. - jbj: trash-and-restore macro config for multiple CLI arg builds. @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/librpmdb.vers ============================================================================ $ cvs diff -u -r1.3.2.7 -r1.3.2.8 librpmdb.vers --- rpm/rpmdb/librpmdb.vers 29 May 2008 15:32:08 -0000 1.3.2.7 +++ rpm/rpmdb/librpmdb.vers 5 Jun 2008 15:06:21 -0000 1.3.2.8 @@ -35,6 +35,7 @@ headerGetOrigin; headerSetOrigin; headerGetInstance; + headerSetInstance; headerGetEndOff; headerSetEndOff; headerGetStartOff; @@ -62,6 +63,7 @@ rpmdbClose; rpmdbBlockDBI; rpmdbCloseDBI; + rpmdbCount; rpmdbCountPackages; rpmdbFindFpList; rpmdbFreeIterator; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.c ============================================================================ $ cvs diff -u -r1.128.2.8 -r1.128.2.9 rpmdb.c --- rpm/rpmdb/rpmdb.c 3 Sep 2007 14:23:51 -0000 1.128.2.8 +++ rpm/rpmdb/rpmdb.c 5 Jun 2008 15:06:21 -0000 1.128.2.9 @@ -1534,8 +1534,7 @@ return 0; } -/* XXX python/upgrade.c, install.c, uninstall.c */ -int rpmdbCountPackages(rpmdb db, const char * name) +int rpmdbCount(rpmdb db, rpmTag tag, const void * keyp, size_t keylen) { DBC * dbcursor = NULL; DBT * key = alloca(sizeof(*key)); @@ -1544,20 +1543,23 @@ int rc; int xx; - if (db == NULL) + if (db == NULL || keyp == NULL) return 0; memset(key, 0, sizeof(*key)); memset(data, 0, sizeof(*data)); - dbi = dbiOpen(db, RPMTAG_NAME, 0); + dbi = dbiOpen(db, tag, 0); if (dbi == NULL) return 0; + if (keylen == 0) + keylen = strlen(keyp); + /[EMAIL PROTECTED]@*/ -key->data = (void *) name; +key->data = (void *) keyp; /[EMAIL PROTECTED]@*/ -key->size = strlen(name); +key->size = (u_int32_t) keylen; xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, 0); rc = dbiGet(dbi, dbcursor, key, data, DB_SET); @@ -1594,6 +1596,12 @@ return rc; } +/* XXX python/upgrade.c, install.c, uninstall.c */ +int rpmdbCountPackages(rpmdb db, const char * name) +{ + return rpmdbCount(db, RPMTAG_NAME, name, 0); +} + /** * Attempt partial matches on name[-version[-release]] strings. * @param dbi index database handle (always RPMTAG_NAME) @@ -3767,36 +3775,39 @@ /[EMAIL PROTECTED] fileSystem, internalState @*/ { int i; - char * ofilename, * nfilename; + char * ofn, * nfn; struct stat * nst = alloca(sizeof(*nst)); int rc = 0; int xx; + int selinux = is_selinux_enabled() > 0 && (matchpathcon_init(NULL) != -1); + sigset_t sigMask; i = strlen(olddbpath); /[EMAIL PROTECTED]@*/ if (olddbpath[i - 1] != '/') { - ofilename = alloca(i + 2); - strcpy(ofilename, olddbpath); - ofilename[i] = '/'; - ofilename[i + 1] = '\0'; - olddbpath = ofilename; + ofn = alloca(i + 2); + strcpy(ofn, olddbpath); + ofn[i] = '/'; + ofn[i + 1] = '\0'; + olddbpath = ofn; } /[EMAIL PROTECTED]@*/ i = strlen(newdbpath); /[EMAIL PROTECTED]@*/ if (newdbpath[i - 1] != '/') { - nfilename = alloca(i + 2); - strcpy(nfilename, newdbpath); - nfilename[i] = '/'; - nfilename[i + 1] = '\0'; - newdbpath = nfilename; + nfn = alloca(i + 2); + strcpy(nfn, newdbpath); + nfn[i] = '/'; + nfn[i + 1] = '\0'; + newdbpath = nfn; } /[EMAIL PROTECTED]@*/ - ofilename = alloca(strlen(prefix) + strlen(olddbpath) + 40); - nfilename = alloca(strlen(prefix) + strlen(newdbpath) + 40); + ofn = alloca(strlen(prefix) + strlen(olddbpath) + 40); + nfn = alloca(strlen(prefix) + strlen(newdbpath) + 40); + blockSignals(NULL, &sigMask); switch (_olddbapi) { case 4: /* Fall through */ @@ -3819,42 +3830,51 @@ } base = mapTagName(rpmtag); - sprintf(ofilename, "%s/%s/%s", prefix, olddbpath, base); - (void)rpmCleanPath(ofilename); - if (!rpmioFileExists(ofilename)) + sprintf(ofn, "%s/%s/%s", prefix, olddbpath, base); + (void)rpmCleanPath(ofn); + if (!rpmioFileExists(ofn)) continue; - sprintf(nfilename, "%s/%s/%s", prefix, newdbpath, base); - (void)rpmCleanPath(nfilename); + sprintf(nfn, "%s/%s/%s", prefix, newdbpath, base); + (void)rpmCleanPath(nfn); /* * Get uid/gid/mode/mtime. If old doesn't exist, use new. * XXX Yes, the variable names are backwards. */ - if (stat(nfilename, nst) < 0) - if (stat(ofilename, nst) < 0) + if (stat(nfn, nst) < 0) + if (stat(ofn, nst) < 0) continue; - if ((xx = rename(ofilename, nfilename)) != 0) { + if ((xx = rename(ofn, nfn)) != 0) { rc = 1; continue; } - xx = chown(nfilename, nst->st_uid, nst->st_gid); - xx = chmod(nfilename, (nst->st_mode & 07777)); + + /* Restore uid/gid/mode/mtime/security context if possible. */ + xx = chown(nfn, nst->st_uid, nst->st_gid); + xx = chmod(nfn, (nst->st_mode & 07777)); { struct utimbuf stamp; stamp.actime = nst->st_atime; stamp.modtime = nst->st_mtime; - xx = utime(nfilename, &stamp); + xx = utime(nfn, &stamp); + } + if (selinux) { + security_context_t scon = NULL; + if (matchpathcon(nfn, nst->st_mode, &scon) != -1) + xx = setfilecon(nfn, scon); + if (scon != NULL) + freecon(scon); } } for (i = 0; i < 16; i++) { - sprintf(ofilename, "%s/%s/__db.%03d", prefix, olddbpath, i); - (void)rpmCleanPath(ofilename); - if (rpmioFileExists(ofilename)) - xx = unlink(ofilename); - sprintf(nfilename, "%s/%s/__db.%03d", prefix, newdbpath, i); - (void)rpmCleanPath(nfilename); - if (rpmioFileExists(nfilename)) - xx = unlink(nfilename); + sprintf(ofn, "%s/%s/__db.%03d", prefix, olddbpath, i); + (void)rpmCleanPath(ofn); + if (rpmioFileExists(ofn)) + xx = unlink(ofn); + sprintf(nfn, "%s/%s/__db.%03d", prefix, newdbpath, i); + (void)rpmCleanPath(nfn); + if (rpmioFileExists(nfn)) + xx = unlink(nfn); } break; case 2: @@ -3862,7 +3882,10 @@ case 0: break; } + unblockSignals(NULL, &sigMask); + if (selinux) + matchpathcon_fini(); return rc; } @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.h ============================================================================ $ cvs diff -u -r1.57.2.3 -r1.57.2.4 rpmdb.h --- rpm/rpmdb/rpmdb.h 9 Dec 2007 03:57:47 -0000 1.57.2.3 +++ rpm/rpmdb/rpmdb.h 5 Jun 2008 15:06:21 -0000 1.57.2.4 @@ -984,7 +984,20 @@ /[EMAIL PROTECTED]@*/ /** \ingroup rpmdb - * Return number of instances of package in rpm database. + * Return number of instances of key in a tag index. + * @param db rpm database + * @param tag rpm tag + * @param keyp key data + * @param keylen key data length (0 will use strlen(keyp)) + * @return number of instances + */ +int rpmdbCount(/[EMAIL PROTECTED]@*/ rpmdb db, rpmTag tag, + const void * keyp, size_t keylen) + /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ + /[EMAIL PROTECTED] db, rpmGlobalMacroContext, fileSystem, internalState @*/; + +/** \ingroup rpmdb + * Return number of instances of package in Name index. * @param db rpm database * @param name rpm package name * @return number of instances @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org