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

Reply via email to