- pass rpmTransactionSet, not elements, to installBinaryPackage et al.
authorjbj <devnull@localhost>
Fri, 20 Oct 2000 22:04:27 +0000 (22:04 +0000)
committerjbj <devnull@localhost>
Fri, 20 Oct 2000 22:04:27 +0000 (22:04 +0000)
CVS patchset: 4221
CVS date: 2000/10/20 22:04:27

CHANGES
lib/cpio.h
lib/depends.h
lib/install.c
lib/install.h
lib/rpmlib.h
lib/transaction.c
lib/uninstall.c
lib/verify.c
po/rpm.pot

diff --git a/CHANGES b/CHANGES
index ba080dd..f439278 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -12,8 +12,9 @@
                (katzj@linuxpower.org) (#17672).
        - handle possible db3 dependency on -lpthread more gracefully.
        - fix: more (possible) xstrdup side effects.
-       - detect rdonly linux file systems.
+       - detect (still need to test) rdonly linux file systems.
        - check available inodes as well as blocks on mounted file systems.
+       - pass rpmTransactionSet, not elements, to installBinaryPackage et al.
 
 3.0.6 -> 4.0
        - use DIRNAMES/BASENAMES/DIRINDICES not FILENAMES in packages and db.
index 4ee4216..02cafa5 100644 (file)
@@ -50,12 +50,16 @@ enum cpioErrorReturns {
        CPIOERR_INTERNAL        = (23                   )
 };
 
-#define CPIO_MAP_PATH          (1 << 0)
-#define CPIO_MAP_MODE          (1 << 1)
-#define CPIO_MAP_UID           (1 << 2)
-#define CPIO_MAP_GID           (1 << 3)
-#define CPIO_FOLLOW_SYMLINKS   (1 << 4)  /* only for building */
-#define CPIO_MULTILIB          (1 << 31) /* internal, only for building */
+/** \ingroup payload
+ */
+enum cpioMapFlags {
+    CPIO_MAP_PATH              = (1 << 0),
+    CPIO_MAP_MODE              = (1 << 1),
+    CPIO_MAP_UID               = (1 << 2),
+    CPIO_MAP_GID               = (1 << 3),
+    CPIO_FOLLOW_SYMLINKS       = (1 << 4),  /* only for building */
+    CPIO_MULTILIB              = (1 << 31) /* internal, only for building */
+};
 
 /** \ingroup payload
  * Defines a single file to be included in a cpio payload.
@@ -91,6 +95,7 @@ typedef void (*cpioCallback) (struct cpioCallbackInfo * filespec, void * data);
 
 /** \ingroup payload
  * The RPM internal equivalent of the command line "cpio -i".
+ *
  * If no mappings are passed, this installs everything! If one is passed
  * it should be sorted according to cpioFileMapCmp() and only files included
  * in the map are installed. Files are installed relative to the current
@@ -133,12 +138,14 @@ int cpioBuildArchive(FD_t cfd, const struct cpioFileMapping * mappings,
  * This is designed to be qsort/bsearch compatible.
  * @param a            1st map
  * @param b            2nd map
- * return              result of comparison
+ * @return             result of comparison
  */
 int cpioFileMapCmp(const void * a, const void * b)     /*@*/;
 
 /** \ingroup payload
  * Return fornmatted error message on payload handling failure.
+ * @param              error code
+ * @return             formatted error string
  */
 /*@observer@*/ const char *cpioStrerror(int rc)                /*@*/;
 
index 9f333b6..c309467 100644 (file)
@@ -95,7 +95,7 @@ struct availableList {
     struct availableIndex index;       /*!< Set of available items. */
     int size;
     int alloced;
-    int numDirs;                       /*! No. of directories. */
+    int numDirs;                       /*!< No. of directories. */
 /*@owned@*/ struct dirInfo * dirs;     /*!< Set of directories. */
 };
 
@@ -120,6 +120,11 @@ struct transactionElement {
  * The set of packages to be installed/removed atomically.
  */
 struct rpmTransactionSet_s {
+    rpmtransFlags transFlags;          /*!< Bit(s) to control operation. */
+    rpmCallbackFunction notify;                /*!< Callback function. */
+    rpmCallbackData notifyData;                /*!< Callback data. */
+    rpmProblemSet probs;               /*!< Current problems in transaction. */
+    rpmprobFilterFlags ignoreSet;      /*!< Bits to filter current problems. */
 /*@owned@*/ /*@null@*/ rpmdb rpmdb;    /*!< Database handle. */
 /*@only@*/ int * removedPackages;      /*!< Set of packages being removed. */
     int numRemovedPackages;            /*!< No. removed rpmdb instances. */
index 5b945f1..69081c3 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "cpio.h"
 #include "install.h"
+#include "depends.h"
 #include "misc.h"
 #include <assert.h>
 
@@ -634,7 +635,7 @@ static int installArchive(FD_t fd, struct fileInfo * files, int fileCount,
  * @param h            header
  * @return             0 on success, 1 on bad magic, 2 on error
  */
-static int installSources(Header h, const char * rootdir, FD_t fd,
+static int installSources(Header h, const char * rootDir, FD_t fd,
                        const char ** specFilePtr,
                        rpmCallbackFunction notify, rpmCallbackData notifyData)
 {
@@ -656,7 +657,7 @@ static int installSources(Header h, const char * rootdir, FD_t fd,
 
     rpmMessage(RPMMESS_DEBUG, _("installing a source package\n"));
 
-    realSourceDir = rpmGenPath(rootdir, "%{_sourcedir}", "");
+    realSourceDir = rpmGenPath(rootDir, "%{_sourcedir}", "");
     if ((rc = Stat(realSourceDir, &st)) < 0) {
        int ut = urlPath(realSourceDir, NULL);
        switch (ut) {
@@ -686,7 +687,7 @@ static int installSources(Header h, const char * rootdir, FD_t fd,
     }
     rpmMessage(RPMMESS_DEBUG, _("sources in: %s\n"), realSourceDir);
 
-    realSpecDir = rpmGenPath(rootdir, "%{_specdir}", "");
+    realSpecDir = rpmGenPath(rootDir, "%{_specdir}", "");
     if ((rc = Stat(realSpecDir, &st)) < 0) {
        int ut = urlPath(realSpecDir, NULL);
        switch (ut) {
@@ -871,7 +872,7 @@ const char *const fileActionString(enum fileActions a)
     return "???";
 }
 
-int rpmInstallSourcePackage(const char * rootdir, FD_t fd,
+int rpmInstallSourcePackage(const char * rootDir, FD_t fd,
                        const char ** specFile,
                        rpmCallbackFunction notify, rpmCallbackData notifyData,
                        char ** cookie)
@@ -898,19 +899,18 @@ int rpmInstallSourcePackage(const char * rootdir, FD_t fd,
 
     rpmInstallLoadMacros(h);
 
-    rc = installSources(h, rootdir, fd, specFile, notify, notifyData);
+    rc = installSources(h, rootDir, fd, specFile, notify, notifyData);
     if (h)
        headerFree(h);
 
     return rc;
 }
 
-int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
-                       rpmtransFlags transFlags,
-                       rpmCallbackFunction notify, rpmCallbackData notifyData,
+int installBinaryPackage(const rpmTransactionSet ts, FD_t fd, Header h,
                        const void * pkgKey, enum fileActions * actions,
-                       struct sharedFileInfo * sharedList, FD_t scriptFd)
+                       struct sharedFileInfo * sharedList)
 {
+    rpmtransFlags transFlags = ts->transFlags;
     int rc;
     const char * name, * version, * release;
     int fileCount = 0;
@@ -933,14 +933,14 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
     rpmMessage(RPMMESS_DEBUG, _("package: %s-%s-%s files test = %d\n"),
                name, version, release, transFlags & RPMTRANS_FLAG_TEST);
 
-    if ((scriptArg = rpmdbCountPackages(db, name)) < 0) {
+    if ((scriptArg = rpmdbCountPackages(ts->rpmdb, name)) < 0) {
        rc = 2;
        goto exit;
     }
     scriptArg += 1;
 
     {  rpmdbMatchIterator mi;
-       mi = rpmdbInitIterator(db, RPMTAG_NAME, name, 0);
+       mi = rpmdbInitIterator(ts->rpmdb, RPMTAG_NAME, name, 0);
        rpmdbSetIteratorVersion(mi, version);
        rpmdbSetIteratorRelease(mi, release);
        while ((oldH = rpmdbNextIterator(mi))) {
@@ -952,7 +952,7 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
        rpmdbFreeIterator(mi);
     }
 
-    if (rootdir) {
+    if (ts->rootDir) {
        /* this loads all of the name services libraries, in case we
           don't have access to them in the chroot() */
        (void)getpwnam("root");
@@ -965,7 +965,7 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
        }
 
        chdir("/");
-       /*@-unrecog@*/ chroot(rootdir); /*@=unrecog@*/
+       /*@-unrecog@*/ chroot(ts->rootDir); /*@=unrecog@*/
     }
 
     if (!(transFlags & RPMTRANS_FLAG_JUSTDB) && headerIsEntry(h, RPMTAG_BASENAMES)) {
@@ -996,8 +996,16 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
     }
 
     rpmMessage(RPMMESS_DEBUG, _("running preinstall script (if any)\n"));
-    if (runInstScript("/", h, RPMTAG_PREIN, RPMTAG_PREINPROG, scriptArg,
-                     transFlags & RPMTRANS_FLAG_NOSCRIPTS, scriptFd)) {
+
+    /* XXX Save chroot around runInstScript() call. */
+    {  const char * rootDir = ts->rootDir;
+       ts->rootDir = "/";
+       rc = runInstScript(ts, h, RPMTAG_PREIN, RPMTAG_PREINPROG, scriptArg,
+                     transFlags & RPMTRANS_FLAG_NOSCRIPTS);
+       ts->rootDir = rootDir;
+    }
+
+    if (rc) {
        rc = 2;
        goto exit;
     }
@@ -1073,13 +1081,13 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
                                (void **) &archiveSizePtr, &count))
                archiveSizePtr = NULL;
 
-           if (notify) {
-               (void)notify(h, RPMCALLBACK_INST_START, 0, 0,
-                   pkgKey, notifyData);
+           if (ts->notify) {
+               (void)ts->notify(h, RPMCALLBACK_INST_START, 0, 0,
+                   pkgKey, ts->notifyData);
            }
 
            /* the file pointer for fd is pointing at the cpio archive */
-           if (installArchive(fd, files, fileCount, notify, notifyData, pkgKey,
+           if (installArchive(fd, files, fileCount, ts->notify, ts->notifyData, pkgKey,
                        h, NULL, archiveSizePtr ? *archiveSizePtr : 0)) {
                rc = 2;
                goto exit;
@@ -1111,7 +1119,7 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
        headerAddEntry(h, RPMTAG_INSTALLTIME, RPM_INT32_TYPE, &installTime, 1);
     }
 
-    if (rootdir) {
+    if (ts->rootDir) {
        /*@-unrecog@*/ chroot("."); /*@=unrecog@*/
        chdir(currDir);
        currDir = NULL;
@@ -1122,7 +1130,7 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
     /* if this package has already been installed, remove it from the database
        before adding the new one */
     if (otherOffset)
-        rpmdbRemove(db, otherOffset);
+        rpmdbRemove(ts->rpmdb, otherOffset);
 
     if (transFlags & RPMTRANS_FLAG_MULTILIB) {
        uint_32 multiLib, * newMultiLib, * p;
@@ -1139,41 +1147,43 @@ int installBinaryPackage(const char * rootdir, rpmdb db, FD_t fd, Header h,
        mergeFiles(oldH, h, actions);
     }
 
-    if (rpmdbAdd(db, h)) {
+    if (rpmdbAdd(ts->rpmdb, h)) {
        rc = 2;
        goto exit;
     }
 
     rpmMessage(RPMMESS_DEBUG, _("running postinstall scripts (if any)\n"));
 
-    if (runInstScript(rootdir, h, RPMTAG_POSTIN, RPMTAG_POSTINPROG, scriptArg,
-                     (transFlags & RPMTRANS_FLAG_NOSCRIPTS), scriptFd)) {
+    if (runInstScript(ts, h, RPMTAG_POSTIN, RPMTAG_POSTINPROG, scriptArg,
+                     (transFlags & RPMTRANS_FLAG_NOSCRIPTS))) {
        rc = 2;
        goto exit;
     }
 
     if (!(transFlags & RPMTRANS_FLAG_NOTRIGGERS)) {
        /* Run triggers this package sets off */
-       if (runTriggers(rootdir, db, RPMSENSE_TRIGGERIN, h, 0, scriptFd)) {
+       if (runTriggers(ts, RPMSENSE_TRIGGERIN, h, 0)) {
            rc = 2;
            goto exit;
        }
 
-       /* Run triggers in this package which are set off by other things in
-          the database. */
-       if (runImmedTriggers(rootdir, db, RPMSENSE_TRIGGERIN, h, 0, scriptFd)) {
+       /*
+        * Run triggers in this package which are set off by other packages in
+        * the database.
+        */
+       if (runImmedTriggers(ts, RPMSENSE_TRIGGERIN, h, 0)) {
            rc = 2;
            goto exit;
        }
     }
 
     if (sharedList)
-       markReplacedFiles(db, sharedList);
+       markReplacedFiles(ts->rpmdb, sharedList);
 
     rc = 0;
 
 exit:
-    if (rootdir && currDir) {
+    if (ts->rootDir && currDir) {
        /*@-unrecog@*/ chroot("."); /*@=unrecog@*/
        chdir(currDir);
     }
index af7d966..1ae4320 100644 (file)
@@ -26,54 +26,67 @@ struct sharedFileInfo {
 
 /**
  */
-enum fileActions { FA_UNKNOWN = 0, FA_CREATE, FA_BACKUP, FA_SAVE, FA_SKIP, 
-                  FA_ALTNAME, FA_REMOVE, FA_SKIPNSTATE, FA_SKIPNETSHARED,
-                  FA_SKIPMULTILIB };
+enum fileActions {
+    FA_UNKNOWN = 0,
+    FA_CREATE,
+    FA_BACKUP,
+    FA_SAVE,
+    FA_SKIP, 
+    FA_ALTNAME,
+    FA_REMOVE,
+    FA_SKIPNSTATE,
+    FA_SKIPNETSHARED,
+    FA_SKIPMULTILIB
+};
 
 /**
  */
-enum fileTypes { XDIR, BDEV, CDEV, SOCK, PIPE, REG, LINK } ;
+enum fileTypes {
+    XDIR,
+    BDEV,
+    CDEV,
+    SOCK,
+    PIPE,
+    REG,
+    LINK
+};
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /**
- * @param prefix       path to top of install tree
+ * @param ts           transaction set
  * @param h            header
  * @param scriptTag
  * @param progTag
  * @param arg
  * @param norunScripts
- * @param err          stderr file handle
  */
-int runInstScript(const char * prefix, Header h, int scriptTag, int progTag,
-               int arg, int norunScripts, FD_t err);
+int runInstScript(const rpmTransactionSet ts, Header h,
+               int scriptTag, int progTag, int arg, int norunScripts);
 
 /**
  * Run trigger scripts in the database that are fired by header.
- * @param root         path to top of install tree
- * @param rpmdb                rpm database
- * @param sense
+ * @param ts           transaction set
+ * @param sense                @todo Document.
  * @param h            header
- * @param countCorrection
- * @param scriptFd
+ * @param countCorrection      @todo Document.
+ * @return             0 on success, 1 on error
  */
-int runTriggers(const char * root, rpmdb rpmdb, int sense, Header h,
-               int countCorrection, FD_t scriptFd);
+int runTriggers(const rpmTransactionSet ts, int sense, Header h,
+               int countCorrection);
 
 /**
  * Run triggers from header that are fired by the database.
- * @param root         path to top of install tree
- * @param rpmdb                rpm database
+ * @param ts           transaction set
  * @param sense                @todo Document.
  * @param h            header
  * @param countCorrection      @todo Document.
- * @param scriptFd     @todo Document.
- * @return             @todo Document.
+ * @return             0 on success, 1 on error
  */
-int runImmedTriggers(const char * root, rpmdb rpmdb, int sense, Header h,
-               int countCorrection, FD_t scriptFd);
+int runImmedTriggers(const rpmTransactionSet ts, int sense, Header h,
+               int countCorrection);
 
 /**
  * Return formatted string representation of file disposition.
@@ -84,45 +97,29 @@ int runImmedTriggers(const char * root, rpmdb rpmdb, int sense, Header h,
 
 /**
  * Install binary package (from transaction set).
- * @param rootdir      path to top of install tree
- * @param rpmdb                rpm database
+ * @param ts           transaction set
  * @param fd           package file handle
  * @param h            package header
- * @param transFlags   transaction flags
- * @param notify       progress callback
- * @param notifyData   progress callback private data
  * @param pkgKey       package private data
  * @param actions      array of file dispositions
  * @param sharedList   header instances of packages that share files
- * @param scriptFd     @todo Document.
  * @return             0 on success, 1 on bad magic, 2 on error
  */
-int installBinaryPackage(const char * rootdir, rpmdb rpmdb, FD_t fd, Header h,
-               rpmtransFlags transFlags,
-               rpmCallbackFunction notify, rpmCallbackData notifyData,
+int installBinaryPackage(const rpmTransactionSet ts, FD_t fd, Header h,
                const void * pkgKey, enum fileActions * actions,
-               struct sharedFileInfo * sharedList, FD_t scriptFd);
+               struct sharedFileInfo * sharedList);
 
 /**
  * Erase binary package (from transaction set).
- * @param rootdir      path to top of install tree
- * @param rpmdb                rpm database
- * @param fd           package file handle
+ * @param ts           transaction set
  * @param offset       header instance in rpm database
  * @param h            package header
- * @param transFlags   transaction flags
- * @param notify       progress callback
- * @param notifyData   progress callback private data
  * @param pkgKey       package private data
  * @param actions      array of file dispositions
- * @param scriptFd     @todo Document.
  * @return
  */
-int removeBinaryPackage(const char * rootdir, rpmdb rpmdb, unsigned int offset,
-               Header h, rpmtransFlags flags,
-               rpmCallbackFunction notify, rpmCallbackData notifyData,
-               const void * pkgKey, enum fileActions * actions,
-               FD_t scriptFd);
+int removeBinaryPackage(const rpmTransactionSet ts, unsigned int offset,
+               Header h, const void * pkgKey, enum fileActions * actions);
 
 #ifdef __cplusplus
 }
index ce8c154..65ac7b7 100644 (file)
@@ -887,7 +887,7 @@ void rpmdepFreeConflicts( /*@only@*/ struct rpmDependencyConflict * conflicts,
        int numConflicts);
 
 /** \ingroup rpmtrans
- * Bit(s) to control rpmCheckSig() operation.
+ * Bit(s) to control rpmRunTransaction() operation.
  */
 typedef enum rpmtransFlags_e {
     RPMTRANS_FLAG_TEST         = (1 << 0),     /*!< from --test */
@@ -1090,6 +1090,7 @@ enum rpmVerifyAttrs_e {
 
 /** \ingroup rpmcli
  * Verify file attributes and MD5 sum.
+ * @todo python bindings prevent this from being static.
  * @param root         path to top of install tree
  * @param h            header
  * @param filenum      index of file in header file info arrays
@@ -1101,15 +1102,6 @@ int rpmVerifyFile(const char * root, Header h, int filenum,
        /*@out@*/ int * result, int omitMask);
 
 /** \ingroup rpmcli
- * Return exit code from running verify script in header.
- * @param root         path to top of install tree
- * @param h            header
- * @param err          file handle to use for stderr
- * @return             0 on success
- */
-int rpmVerifyScript(const char * root, Header h, FD_t err);
-
-/** \ingroup rpmcli
  * The command line argument will be used to retrieve header(s) ...
  */
 typedef enum rpmQVSources_e {
index 8c5850b..28f480c 100644 (file)
@@ -1208,7 +1208,7 @@ static void skipFiles(TFI_t * fi, int noDocs)
     if (languages) freeSplitString((char **)languages);
 }
 
-#define        NOTIFY(_x)      if (notify) (void) notify _x
+#define        NOTIFY(_ts, _al)        if ((_ts)->notify) (void) (_ts)->notify _al
 
 int rpmRunTransactions(        rpmTransactionSet ts,
                        rpmCallbackFunction notify, rpmCallbackData notifyData,
@@ -1218,7 +1218,6 @@ int rpmRunTransactions(   rpmTransactionSet ts,
     int i, j;
     int rc, ourrc = 0;
     struct availablePackage * alp;
-    rpmProblemSet probs;
     Header * hdrs;
     int totalFileCount = 0;
     hashTable ht;
@@ -1237,12 +1236,16 @@ int rpmRunTransactions( rpmTransactionSet ts,
 
     /* FIXME: what if the same package is included in ts twice? */
 
+    ts->transFlags = transFlags;
+    ts->notify = notify;
+    ts->notifyData = notifyData;
+    ts->ignoreSet = ignoreSet;
     if (ts->currDir)
        xfree(ts->currDir);
     ts->currDir = currentDirectory();
 
     /* Get available space on mounted file systems. */
-    if (!(ignoreSet & RPMPROB_FILTER_DISKSPACE) &&
+    if (!(ts->ignoreSet & RPMPROB_FILTER_DISKSPACE) &&
                !rpmGetFilesystemList(&filesystems, &filesystemCount)) {
        struct stat sb;
 
@@ -1293,7 +1296,7 @@ int rpmRunTransactions(   rpmTransactionSet ts,
        if (di) di[i].bsize = 0;
     }
 
-    probs = *newProbs = psCreate();
+    *newProbs = ts->probs = psCreate();
     hdrs = alloca(sizeof(*hdrs) * ts->addedPackages.size);
 
     /* ===============================================
@@ -1309,29 +1312,29 @@ int rpmRunTransactions( rpmTransactionSet ts,
        (alp - ts->addedPackages.list) < ts->addedPackages.size;
        alp++)
     {
-       if (!archOkay(alp->h) && !(ignoreSet & RPMPROB_FILTER_IGNOREARCH))
-           psAppend(probs, RPMPROB_BADARCH, alp->key, alp->h, NULL, NULL, 0);
+       if (!archOkay(alp->h) && !(ts->ignoreSet & RPMPROB_FILTER_IGNOREARCH))
+           psAppend(ts->probs, RPMPROB_BADARCH, alp->key, alp->h, NULL, NULL, 0);
 
-       if (!osOkay(alp->h) && !(ignoreSet & RPMPROB_FILTER_IGNOREOS))
-           psAppend(probs, RPMPROB_BADOS, alp->key, alp->h, NULL, NULL, 0);
+       if (!osOkay(alp->h) && !(ts->ignoreSet & RPMPROB_FILTER_IGNOREOS))
+           psAppend(ts->probs, RPMPROB_BADOS, alp->key, alp->h, NULL, NULL, 0);
 
-       if (!(ignoreSet & RPMPROB_FILTER_OLDPACKAGE)) {
+       if (!(ts->ignoreSet & RPMPROB_FILTER_OLDPACKAGE)) {
            rpmdbMatchIterator mi;
            Header oldH;
            mi = rpmdbInitIterator(ts->rpmdb, RPMTAG_NAME, alp->name, 0);
            while ((oldH = rpmdbNextIterator(mi)) != NULL)
-               ensureOlder(ts->rpmdb, alp->h, oldH, probs, alp->key);
+               ensureOlder(ts->rpmdb, alp->h, oldH, ts->probs, alp->key);
            rpmdbFreeIterator(mi);
        }
 
        /* XXX multilib should not display "already installed" problems */
-       if (!(ignoreSet & RPMPROB_FILTER_REPLACEPKG) && !alp->multiLib) {
+       if (!(ts->ignoreSet & RPMPROB_FILTER_REPLACEPKG) && !alp->multiLib) {
            rpmdbMatchIterator mi;
            mi = rpmdbInitIterator(ts->rpmdb, RPMTAG_NAME, alp->name, 0);
            rpmdbSetIteratorVersion(mi, alp->version);
            rpmdbSetIteratorRelease(mi, alp->release);
            while (rpmdbNextIterator(mi) != NULL) {
-               psAppend(probs, RPMPROB_PKG_INSTALLED, alp->key, alp->h,
+               psAppend(ts->probs, RPMPROB_PKG_INSTALLED, alp->key, alp->h,
                         NULL, NULL, 0);
                break;
            }
@@ -1391,8 +1394,8 @@ int rpmRunTransactions(   rpmTransactionSet ts,
 
            /* Allocate file actions (and initialize to RPMFILE_STATE_NORMAL) */
            fi->actions = xcalloc(fi->fc, sizeof(*fi->actions));
-           hdrs[i] = relocateFileList(alp, probs, alp->h, fi->actions,
-                                 ignoreSet & RPMPROB_FILTER_FORCERELOCATE);
+           hdrs[i] = relocateFileList(alp, ts->probs, alp->h, fi->actions,
+                                 ts->ignoreSet & RPMPROB_FILTER_FORCERELOCATE);
            fi->h = headerLink(hdrs[i]);
            fi->type = TR_ADDED;
            fi->ap = alp;
@@ -1472,7 +1475,7 @@ int rpmRunTransactions(   rpmTransactionSet ts,
            fi->replacedSizes = xcalloc(fi->fc, sizeof(*fi->replacedSizes));
 
            /* Skip netshared paths, not our i18n files, and excluded docs */
-           skipFiles(fi, transFlags & RPMTRANS_FLAG_NODOCS);
+           skipFiles(fi, ts->transFlags & RPMTRANS_FLAG_NODOCS);
            break;
        }
 
@@ -1500,7 +1503,8 @@ int rpmRunTransactions(   rpmTransactionSet ts,
        }
     }
 
-    NOTIFY((NULL, RPMCALLBACK_TRANS_START, 6, flEntries, NULL, notifyData));
+    NOTIFY(ts, (NULL, RPMCALLBACK_TRANS_START, 6, flEntries,
+       NULL, ts->notifyData));
 
     /* ===============================================
      * Compute file disposition for each package in transaction set.
@@ -1509,8 +1513,8 @@ int rpmRunTransactions(   rpmTransactionSet ts,
        dbiIndexSet * matches;
        int knownBad;
 
-       NOTIFY((NULL, RPMCALLBACK_TRANS_PROGRESS, (fi - flList), flEntries,
-              NULL, notifyData));
+       NOTIFY(ts, (NULL, RPMCALLBACK_TRANS_PROGRESS, (fi - flList), flEntries,
+              NULL, ts->notifyData));
 
        /* Extract file info for all files in this package from the database. */
        matches = xcalloc(sizeof(*matches), fi->fc);
@@ -1586,8 +1590,8 @@ int rpmRunTransactions(   rpmTransactionSet ts,
            switch (fi->type) {
            case TR_ADDED:
                handleInstInstalledFiles(fi, ts->rpmdb, shared, nexti - i,
-               !(beingRemoved || (ignoreSet & RPMPROB_FILTER_REPLACEOLDFILES)),
-                        probs, transFlags);
+               !(beingRemoved || (ts->ignoreSet & RPMPROB_FILTER_REPLACEOLDFILES)),
+                        ts->probs, ts->transFlags);
                break;
            case TR_REMOVED:
                if (!beingRemoved)
@@ -1600,7 +1604,7 @@ int rpmRunTransactions(   rpmTransactionSet ts,
 
        /* Update disk space needs on each partition for this package. */
        handleOverlappedFiles(fi, ht,
-              (ignoreSet & RPMPROB_FILTER_REPLACENEWFILES) ? NULL : probs, di);
+              (ts->ignoreSet & RPMPROB_FILTER_REPLACENEWFILES) ? NULL : ts->probs, di);
 
        /* Check added package has sufficient space on each partition used. */
        switch (fi->type) {
@@ -1609,11 +1613,11 @@ int rpmRunTransactions( rpmTransactionSet ts,
                break;
            for (i = 0; i < filesystemCount; i++) {
                if (adj_fs_blocks(di[i].bneeded) > di[i].bavail)
-                   psAppend(probs, RPMPROB_DISKSPACE, fi->ap->key, fi->ap->h,
+                   psAppend(ts->probs, RPMPROB_DISKSPACE, fi->ap->key, fi->ap->h,
                        filesystems[i], NULL,
                    (adj_fs_blocks(di[i].bneeded) - di[i].bavail) * di[i].bsize);
                if (adj_fs_blocks(di[i].ineeded) > di[i].iavail)
-                   psAppend(probs, RPMPROB_DISKNODES, fi->ap->key, fi->ap->h,
+                   psAppend(ts->probs, RPMPROB_DISKNODES, fi->ap->key, fi->ap->h,
                        filesystems[i], NULL,
                    (adj_fs_blocks(di[i].ineeded) - di[i].iavail));
            }
@@ -1623,7 +1627,8 @@ int rpmRunTransactions(   rpmTransactionSet ts,
        }
     }
 
-    NOTIFY((NULL, RPMCALLBACK_TRANS_STOP, 6, flEntries, NULL, notifyData));
+    NOTIFY(ts, (NULL, RPMCALLBACK_TRANS_STOP, 6, flEntries,
+       NULL, ts->notifyData));
 
     chroot(".");
     chdir(ts->currDir);
@@ -1658,9 +1663,9 @@ int rpmRunTransactions(   rpmTransactionSet ts,
     /* ===============================================
      * If unfiltered problems exist, free memory and return.
      */
-    if ((transFlags & RPMTRANS_FLAG_BUILD_PROBS) ||
-           (probs->numProblems && (!okProbs || psTrim(okProbs, probs)))) {
-       *newProbs = probs;
+    if ((ts->transFlags & RPMTRANS_FLAG_BUILD_PROBS) ||
+           (ts->probs->numProblems && (!okProbs || psTrim(okProbs, ts->probs)))) {
+       *newProbs = ts->probs;
 
        for (alp = ts->addedPackages.list, fi = flList;
                (alp - ts->addedPackages.list) < ts->addedPackages.size;
@@ -1684,20 +1689,20 @@ int rpmRunTransactions( rpmTransactionSet ts,
            i = ts->order[oc].u.addedIndex;
 
            if ((fd = alp->fd) == 0) {
-               fd = notify(fi->h, RPMCALLBACK_INST_OPEN_FILE, 0, 0,
-                           alp->key, notifyData);
+               fd = ts->notify(fi->h, RPMCALLBACK_INST_OPEN_FILE, 0, 0,
+                           alp->key, ts->notifyData);
                if (fd) {
                    Header h;
 
                    headerFree(hdrs[i]);
                    rc = rpmReadPackageHeader(fd, &h, NULL, NULL, NULL);
                    if (rc) {
-                       (void)notify(fi->h, RPMCALLBACK_INST_CLOSE_FILE, 0, 0,
-                                   alp->key, notifyData);
+                       (void)ts->notify(fi->h, RPMCALLBACK_INST_CLOSE_FILE, 0, 0,
+                                   alp->key, ts->notifyData);
                        ourrc++;
                        fd = NULL;
                    } else {
-                       hdrs[i] = relocateFileList(alp, probs, h, NULL, 1);
+                       hdrs[i] = relocateFileList(alp, ts->probs, h, NULL, 1);
                        headerFree(h);
                    }
                }
@@ -1706,13 +1711,11 @@ int rpmRunTransactions( rpmTransactionSet ts,
            if (fd) {
 
                if (alp->multiLib)
-                   transFlags |= RPMTRANS_FLAG_MULTILIB;
+                   ts->transFlags |= RPMTRANS_FLAG_MULTILIB;
 
-               if (installBinaryPackage(ts->rootDir, ts->rpmdb, fd,
-                                        hdrs[i], transFlags, notify,
-                                        notifyData, alp->key, fi->actions,
-                                        fi->fc ? fi->replaced : NULL,
-                                        ts->scriptFd)) {
+               if (installBinaryPackage(ts, fd, hdrs[i],
+                                        alp->key, fi->actions,
+                                        fi->fc ? fi->replaced : NULL)) {
                    ourrc++;
                    lastFailed = i;
                }
@@ -1724,8 +1727,8 @@ int rpmRunTransactions(   rpmTransactionSet ts,
            headerFree(hdrs[i]);
 
            if (alp->fd == NULL && fd)
-               (void)notify(fi->h, RPMCALLBACK_INST_CLOSE_FILE, 0, 0, alp->key,
-                  notifyData);
+               (void)ts->notify(fi->h, RPMCALLBACK_INST_CLOSE_FILE, 0, 0,
+                       alp->key, ts->notifyData);
            break;
        case TR_REMOVED:
          { unsigned int offset = fi->record;
@@ -1750,10 +1753,7 @@ int rpmRunTransactions(  rpmTransactionSet ts,
                rpmdbFreeIterator(mi);
            }
 
-           if (removeBinaryPackage(ts->rootDir, ts->rpmdb, offset, dbh,
-                               transFlags,
-                               notify, notifyData, dbh, fi->actions,
-                               ts->scriptFd))
+           if (removeBinaryPackage(ts, offset, dbh, dbh, fi->actions))
                ourrc++;
 
            headerFree(dbh);
index ee54d29..caf1609 100644 (file)
@@ -86,12 +86,10 @@ static int removeFile(const char * file, rpmfileAttrs fileAttrs, short mode,
     return 0;
 }
 
-int removeBinaryPackage(const char * rootdir, rpmdb rpmdb, unsigned int offset,
-                       Header h, rpmtransFlags transFlags,
-                       rpmCallbackFunction notify, rpmCallbackData notifyData,
-                       const void * pkgKey, enum fileActions * actions,
-                       FD_t scriptFd)
+int removeBinaryPackage(const rpmTransactionSet ts, unsigned int offset,
+               Header h, const void * pkgKey, enum fileActions * actions)
 {
+    rpmtransFlags transFlags = ts->transFlags;
     const char * name, * version, * release;
     const char ** baseNames;
     int scriptArg;
@@ -108,24 +106,24 @@ int removeBinaryPackage(const char * rootdir, rpmdb rpmdb, unsigned int offset,
      * When we run scripts, we pass an argument which is the number of 
      * versions of this package that will be installed when we are finished.
      */
-    if ((scriptArg = rpmdbCountPackages(rpmdb, name)) < 0)
+    if ((scriptArg = rpmdbCountPackages(ts->rpmdb, name)) < 0)
        return 1;
     scriptArg -= 1;
 
     if (!(transFlags & RPMTRANS_FLAG_NOTRIGGERS)) {
        /* run triggers from this package which are keyed on installed 
           packages */
-       if (runImmedTriggers(rootdir, rpmdb, RPMSENSE_TRIGGERUN, h, -1, scriptFd))
+       if (runImmedTriggers(ts, RPMSENSE_TRIGGERUN, h, -1))
            return 2;
 
        /* run triggers which are set off by the removal of this package */
-       if (runTriggers(rootdir, rpmdb, RPMSENSE_TRIGGERUN, h, -1, scriptFd))
+       if (runTriggers(ts, RPMSENSE_TRIGGERUN, h, -1))
            return 1;
     }
 
     if (!(transFlags & RPMTRANS_FLAG_TEST)) {
-       rc = runInstScript(rootdir, h, RPMTAG_PREUN, RPMTAG_PREUNPROG, scriptArg,
-                         (transFlags & RPMTRANS_FLAG_NOSCRIPTS), scriptFd);
+       rc = runInstScript(ts, h, RPMTAG_PREUN, RPMTAG_PREUNPROG, scriptArg,
+                         (transFlags & RPMTRANS_FLAG_NOSCRIPTS));
        if (rc)
            return 1;
     }
@@ -144,15 +142,15 @@ int removeBinaryPackage(const char * rootdir, rpmdb rpmdb, unsigned int offset,
        int type;
        char * fileName;
        int fnmaxlen;
-       int rdlen = (rootdir && !(rootdir[0] == '/' && rootdir[1] == '\0'))
-                       ? strlen(rootdir) : 0;
+       int rdlen = (ts->rootDir && !(ts->rootDir[0] == '/' && ts->rootDir[1] == '\0'))
+                       ? strlen(ts->rootDir) : 0;
 
        headerGetEntry(h, RPMTAG_DIRINDEXES, NULL, (void **) &dirIndexes,
                       NULL);
        headerGetEntry(h, RPMTAG_DIRNAMES, NULL, (void **) &dirNames,
                       NULL);
 
-       /* Get buffer for largest possible rootdir + dirname + filename. */
+       /* Get buffer for largest possible rootDir + dirname + filename. */
        fnmaxlen = 0;
        for (i = 0; i < fileCount; i++) {
                size_t fnlen;
@@ -166,7 +164,7 @@ int removeBinaryPackage(const char * rootdir, rpmdb rpmdb, unsigned int offset,
        fileName = alloca(fnmaxlen);
 
        if (rdlen) {
-           strcpy(fileName, rootdir);
+           strcpy(fileName, ts->rootDir);
            (void)rpmCleanPath(fileName);
            rdlen = strlen(fileName);
        } else
@@ -179,9 +177,9 @@ int removeBinaryPackage(const char * rootdir, rpmdb rpmdb, unsigned int offset,
        headerGetEntry(h, RPMTAG_FILEMODES, &type, (void **) &fileModesList, 
                 &fileCount);
 
-       if (notify) {
-           (void)notify(h, RPMCALLBACK_UNINST_START, fileCount, fileCount,
-               pkgKey, notifyData);
+       if (ts->notify) {
+           (void)ts->notify(h, RPMCALLBACK_UNINST_START, fileCount, fileCount,
+               pkgKey, ts->notifyData);
        }
 
        /* Traverse filelist backwards to help insure that rmdir() will work. */
@@ -194,18 +192,18 @@ int removeBinaryPackage(const char * rootdir, rpmdb rpmdb, unsigned int offset,
                        fileName, fileActionString(actions[i]));
 
            if (!(transFlags & RPMTRANS_FLAG_TEST)) {
-               if (notify) {
-                   (void)notify(h, RPMCALLBACK_UNINST_PROGRESS,
-                       i, actions[i], fileName, notifyData);
+               if (ts->notify) {
+                   (void)ts->notify(h, RPMCALLBACK_UNINST_PROGRESS,
+                       i, actions[i], fileName, ts->notifyData);
                }
                removeFile(fileName, fileFlagsList[i], fileModesList[i], 
                           actions[i]);
            }
        }
 
-       if (notify) {
-           (void)notify(h, RPMCALLBACK_UNINST_STOP, 0, fileCount,
-                       pkgKey, notifyData);
+       if (ts->notify) {
+           (void)ts->notify(h, RPMCALLBACK_UNINST_STOP, 0, fileCount,
+                       pkgKey, ts->notifyData);
        }
 
        free(baseNames);
@@ -215,38 +213,37 @@ int removeBinaryPackage(const char * rootdir, rpmdb rpmdb, unsigned int offset,
 
     if (!(transFlags & RPMTRANS_FLAG_TEST)) {
        rpmMessage(RPMMESS_DEBUG, _("running postuninstall script (if any)\n"));
-       rc = runInstScript(rootdir, h, RPMTAG_POSTUN, RPMTAG_POSTUNPROG,
-                       scriptArg, (transFlags & RPMTRANS_FLAG_NOSCRIPTS), scriptFd);
+       rc = runInstScript(ts, h, RPMTAG_POSTUN, RPMTAG_POSTUNPROG,
+                       scriptArg, (transFlags & RPMTRANS_FLAG_NOSCRIPTS));
        /* XXX postun failures are not cause for erasure failure. */
     }
 
     if (!(transFlags & RPMTRANS_FLAG_NOTRIGGERS)) {
        /* Run postun triggers which are set off by this package's removal. */
-       rc = runTriggers(rootdir, rpmdb, RPMSENSE_TRIGGERPOSTUN, h,
-                       -1, scriptFd);
+       rc = runTriggers(ts, RPMSENSE_TRIGGERPOSTUN, h, -1);
        if (rc)
            return 2;
     }
 
     if (!(transFlags & RPMTRANS_FLAG_TEST))
-       rpmdbRemove(rpmdb, offset);
+       rpmdbRemove(ts->rpmdb, offset);
 
     return 0;
 }
 
 /**
+ * @param ts           transaction set
  * @param h            header
- * @param root         path to top of install tree
  * @param progArgc
  * @param progArgv
  * @param script
  * @param arg1
  * @param arg2
- * @param errfd
  * @return
  */
-static int runScript(Header h, const char * root, int progArgc, const char ** progArgv, 
-                    const char * script, int arg1, int arg2, FD_t errfd)
+static int runScript(const rpmTransactionSet ts, Header h,
+               int progArgc, const char ** progArgv, 
+               const char * script, int arg1, int arg2)
 {
     const char ** argv = NULL;
     int argc = 0;
@@ -296,7 +293,7 @@ static int runScript(Header h, const char * root, int progArgc, const char ** pr
 
     if (script) {
        FD_t fd;
-       if (makeTempFile(root, &fn, &fd)) {
+       if (makeTempFile(ts->rootDir, &fn, &fd)) {
            if (freePrefixes) free(prefixes);
            return 1;
        }
@@ -308,7 +305,7 @@ static int runScript(Header h, const char * root, int progArgc, const char ** pr
        (void)Fwrite(script, sizeof(script[0]), strlen(script), fd);
        Fclose(fd);
 
-       argv[argc++] = fn + strlen(root);
+       argv[argc++] = fn + strlen(ts->rootDir);
        if (arg1 >= 0) {
            char *av = alloca(20);
            sprintf(av, "%d", arg1);
@@ -323,13 +320,13 @@ static int runScript(Header h, const char * root, int progArgc, const char ** pr
 
     argv[argc] = NULL;
 
-    if (errfd != NULL) {
+    if (ts->scriptFd != NULL) {
        if (rpmIsVerbose()) {
-           out = fdDup(Fileno(errfd));
+           out = fdDup(Fileno(ts->scriptFd));
        } else {
            out = Fopen("/dev/null", "w.fdio");
            if (Ferror(out)) {
-               out = fdDup(Fileno(errfd));
+               out = fdDup(Fileno(ts->scriptFd));
            }
        }
     } else {
@@ -347,17 +344,17 @@ static int runScript(Header h, const char * root, int progArgc, const char ** pr
        dup2(pipes[0], STDIN_FILENO);
        close(pipes[0]);
 
-       if (errfd != NULL) {
-           if (Fileno(errfd) != STDERR_FILENO)
-               dup2(Fileno(errfd), STDERR_FILENO);
+       if (ts->scriptFd != NULL) {
+           if (Fileno(ts->scriptFd) != STDERR_FILENO)
+               dup2(Fileno(ts->scriptFd), STDERR_FILENO);
            if (Fileno(out) != STDOUT_FILENO)
                dup2(Fileno(out), STDOUT_FILENO);
            /* make sure we don't close stdin/stderr/stdout by mistake! */
-           if (Fileno(out) > STDERR_FILENO && Fileno(out) != Fileno(errfd)) {
+           if (Fileno(out) > STDERR_FILENO && Fileno(out) != Fileno(ts->scriptFd)) {
                Fclose (out);
            }
-           if (Fileno(errfd) > STDERR_FILENO) {
-               Fclose (errfd);
+           if (Fileno(ts->scriptFd) > STDERR_FILENO) {
+               Fclose (ts->scriptFd);
            }
        }
 
@@ -381,14 +378,14 @@ static int runScript(Header h, const char * root, int progArgc, const char ** pr
            }
        }
 
-       switch(urlIsURL(root)) {
+       switch(urlIsURL(ts->rootDir)) {
        case URL_IS_PATH:
-           root += sizeof("file://") - 1;
-           root = strchr(root, '/');
+           ts->rootDir += sizeof("file://") - 1;
+           ts->rootDir = strchr(ts->rootDir, '/');
            /*@fallthrough@*/
        case URL_IS_UNKNOWN:
-           if (strcmp(root, "/"))
-               /*@-unrecog@*/ chroot(root); /*@=unrecog@*/
+           if (strcmp(ts->rootDir, "/"))
+               /*@-unrecog@*/ chroot(ts->rootDir); /*@=unrecog@*/
            chdir("/");
            execv(argv[0], (char *const *)argv);
            break;
@@ -424,8 +421,8 @@ static int runScript(Header h, const char * root, int progArgc, const char ** pr
     return 0;
 }
 
-int runInstScript(const char * root, Header h, int scriptTag, int progTag,
-                 int arg, int norunScripts, FD_t err)
+int runInstScript(const rpmTransactionSet ts, Header h,
+               int scriptTag, int progTag, int arg, int norunScripts)
 {
     void ** programArgv;
     int programArgc;
@@ -449,27 +446,25 @@ int runInstScript(const char * root, Header h, int scriptTag, int progTag,
        argv = (const char **) programArgv;
     }
 
-    rc = runScript(h, root, programArgc, argv, script, arg, -1, err);
+    rc = runScript(ts, h, programArgc, argv, script, arg, -1);
     if (programArgv && programType == RPM_STRING_ARRAY_TYPE) free(programArgv);
     return rc;
 }
 
 /**
- * @param root         path to top of install tree
- * @param db           rpm database
+ * @param ts           transaction set
  * @param sense
  * @param sourceH
  * @param triggeredH
  * @param arg1correction
  * @param arg2
  * @param triggersAlreadyRun
- * @param scriptFd
  * @return
  */
-static int handleOneTrigger(const char * root, rpmdb db, int sense,
+static int handleOneTrigger(const rpmTransactionSet ts, int sense,
                        Header sourceH, Header triggeredH,
                        int arg1correction, int arg2,
-                       char * triggersAlreadyRun, FD_t scriptFd)
+                       char * triggersAlreadyRun)
 {
     const char ** triggerNames;
     const char ** triggerEVR;
@@ -501,8 +496,7 @@ static int handleOneTrigger(const char * root, rpmdb db, int sense,
        if (!(triggerFlags[i] & sense)) continue;
        if (strcmp(triggerNames[i], sourceName)) continue;
 
-       /* For some reason, the TRIGGERVERSION stuff includes the name
-          of the package which the trigger is based on. We need to skip
+       /* For some reason, the TRIGGERVERSION stuff includes the name of the package which the trigger is based on. We need to skip
           over that here. I suspect that we'll change our minds on this
           and remove that, so I'm going to just 'do the right thing'. */
        skip = strlen(triggerNames[i]);
@@ -528,15 +522,15 @@ static int handleOneTrigger(const char * root, rpmdb db, int sense,
        {   int arg1;
            int index;
 
-           if ((arg1 = rpmdbCountPackages(db, triggerPackageName)) < 0) {
+           if ((arg1 = rpmdbCountPackages(ts->rpmdb, triggerPackageName)) < 0) {
                rc = 1; /* XXX W2DO? same as "execution of script failed" */
            } else {
                arg1 += arg1correction;
                index = triggerIndices[i];
                if (!triggersAlreadyRun || !triggersAlreadyRun[index]) {
-                   rc = runScript(triggeredH, root, 1, triggerProgs + index,
+                   rc = runScript(ts, triggeredH, 1, triggerProgs + index,
                            triggerScripts[index], 
-                           arg1, arg2, scriptFd);
+                           arg1, arg2);
                    if (triggersAlreadyRun) triggersAlreadyRun[index] = 1;
                }
            }
@@ -555,8 +549,8 @@ static int handleOneTrigger(const char * root, rpmdb db, int sense,
     return rc;
 }
 
-int runTriggers(const char * root, rpmdb db, int sense, Header h,
-               int countCorrection, FD_t scriptFd)
+int runTriggers(const rpmTransactionSet ts, int sense, Header h,
+               int countCorrection)
 {
     const char * name;
     int numPackage;
@@ -564,17 +558,17 @@ int runTriggers(const char * root, rpmdb db, int sense, Header h,
 
     headerNVR(h, &name, NULL, NULL);
 
-    numPackage = rpmdbCountPackages(db, name);
+    numPackage = rpmdbCountPackages(ts->rpmdb, name);
     if (numPackage < 0)
        return 1;
 
     {  Header triggeredH;
        rpmdbMatchIterator mi;
 
-       mi = rpmdbInitIterator(db, RPMTAG_TRIGGERNAME, name, 0);
+       mi = rpmdbInitIterator(ts->rpmdb, RPMTAG_TRIGGERNAME, name, 0);
        while((triggeredH = rpmdbNextIterator(mi)) != NULL) {
-           rc |= handleOneTrigger(root, db, sense, h, triggeredH, 0, numPackage, 
-                              NULL, scriptFd);
+           rc |= handleOneTrigger(ts, sense, h, triggeredH, 0, numPackage, 
+                              NULL);
        }
 
        rpmdbFreeIterator(mi);
@@ -583,8 +577,8 @@ int runTriggers(const char * root, rpmdb db, int sense, Header h,
     return rc;
 }
 
-int runImmedTriggers(const char * root, rpmdb db, int sense, Header h,
-                    int countCorrection, FD_t scriptFd)
+int runImmedTriggers(const rpmTransactionSet ts, int sense, Header h,
+                    int countCorrection)
 {
     const char ** triggerNames;
     int numTriggers;
@@ -610,12 +604,12 @@ int runImmedTriggers(const char * root, rpmdb db, int sense, Header h,
 
            if (triggersRun[triggerIndices[i]]) continue;
        
-           mi = rpmdbInitIterator(db, RPMTAG_NAME, name, 0);
+           mi = rpmdbInitIterator(ts->rpmdb, RPMTAG_NAME, name, 0);
 
            while((sourceH = rpmdbNextIterator(mi)) != NULL) {
-               rc |= handleOneTrigger(root, db, sense, sourceH, h, 
+               rc |= handleOneTrigger(ts, sense, sourceH, h, 
                                   countCorrection, rpmdbGetIteratorCount(mi),
-                                  triggersRun, scriptFd);
+                                  triggersRun);
            }
 
            rpmdbFreeIterator(mi);
index 25f6a9f..c33d1a0 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "md5.h"
 #include "misc.h"
+#include "depends.h"
 #include "install.h"
 
 #include "build/rpmbuild.h"
@@ -45,8 +46,6 @@ struct poptOption rpmVerifyPoptTable[] = {
 };
 
 /* ======================================================================== */
-/* XXX static */
-/** */
 int rpmVerifyFile(const char * prefix, Header h, int filenum, int * result, 
                  int omitMask)
 {
@@ -243,12 +242,24 @@ int rpmVerifyFile(const char * prefix, Header h, int filenum, int * result,
     return 0;
 }
 
-/* XXX static */
-/** */
-int rpmVerifyScript(const char * root, Header h, FD_t err)
+/**
+ * Return exit code from running verify script in header.
+ * @param rootDir      path to top of install tree
+ * @param rpmdb                rpm database
+ * @param h            header
+ * @param scriptFd     file handle to use for stderr
+ * @return             0 on success
+ */
+static int rpmVerifyScript(const char * rootDir, rpmdb rpmdb, Header h, FD_t scriptFd)
 {
-    return runInstScript(root, h, RPMTAG_VERIFYSCRIPT, RPMTAG_VERIFYSCRIPTPROG,
-                    0, 0, err);
+    rpmTransactionSet ts = rpmtransCreateSet(rpmdb, rootDir);
+    int rc;
+
+    ts->scriptFd = scriptFd;
+    rc = runInstScript(ts, h, RPMTAG_VERIFYSCRIPT, RPMTAG_VERIFYSCRIPTPROG,
+                    0, 0);
+    rpmtransFree(ts);
+    return rc;
 }
 
 /* ======================================================================== */
@@ -351,9 +362,10 @@ static int verifyDependencies(/*@only@*/ rpmdb rpmdb, Header h) {
 
 int showVerifyPackage(QVA_t *qva, rpmdb rpmdb, Header h)
 {
-    int ec, rc;
     FD_t fdo;
-    ec = 0;
+    int ec = 0;
+    int rc;
+
     if ((qva->qva_flags & VERIFY_DEPS) &&
        (rc = verifyDependencies(rpmdb, h)) != 0)
            ec = rc;
@@ -362,7 +374,7 @@ int showVerifyPackage(QVA_t *qva, rpmdb rpmdb, Header h)
            ec = rc;;
     fdo = fdDup(STDOUT_FILENO);
     if ((qva->qva_flags & VERIFY_SCRIPT) &&
-       (rc = rpmVerifyScript(qva->qva_prefix, h, fdo)) != 0)
+       (rc = rpmVerifyScript(qva->qva_prefix, rpmdb, h, fdo)) != 0)
            ec = rc;
     Fclose(fdo);
     return ec;
index 70247c3..f2e5247 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-10-20 12:42-0400\n"
+"POT-Creation-Date: 2000-10-20 15:49-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -2518,7 +2518,7 @@ msgstr ""
 msgid "grabData() RPM_STRING_TYPE count must be 1.\n"
 msgstr ""
 
-#: lib/header.c:275 lib/header.c:745 lib/install.c:351
+#: lib/header.c:275 lib/header.c:745 lib/install.c:352
 #, c-format
 msgid "Data type %d not supported\n"
 msgstr ""
@@ -2589,81 +2589,81 @@ msgstr ""
 msgid "(unknown type)"
 msgstr ""
 
-#: lib/install.c:168 lib/uninstall.c:193
+#: lib/install.c:169 lib/uninstall.c:191
 #, c-format
 msgid "   file: %s action: %s\n"
 msgstr ""
 
-#: lib/install.c:189
+#: lib/install.c:190
 #, c-format
 msgid "user %s does not exist - using root"
 msgstr ""
 
-#: lib/install.c:197
+#: lib/install.c:198
 #, c-format
 msgid "group %s does not exist - using root"
 msgstr ""
 
-#: lib/install.c:230
+#: lib/install.c:231
 msgid "%%instchangelog value in macro file should be a number, but isn't"
 msgstr ""
 
 #. this would probably be a good place to check if disk space
 #. was used up - if so, we should return a different error
 #. XXX FIXME: Fclose with libio destroys errno
-#: lib/install.c:612
+#: lib/install.c:613
 #, c-format
 msgid "unpacking of archive failed%s%s: %s"
 msgstr ""
 
-#: lib/install.c:613
+#: lib/install.c:614
 msgid " on file "
 msgstr ""
 
-#: lib/install.c:657
+#: lib/install.c:658
 msgid "installing a source package\n"
 msgstr ""
 
-#: lib/install.c:677
+#: lib/install.c:678
 #, c-format
 msgid "cannot create sourcedir %s"
 msgstr ""
 
-#: lib/install.c:683 lib/install.c:713
+#: lib/install.c:684 lib/install.c:714
 #, c-format
 msgid "cannot write to %s"
 msgstr ""
 
-#: lib/install.c:687
+#: lib/install.c:688
 #, c-format
 msgid "sources in: %s\n"
 msgstr ""
 
-#: lib/install.c:707
+#: lib/install.c:708
 #, c-format
 msgid "cannot create specdir %s"
 msgstr ""
 
-#: lib/install.c:717
+#: lib/install.c:718
 #, c-format
 msgid "spec file in: %s\n"
 msgstr ""
 
-#: lib/install.c:749 lib/install.c:777
+#: lib/install.c:750 lib/install.c:778
 msgid "source package contains no .spec file"
 msgstr ""
 
-#: lib/install.c:795
+#: lib/install.c:796
 #, c-format
 msgid "renaming %s to %s\n"
 msgstr ""
 
-#: lib/install.c:797 lib/install.c:1062 lib/uninstall.c:40
+#: lib/install.c:798 lib/install.c:1070 lib/uninstall.c:40
 #, c-format
 msgid "rename of %s to %s failed: %s"
 msgstr ""
 
-#: lib/install.c:887
+#: lib/install.c:888
 msgid "source package expected, binary found"
 msgstr ""
 
@@ -2680,17 +2680,17 @@ msgstr ""
 msgid "running preinstall script (if any)\n"
 msgstr ""
 
-#: lib/install.c:1022
+#: lib/install.c:1030
 #, c-format
 msgid "warning: %s created as %s"
 msgstr ""
 
-#: lib/install.c:1058
+#: lib/install.c:1066
 #, c-format
 msgid "warning: %s saved as %s"
 msgstr ""
 
-#: lib/install.c:1147
+#: lib/install.c:1155
 msgid "running postinstall scripts (if any)\n"
 msgstr ""
 
@@ -3715,38 +3715,38 @@ msgstr ""
 msgid "removal of %s failed: %s"
 msgstr ""
 
-#: lib/uninstall.c:133
+#: lib/uninstall.c:131
 #, c-format
 msgid "will remove files test = %d\n"
 msgstr ""
 
-#: lib/uninstall.c:217
+#: lib/uninstall.c:215
 msgid "running postuninstall script (if any)\n"
 msgstr ""
 
-#: lib/uninstall.c:419
+#: lib/uninstall.c:416
 #, c-format
 msgid "execution of %s-%s-%s script failed, exit status %d"
 msgstr ""
 
-#: lib/verify.c:43
+#: lib/verify.c:44
 msgid "don't verify files in package"
 msgstr ""
 
-#: lib/verify.c:219
+#: lib/verify.c:218
 msgid "package lacks both user name and id lists (this should never happen)"
 msgstr ""
 
-#: lib/verify.c:237
+#: lib/verify.c:236
 msgid "package lacks both group name and id lists (this should never happen)"
 msgstr ""
 
-#: lib/verify.c:273
+#: lib/verify.c:284
 #, c-format
 msgid "missing    %s\n"
 msgstr ""
 
-#: lib/verify.c:335
+#: lib/verify.c:346
 #, c-format
 msgid "Unsatisfied dependencies for %s-%s-%s: "
 msgstr ""