- pass rpmTransactionSet, not elements, to installBinaryPackage et al.
CVS patchset: 4221 CVS date: 2000/10/20 22:04:27
This commit is contained in:
parent
8699b8a123
commit
03efb685f1
3
CHANGES
3
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.
|
||||
|
|
21
lib/cpio.h
21
lib/cpio.h
|
@ -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) /*@*/;
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 h header
|
||||
* @param countCorrection
|
||||
* @param scriptFd
|
||||
*/
|
||||
int runTriggers(const char * root, rpmdb rpmdb, int sense, Header h,
|
||||
int countCorrection, FD_t scriptFd);
|
||||
|
||||
/**
|
||||
* 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 runTriggers(const rpmTransactionSet ts, int sense, Header h,
|
||||
int countCorrection);
|
||||
|
||||
/**
|
||||
* Run triggers from header that are fired by the database.
|
||||
* @param ts transaction set
|
||||
* @param sense @todo Document.
|
||||
* @param h header
|
||||
* @param countCorrection @todo Document.
|
||||
* @return 0 on success, 1 on error
|
||||
*/
|
||||
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
|
||||
}
|
||||
|
|
12
lib/rpmlib.h
12
lib/rpmlib.h
|
@ -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
|
||||
|
@ -1100,15 +1101,6 @@ enum rpmVerifyAttrs_e {
|
|||
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) ...
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
138
lib/uninstall.c
138
lib/uninstall.c
|
@ -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);
|
||||
|
|
32
lib/verify.c
32
lib/verify.c
|
@ -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;
|
||||
|
|
58
po/rpm.pot
58
po/rpm.pot
|
@ -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 ""
|
||||
|
|
Loading…
Reference in New Issue