Package state machine to handle a package from a transaction set. More...
#include "system.h"
#include <rpmio_internal.h>
#include <rpmcb.h>
#include <rpmmacro.h>
#include <rpmurl.h>
#include <rpmlua.h>
#include <rpmtag.h>
#include <rpmlib.h>
#include "cpio.h"
#include "fsm.h"
#include "psm.h"
#include <rpmsq.h>
#include "rpmds.h"
#include "rpmte.h"
#include "rpmts.h"
#include <pkgio.h>
#include "misc.h"
#include "rpmdb.h"
#include "signature.h"
#include "debug.h"
Go to the source code of this file.
Defines | |
#define | _RPMFI_INTERNAL |
#define | _RPMSQ_INTERNAL |
#define | _RPMEVR_INTERNAL |
#define | _RPMTE_INTERNAL |
#define | _RPMTS_INTERNAL |
#define | _PSM_DEBUG 0 |
Functions | |
int | rpmVersionCompare (Header first, Header second) |
Compare headers to determine which header is "newer". | |
static rpmRC | markReplacedFiles (const rpmpsm psm) |
Mark files in database shared with this package as "replaced". | |
rpmRC | rpmInstallSourcePackage (rpmts ts, void *_fd, const char **specFilePtr, const char **cookie) |
Install source package. | |
static const char * | tag2sln (int tag) |
Return scriptlet name from tag. | |
static rpmScriptID | tag2slx (int tag) |
Return scriptlet id from tag. | |
static pid_t | psmWait (rpmpsm psm) |
Wait for child process to be reaped. | |
static rpmRC | runScript (rpmpsm psm, Header h, const char *sln, int progArgc, const char **progArgv, const char *script, int arg1, int arg2) |
Run scriptlet with args. | |
static rpmRC | runInstScript (rpmpsm psm) |
Retrieve and run scriptlet from header. | |
static rpmRC | handleOneTrigger (const rpmpsm psm, Header sourceH, Header triggeredH, int arg2, unsigned char *triggersAlreadyRun) |
Execute triggers. | |
static rpmRC | runTriggers (rpmpsm psm) |
Run trigger scripts in the database that are fired by this header. | |
static rpmRC | runImmedTriggers (rpmpsm psm) |
Run triggers from this header that are fired by headers in the database. | |
static const char * | pkgStageString (pkgStage a) |
rpmpsm | XrpmpsmUnlink (rpmpsm psm, const char *msg, const char *fn, unsigned ln) |
rpmpsm | XrpmpsmLink (rpmpsm psm, const char *msg, const char *fn, unsigned ln) |
rpmpsm | rpmpsmFree (rpmpsm psm) |
Destroy a package state machine. | |
rpmpsm | rpmpsmNew (rpmts ts, rpmte te, rpmfi fi) |
Create and load a package state machine. | |
static uint32_t | hLoadTID (Header h, rpmTag tag) |
Load a transaction id from a header. | |
static int | hCopyTag (Header sh, Header th, rpmTag tag) |
Copy a tag from a source to a target header. | |
static int | hSaveBlinks (Header h, const struct rpmChainLink_s *blink) |
Save backward link(s) of an upgrade chain into a header. | |
static int | hSaveFlinks (Header h, const struct rpmChainLink_s *flink) |
Save forward link(s) of an upgrade chain into a header. | |
static int | populateInstallHeader (const rpmts ts, const rpmte te, rpmfi fi) |
Add per-transaction data to an install header. | |
static int | postPopulateInstallHeader (const rpmts ts, const rpmte te, rpmfi fi) |
Add fi->states to an install header. | |
static int | rpmpsmNext (rpmpsm psm, pkgStage nstage) |
rpmRC | rpmpsmStage (rpmpsm psm, pkgStage stage) |
Package state machine driver. | |
Variables | |
int | _psm_debug = 0 |
int | _psm_threads = 0 |
static char * | SCRIPT_PATH = "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin" |
static int | ldconfig_done = 0 |
static const char * | ldconfig_path = "/sbin/ldconfig" |
Package state machine to handle a package from a transaction set.
Definition in file psm.c.
static rpmRC handleOneTrigger | ( | const rpmpsm | psm, | |
Header | sourceH, | |||
Header | triggeredH, | |||
int | arg2, | |||
unsigned char * | triggersAlreadyRun | |||
) | [static] |
Execute triggers.
psm | package state machine data | |
sourceH | ||
triggeredH | ||
arg2 | ||
triggersAlreadyRun |
Definition at line 1048 of file psm.c.
References _free(), alloca(), rpmDataType_u::argv, rpmpsm_s::countCorrection, headerGet(), _HE_s::p, rpmdbCountPackages(), rpmdsAnyMatchesDep(), rpmdsFlags(), rpmdsFree(), rpmdsInit(), rpmdsN(), rpmdsNew(), rpmdsNext(), rpmdsSetNoPromote(), RPMRC_FAIL, RPMRC_OK, rpmtsGetRdb(), runScript(), rpmpsm_s::sense, rpmDataType_u::str, _HE_s::tag, rpmpsm_s::ts, and rpmDataType_u::ui32p.
Referenced by runImmedTriggers(), and runTriggers().
Copy a tag from a source to a target header.
sh | source header | |
th | target header | |
tag | tag to copy |
Definition at line 1406 of file psm.c.
References _free(), alloca(), _HE_s::c, headerGet(), headerPut(), _HE_s::p, rpmDataType_u::ptr, and _HE_s::tag.
Referenced by rpmpsmStage().
Load a transaction id from a header.
h | header | |
tag | tag to load |
Definition at line 1385 of file psm.c.
References _free(), alloca(), headerGet(), _HE_s::p, rpmDataType_u::ptr, _HE_s::tag, and rpmDataType_u::ui32p.
Referenced by rpmpsmStage().
static int hSaveBlinks | ( | Header | h, | |
const struct rpmChainLink_s * | blink | |||
) | [static] |
Save backward link(s) of an upgrade chain into a header.
h | header | |
*blink | backward links |
Definition at line 1425 of file psm.c.
References alloca(), rpmDataType_u::argv, argvCount(), argvData(), _HE_s::c, headerPut(), _HE_s::p, RPM_STRING_ARRAY_TYPE, RPMTE_CHAIN_END, _HE_s::t, and _HE_s::tag.
Referenced by populateInstallHeader().
static int hSaveFlinks | ( | Header | h, | |
const struct rpmChainLink_s * | flink | |||
) | [static] |
Save forward link(s) of an upgrade chain into a header.
h | header | |
*flink | forward links |
Definition at line 1480 of file psm.c.
References alloca(), rpmDataType_u::argv, argvCount(), argvData(), _HE_s::c, headerPut(), _HE_s::p, RPM_STRING_ARRAY_TYPE, RPMTE_CHAIN_END, _HE_s::t, and _HE_s::tag.
Referenced by rpmpsmStage().
Mark files in database shared with this package as "replaced".
psm | package state machine data |
Definition at line 106 of file psm.c.
References _free(), alloca(), _HE_s::c, rpmpsm_s::fi, headerGet(), _HE_s::p, rpmDataType_u::ptr, rpmdbAppendIterator(), rpmdbFreeIterator(), rpmdbGetIteratorOffset(), RPMDBI_PACKAGES, rpmdbNextIterator(), rpmdbSetIteratorModified(), rpmdbSetIteratorRewrite(), rpmfiFC(), RPMFILE_STATE_REPLACED, RPMRC_OK, rpmtsInitIterator(), _HE_s::tag, rpmpsm_s::te, rpmpsm_s::ts, and rpmDataType_u::ui8p.
Referenced by rpmpsmStage().
static const char* pkgStageString | ( | pkgStage | a | ) | [static] |
Definition at line 1262 of file psm.c.
References PSM_CHROOT_IN, PSM_CHROOT_OUT, PSM_COMMIT, PSM_CREATE, PSM_DESTROY, PSM_FINI, PSM_IMMED_TRIGGERS, PSM_INIT, PSM_NOTIFY, PSM_PKGCOMMIT, PSM_PKGERASE, PSM_PKGINSTALL, PSM_PKGSAVE, PSM_POST, PSM_PRE, PSM_PROCESS, PSM_RPMDB_ADD, PSM_RPMDB_LOAD, PSM_RPMDB_REMOVE, PSM_RPMIO_FLAGS, PSM_SCRIPT, PSM_TRIGGERS, PSM_UNDO, and PSM_UNKNOWN.
Referenced by rpmpsmStage().
Add per-transaction data to an install header.
ts | transaction set | |
te | transaction element | |
fi | file info set |
Definition at line 1547 of file psm.c.
References alloca(), _HE_s::c, headerGetOrigin(), headerPut(), hSaveBlinks(), _HE_s::p, RPM_STRING_TYPE, RPM_UINT32_TYPE, rpmfiFC(), rpmteColor(), RPMTRANS_TYPE_ROLLBACK, rpmtsColor(), rpmtsType(), rpmDataType_u::str, _HE_s::t, _HE_s::tag, and rpmDataType_u::ui32p.
Referenced by rpmpsmStage().
Add fi->states to an install header.
ts | transaction set | |
te | transaction element | |
fi | file info set |
Definition at line 1602 of file psm.c.
References alloca(), _HE_s::c, headerPut(), _HE_s::p, RPM_UINT8_TYPE, rpmfiFC(), _HE_s::t, _HE_s::tag, and rpmDataType_u::ui8p.
Referenced by rpmpsmStage().
static pid_t psmWait | ( | rpmpsm | psm | ) | [static] |
Wait for child process to be reaped.
psm | package state machine data |
Definition at line 486 of file psm.c.
References D_, rpmlog(), RPMLOG_DEBUG, RPMSCRIPT_STATE_REAPED, rpmsqWait(), rpmswAdd(), RPMTS_OP_SCRIPTLETS, rpmtsOp(), rpmpsm_s::scriptTag, rpmpsm_s::sq, rpmpsm_s::sstates, rpmpsm_s::stepName, tag2slx(), and rpmpsm_s::ts.
Referenced by runScript().
rpmRC rpmInstallSourcePackage | ( | rpmts | ts, | |
void * | _fd, | |||
const char ** | specFilePtr, | |||
const char ** | cookie | |||
) |
Install source package.
ts | transaction set | |
_fd | file handle |
specFilePtr | address of spec file name (or NULL) | |
cookie | address of cookie pointer (or NULL) |
Definition at line 184 of file psm.c.
References _, _free(), Access(), alloca(), rpmDataType_u::argv, CPIO_MAP_GID, CPIO_MAP_MODE, CPIO_MAP_PATH, CPIO_MAP_UID, FA_CREATE, Fclose(), fdLink, headerFree(), headerGet(), headerIsEntry(), headerLink(), headerMacrosLoad(), _HE_s::p, PSM_FINI, PSM_PKGINSTALL, PSM_PROCESS, rpmExpand(), rpmfiFree(), RPMFILE_SPECFILE, rpmfiLink, rpmfiNew(), rpmGenPath(), rpmlog(), RPMLOG_ERR, rpmMkdirPath(), rpmpsmStage(), RPMRC_FAIL, RPMRC_NOKEY, RPMRC_NOTTRUSTED, RPMRC_OK, rpmReadPackageFile(), rpmteSetHeader(), rpmtsAddInstallElement(), rpmtsClean(), rpmtsElement(), rpmtsFree(), rpmtsLink, rpmtsRootDir(), stpcpy(), rpmDataType_u::str, _HE_s::tag, W_OK, and xmalloc().
Referenced by rpmInstallSource().
Destroy a package state machine.
psm | package state machine |
Definition at line 1326 of file psm.c.
References _free(), rpmpsm_s::fi, rpmpsm_s::nrefs, rpmfiFree(), rpmpsmUnlink, rpmteFree(), rpmtsFree(), rpmpsm_s::sstates, rpmpsm_s::te, and rpmpsm_s::ts.
Referenced by _processFailedPackage(), rpmtsRun(), and rpmVerifyScript().
Create and load a package state machine.
ts | transaction set | |
te | transaction set element | |
fi | file info set |
Definition at line 1359 of file psm.c.
References rpmpsm_s::fi, rpmfiLink, rpmpsmLink, RPMSCRIPT_MAX, rpmtsLink, rpmpsm_s::sstates, rpmpsm_s::te, rpmpsm_s::ts, and xcalloc().
Referenced by _processFailedPackage(), rpmtsRun(), and rpmVerifyScript().
Definition at line 1632 of file psm.c.
References _psm_threads, rpmpsm_s::nstage, rpmpsmStage(), rpmsqJoin(), and rpmsqThread().
Referenced by rpmpsmStage().
Package state machine driver.
Definition at line 1649 of file psm.c.
References _, _free(), alloca(), rpmpsm_s::amount, rpmDataType_u::argv, _HE_s::c, rpmpsm_s::cfd, Chdir(), Chroot(), rpmpsm_s::chrootDone, rpmpsm_s::countCorrection, CPIO_MAP_GID, CPIO_MAP_MODE, CPIO_MAP_PATH, CPIO_MAP_UID, CPIO_SBIT_CHECK, cpioStrerror(), D_, dbiOpen(), errno, FA_COPYOUT, rpmpsm_s::failedFile, Fclose(), rpmpsm_s::fd, fdDup(), Fdopen(), FDSTAT_DIGEST, fdstat_op(), FDSTAT_READ, FDSTAT_WRITE, Ferror(), Fflush(), rpmpsm_s::fi, Fileno(), Fopen(), FSM_PKGBUILD, FSM_PKGCOMMIT, FSM_PKGERASE, FSM_PKGINSTALL, fsmSetup(), fsmTeardown(), Fstrerror(), rpmpsm_s::goal, hCopyTag(), headerCopyLoad(), headerFini(), headerFree(), headerGet(), headerGetInstance(), headerInit(), headerIsEntry(), headerLink(), headerNew(), headerNext(), headerPut(), headerRegenSigHeader(), headerReload(), headerSetInstance(), headerSprintf(), hLoadTID(), hSaveFlinks(), markReplacedFiles(), rpmpsm_s::mi, rpmpsm_s::npkgs_installed, rpmpsm_s::oh, _HE_s::p, rpmpsm_s::payload_format, rpmpsm_s::pkgfn, pkgStageString(), rpmpsm_s::pkgURL, populateInstallHeader(), postPopulateInstallHeader(), rpmpsm_s::progTag, PSM_CHROOT_IN, PSM_CHROOT_OUT, PSM_COMMIT, PSM_CREATE, PSM_DESTROY, PSM_FINI, PSM_IMMED_TRIGGERS, PSM_INIT, PSM_NOTIFY, PSM_PKGCOMMIT, PSM_PKGERASE, PSM_PKGINSTALL, PSM_PKGSAVE, PSM_POST, PSM_PRE, PSM_PROCESS, PSM_RPMDB_ADD, PSM_RPMDB_LOAD, PSM_RPMDB_REMOVE, PSM_RPMIO_FLAGS, PSM_SCRIPT, PSM_TRIGGERS, PSM_UNDO, PSM_UNKNOWN, rpmDataType_u::ptr, rpmpsm_s::rc, RPM_STRING_TYPE, RPM_UINT32_TYPE, RPMCALLBACK_CPIO_ERROR, RPMCALLBACK_INST_PROGRESS, RPMCALLBACK_INST_START, RPMCALLBACK_UNINST_START, RPMCALLBACK_UNINST_STOP, RPMCALLBACK_UNPACK_ERROR, rpmdbAdd(), rpmdbCountPackages(), rpmdbFreeIterator(), rpmdbGetIteratorOffset(), RPMDBI_PACKAGES, rpmdbNextIterator(), rpmdbRemove(), rpmdbSetIteratorRE(), rpmfiFC(), RPMFILE_STATE_NORMAL, rpmGenPath(), rpmGetPath(), rpmHeaderFormats, rpmpsm_s::rpmio_flags, rpmlog(), RPMLOG_DEBUG, RPMLOG_ERR, RPMLOG_INFO, rpmMkdirPath(), rpmpkgSizeof(), rpmpkgWrite(), rpmpsmNext(), RPMRC_FAIL, RPMRC_OK, rpmswAdd(), rpmswEnter(), rpmswExit(), RPMTAG_HEADERIMAGE, RPMTAG_HEADERIMMUTABLE, RPMTAG_HEADERSIGNATURES, rpmteA(), rpmteE(), rpmteFd(), rpmteHdrid(), rpmteN(), rpmteNEVR(), rpmteO(), rpmteR(), rpmteSetDBInstance(), rpmteSetHeader(), rpmteV(), RPMTRANS_FLAG_APPLYONLY, RPMTRANS_FLAG_JUSTDB, RPMTRANS_FLAG_NOPOST, RPMTRANS_FLAG_NOPOSTUN, RPMTRANS_FLAG_NOPRE, RPMTRANS_FLAG_NOPREUN, RPMTRANS_FLAG_NOTRIGGERIN, RPMTRANS_FLAG_NOTRIGGERPOSTUN, RPMTRANS_FLAG_NOTRIGGERPREIN, RPMTRANS_FLAG_NOTRIGGERUN, RPMTRANS_FLAG_PKGCOMMIT, RPMTRANS_FLAG_TEST, RPMTRANS_TYPE_AUTOROLLBACK, RPMTRANS_TYPE_ROLLBACK, RPMTS_OP_COMPRESS, RPMTS_OP_DBADD, RPMTS_OP_DBREMOVE, RPMTS_OP_DIGEST, RPMTS_OP_UNCOMPRESS, rpmtsChrootDone(), rpmtsColor(), rpmtsCurrDir(), rpmtsFlags(), rpmtsGetRdb(), rpmtsGetTid(), rpmtsInitIterator(), rpmtsNotify(), rpmtsOp(), rpmtsRootDir(), rpmtsSetChrootDone(), rpmtsType(), rpmtsVSFlags(), RPMVSF_NOHDRCHK, runImmedTriggers(), runInstScript(), runTriggers(), rpmpsm_s::scriptArg, rpmpsm_s::scriptTag, rpmpsm_s::sense, snprintf(), rpmpsm_s::stepName, stpcpy(), rpmDataType_u::str, _HE_s::t, _HE_s::tag, tag2sln(), rpmpsm_s::te, rpmpsm_s::total, rpmpsm_s::ts, rpmDataType_u::ui32p, urlPath(), rpmpsm_s::what, xmalloc(), and xstrdup().
Referenced by _processFailedPackage(), rpmInstallSourcePackage(), rpmpsmNext(), rpmtsRun(), and rpmVerifyScript().
Compare headers to determine which header is "newer".
first | 1st header | |
second | 2nd header |
Definition at line 54 of file psm.c.
References _free(), alloca(), headerGet(), _HE_s::p, rpmDataType_u::ptr, rpmvercmp, rpmDataType_u::str, _HE_s::tag, and rpmDataType_u::ui32p.
Referenced by hdr_compare(), and rpmcliInstall().
Run triggers from this header that are fired by headers in the database.
psm | package state machine data |
Definition at line 1199 of file psm.c.
References _free(), alloca(), rpmDataType_u::argv, _HE_s::c, rpmpsm_s::fi, handleOneTrigger(), headerGet(), rpmpsm_s::mi, _HE_s::p, rpmdbFreeIterator(), rpmdbGetIteratorCount(), rpmdbNextIterator(), RPMRC_OK, rpmtsInitIterator(), _HE_s::tag, rpmpsm_s::ts, and rpmDataType_u::ui32p.
Referenced by rpmpsmStage().
Retrieve and run scriptlet from header.
psm | package state machine data |
Definition at line 991 of file psm.c.
References _free(), alloca(), rpmDataType_u::argv, _HE_s::c, rpmpsm_s::fi, headerGet(), _HE_s::p, rpmpsm_s::progTag, rpmDataType_u::ptr, RPM_STRING_TYPE, rpmExpand(), RPMRC_OK, runScript(), rpmpsm_s::scriptArg, rpmpsm_s::scriptTag, stpcpy(), rpmDataType_u::str, _HE_s::t, _HE_s::tag, tag2sln(), and xmalloc().
Referenced by rpmpsmStage().
static rpmRC runScript | ( | rpmpsm | psm, | |
Header | h, | |||
const char * | sln, | |||
int | progArgc, | |||
const char ** | progArgv, | |||
const char * | script, | |||
int | arg1, | |||
int | arg2 | |||
) | [static] |
Run scriptlet with args.
Run a script with an interpreter. If the interpreter is not specified, /bin/sh will be used. If the interpreter is /bin/sh, then the args from the header will be ignored, passing instead arg1 and arg2.
psm | package state machine data | |
h | header | |
sln | name of scriptlet section | |
progArgc | no. of args from header | |
progArgv | args from header, progArgv[0] is the interpreter to use | |
script | scriptlet from header | |
arg1 | no. instances of package installed after scriptlet exec (-1 is no arg) | |
arg2 | ditto, but for the target package |
Definition at line 651 of file psm.c.
References _, _free(), alloca(), rpmDataType_u::argv, body(), _HE_s::c, Chdir(), Chroot(), D_, doputenv(), errno, Fclose(), rpmpsm_s::fd, fdDup(), Ferror(), Fileno(), Fopen(), Fwrite(), headerGet(), _HE_s::p, psmWait(), rpmDataType_u::ptr, rpm_execcon, RPMCALLBACK_SCRIPT_ERROR, rpmExpand(), rpmIsDebug, rpmIsVerbose, rpmlog(), RPMLOG_DEBUG, RPMLOG_ERR, RPMRC_FAIL, RPMRC_OK, RPMSCRIPT_STATE_EXEC, RPMSCRIPT_STATE_SELINUX, RPMSCRIPT_STATE_UNKNOWN, rpmsqFork(), rpmTempFile(), rpmtsChrootDone(), rpmtsNotify(), rpmtsRootDir(), rpmtsScriptFd(), rpmtsSELinuxEnabled(), SCRIPT_PATH, rpmpsm_s::scriptTag, rpmpsm_s::sq, rpmpsm_s::sstates, rpmpsm_s::stepName, stpcpy(), rpmDataType_u::str, _HE_s::tag, tag2sln(), tag2slx(), rpmpsm_s::te, rpmpsm_s::ts, Unlink(), rpmpsm_s::unorderedSuccessor, unsetenv(), and xmalloc().
Referenced by handleOneTrigger(), and runInstScript().
Run trigger scripts in the database that are fired by this header.
psm | package state machine data |
Definition at line 1157 of file psm.c.
References rpmpsm_s::countCorrection, rpmpsm_s::fi, handleOneTrigger(), rpmpsm_s::mi, rpmdbCountPackages(), rpmdbFreeIterator(), rpmdbNextIterator(), RPMRC_NOTFOUND, RPMRC_OK, rpmteN(), rpmtsGetRdb(), rpmtsInitIterator(), rpmpsm_s::te, and rpmpsm_s::ts.
Referenced by rpmpsmStage().
static const char* tag2sln | ( | int | tag | ) | [static] |
Return scriptlet name from tag.
tag | scriptlet tag |
Definition at line 436 of file psm.c.
Referenced by rpmpsmStage(), runInstScript(), and runScript().
static rpmScriptID tag2slx | ( | int | tag | ) | [static] |
Return scriptlet id from tag.
tag | scriptlet tag |
Definition at line 461 of file psm.c.
References RPMSCRIPT_POSTIN, RPMSCRIPT_POSTTRANS, RPMSCRIPT_POSTUN, RPMSCRIPT_PREIN, RPMSCRIPT_PRETRANS, RPMSCRIPT_PREUN, RPMSCRIPT_SANITYCHECK, RPMSCRIPT_TRIGGERIN, RPMSCRIPT_TRIGGERPOSTUN, RPMSCRIPT_TRIGGERPREIN, RPMSCRIPT_TRIGGERUN, RPMSCRIPT_UNKNOWN, and RPMSCRIPT_VERIFY.
Referenced by psmWait(), and runScript().
Definition at line 1313 of file psm.c.
References _psm_debug, and rpmpsm_s::nrefs.
Definition at line 1302 of file psm.c.
References _psm_debug, and rpmpsm_s::nrefs.
int _psm_debug = 0 |
Definition at line 39 of file psm.c.
Referenced by XrpmpsmLink(), and XrpmpsmUnlink().
int _psm_threads = 0 |
Definition at line 41 of file psm.c.
Referenced by rpmpsmNext().
int ldconfig_done = 0 [static] |
const char* ldconfig_path = "/sbin/ldconfig" [static] |
char* SCRIPT_PATH = "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin" [static] |
Definition at line 429 of file psm.c.
Referenced by runScript().