Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages

lib/psm.c File Reference

Package state machine to handle a package from a transaction set. More...

#include "system.h"
#include <rpmio_internal.h>
#include <rpmlib.h>
#include <rpmmacro.h>
#include <rpmurl.h>
#include "cpio.h"
#include "fsm.h"
#include "psm.h"
#include "rpmds.h"
#include "rpmfi.h"
#include "rpmte.h"
#include "rpmts.h"
#include "rpmlead.h"
#include "signature.h"
#include "legacy.h"
#include "misc.h"
#include "rpmdb.h"
#include "debug.h"

Go to the source code of this file.

Data Structures

struct  tagMacro
 Macros to be defined from per-header tag values. More...


Defines

#define _RPMFI_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".

int rpmInstallLoadMacros (rpmfi fi, Header h)
 Define per-header macros.

rpmRC markReplacedFiles (const rpmpsm psm)
 Mark files in database shared with this package as "replaced".

rpmRC rpmInstallSourcePackage (rpmts ts, FD_t fd, const char **specFilePtr, const char **cookie)
 Install source package.

const char *const  tag2sln (int tag)
 Return scriptlet name from tag.

pid_t psmWait (rpmpsm psm)
 Wait for child process to be reaped.

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.

rpmRC runInstScript (rpmpsm psm)
 Retrieve and run scriptlet from header.

rpmRC handleOneTrigger (const rpmpsm psm, Header sourceH, Header triggeredH, int arg2, unsigned char *triggersAlreadyRun)
 Execute triggers.

rpmRC runTriggers (rpmpsm psm)
 Run trigger scripts in the database that are fired by this header.

rpmRC runImmedTriggers (rpmpsm psm)
 Run triggers from this header that are fired by headers in the database.

const char *const  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.

rpmRC rpmpsmStage (rpmpsm psm, pkgStage stage)
 Package state machine driver.


Variables

int _psm_debug = 0
int _psm_threads = 0
tagMacro tagMacros []
 Macros to be defined from per-header tag values.

char * SCRIPT_PATH = "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin"
int ldconfig_done = 0
const char * ldconfig_path = NULL


Detailed Description

Package state machine to handle a package from a transaction set.

Definition in file psm.c.


Define Documentation

#define _PSM_DEBUG   0
 

Definition at line 35 of file psm.c.

#define _RPMFI_INTERNAL
 

Definition at line 19 of file psm.c.

#define _RPMTE_INTERNAL
 

Definition at line 22 of file psm.c.

#define _RPMTS_INTERNAL
 

Definition at line 25 of file psm.c.


Function Documentation

rpmRC handleOneTrigger const rpmpsm  psm,
Header  sourceH,
Header  triggeredH,
int  arg2,
unsigned char *  triggersAlreadyRun
[static]
 

Execute triggers.

Todo:
Trigger on any provides, not just package NVR.
Parameters:
psm package state machine data
sourceH 
triggeredH 
arg2 
triggersAlreadyRun 
Returns:

Definition at line 925 of file psm.c.

References rpmpsm_s::countCorrection, rpmpsm_s::fi, Header, headerNVR(), HFD_t, HGE_t, int_32, rpmdbCountPackages(), rpmds, rpmdsAnyMatchesDep(), rpmdsFlags(), rpmdsFree(), rpmdsInit(), rpmdsN(), rpmdsNew(), rpmdsNext(), rpmdsSetNoPromote(), rpmfi, rpmpsm, rpmRC, RPMRC_FAIL, RPMRC_OK, RPMTAG_TRIGGERINDEX, RPMTAG_TRIGGERNAME, RPMTAG_TRIGGERSCRIPTPROG, RPMTAG_TRIGGERSCRIPTS, rpmTagType, rpmts, rpmtsGetRdb(), runScript(), rpmpsm_s::sense, and rpmpsm_s::ts.

Referenced by runImmedTriggers(), and runTriggers().

rpmRC markReplacedFiles const rpmpsm  psm  )  [static]
 

Mark files in database shared with this package as "replaced".

Parameters:
psm package state machine data
Returns:
0 always

Definition at line 155 of file psm.c.

References alloca(), rpmpsm_s::fi, Header, HGE_t, rpmdbAppendIterator(), rpmdbFreeIterator(), rpmdbGetIteratorOffset(), RPMDBI_PACKAGES, rpmdbMatchIterator, rpmdbNextIterator(), rpmdbSetIteratorModified(), rpmdbSetIteratorRewrite(), rpmfi, rpmfiFC(), RPMFILE_STATE_REPLACED, rpmpsm, rpmRC, RPMRC_OK, RPMTAG_FILESTATES, rpmts, rpmtsInitIterator(), and rpmpsm_s::ts.

Referenced by rpmpsmStage().

const char* const pkgStageString pkgStage  a  )  [static]
 

Definition at line 1122 of file psm.c.

References pkgStage, 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().

pid_t psmWait rpmpsm  psm  )  [static]
 

Wait for child process to be reaped.

Parameters:
psm package state machine data
Returns:

Definition at line 460 of file psm.c.

References _, rpmsqElem::child, rpmsqElem::op, rpmsqElem::reaped, RPMMESS_DEBUG, rpmMessage, rpmpsm, rpmsqWait(), rpmswAdd(), rpmtime_t, rpmts, RPMTS_OP_SCRIPTLETS, rpmtsOp(), rpmpsm_s::sq, rpmsqElem::status, rpmpsm_s::stepName, rpmpsm_s::ts, and rpmop_s::usecs.

Referenced by runScript().

int rpmInstallLoadMacros rpmfi  fi,
Header  h
[static]
 

Define per-header macros.

Parameters:
fi transaction element file info
h header
Returns:
0 always

Definition at line 107 of file psm.c.

References addMacro(), argv, Header, HGE_t, int_32, tagMacro::macroname, RPM_BIN_TYPE, RPM_CHAR_TYPE, RPM_I18NSTRING_TYPE, RPM_INT16_TYPE, RPM_INT32_TYPE, RPM_INT8_TYPE, RPM_NULL_TYPE, RPM_STRING_ARRAY_TYPE, RPM_STRING_TYPE, rpmfi, rpmTagType, and tagMacros.

Referenced by rpmInstallSourcePackage().

rpmRC rpmInstallSourcePackage rpmts  ts,
FD_t  fd,
const char **  specFilePtr,
const char **  cookie
 

Install source package.

Parameters:
ts transaction set
fd file handle
Return values:
specFilePtr address of spec file name (or NULL)
cookie address of cookie pointer (or NULL)
Returns:
rpmRC return code

Definition at line 230 of file psm.c.

References _, _free(), CPIO_MAP_GID, CPIO_MAP_MODE, CPIO_MAP_PATH, CPIO_MAP_UID, FA_CREATE, Fclose(), FD_t, fdLink, Header, headerFree(), headerIsEntry(), headerLink(), HFD_t, HGE_t, PSM_FINI, PSM_PKGINSTALL, PSM_PROCESS, RPMERR_NOSPEC, RPMERR_NOTSRPM, rpmError, rpmfi, rpmfiBuildFNames(), rpmfiFree(), RPMFILE_SPECFILE, rpmfiLink, rpmfiNew(), rpmGenPath(), rpmInstallLoadMacros(), rpmMkdirPath(), rpmpsm, rpmpsmStage(), rpmRC, RPMRC_FAIL, RPMRC_NOKEY, RPMRC_NOTTRUSTED, RPMRC_OK, rpmReadPackageFile(), RPMTAG_BASENAMES, RPMTAG_COOKIE, RPMTAG_SOURCEPACKAGE, rpmts, rpmtsAddInstallElement(), rpmtsClean(), rpmtsElement(), rpmtsFree(), rpmtsLink, rpmtsRootDir(), stpcpy(), xmalloc(), and xstrdup().

Referenced by rpmInstall().

rpmpsm rpmpsmFree rpmpsm  psm  ) 
 

Destroy a package state machine.

Parameters:
psm package state machine
Returns:
NULL always

Definition at line 1186 of file psm.c.

References _free(), rpmpsm_s::fi, rpmpsm_s::nrefs, rpmfiFree(), rpmpsm, rpmpsmUnlink, rpmteFree(), rpmtsFree(), rpmpsm_s::te, and rpmpsm_s::ts.

Referenced by rpmtsRun(), and rpmVerifyScript().

rpmpsm rpmpsmNew rpmts  ts,
rpmte  te,
rpmfi  fi
 

Create and load a package state machine.

Parameters:
ts transaction set
te transaction set element
fi file info set
Returns:
new package state machine

Definition at line 1219 of file psm.c.

References rpmpsm_s::fi, rpmfi, rpmfiLink, rpmpsm, rpmpsmLink, rpmte, rpmts, rpmtsLink, rpmpsm_s::te, rpmpsm_s::ts, and xcalloc().

Referenced by rpmtsRun(), and rpmVerifyScript().

rpmRC rpmpsmStage rpmpsm  psm,
pkgStage  stage
 

Package state machine driver.

Todo:
Packages w/o files never get a callback, hence don't get displayed on install with -v.

Definition at line 1264 of file psm.c.

References _, _free(), rpmpsm_s::amount, rpmlead::archnum, rpmpsm_s::cfd, rpmpsm_s::chrootDone, rpmpsm_s::countCorrection, CPIO_MAP_GID, CPIO_MAP_MODE, CPIO_MAP_PATH, CPIO_MAP_UID, cpioStrerror(), dbiIndex, 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, fileAction, Fileno(), Fopen(), FSM_PKGBUILD, FSM_PKGCOMMIT, FSM_PKGERASE, FSM_PKGINSTALL, fsmSetup(), fsmTeardown(), Fstrerror(), rpmpsm_s::goal, Header, HEADER_MAGIC_YES, headerAddEntry(), headerCheck(), headerCopyLoad(), headerFree(), headerFreeData(), headerFreeIterator(), headerGetEntry(), headerInitIterator(), headerIsEntry(), HeaderIterator, headerLink(), headerNew(), headerNextIterator(), headerRegenSigHeader(), headerReload(), headerSprintf(), headerWrite(), HFD_t, HGE_t, hPTR_t, int_32, rpmlead::major, markReplacedFiles(), rpmpsm_s::mi, rpmlead::minor, rpmlead::name, rpmpsm_s::npkgs_installed, rpmpsm_s::oh, rpmlead::osnum, rpmpsm_s::pkgfn, pkgStage, pkgStageString(), rpmpsm_s::pkgURL, 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, rpmpsm_s::rc, RPM_CHAR_TYPE, RPM_INT32_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(), RPMERR_CPIO, RPMERR_NOSPACE, RPMERR_SCRIPT, rpmError, rpmfi, rpmfiBuildFNames(), rpmfiFC(), RPMFILE_STATE_NORMAL, rpmFreeSignature(), rpmGenPath(), rpmGetArchInfo(), rpmGetOsInfo(), rpmGetPath(), rpmHeaderFormats, rpmpsm_s::rpmio_flags, RPMLEAD_BINARY, RPMMESS_DEBUG, RPMMESS_VERBOSE, rpmMessage, RPMMIRE_DEFAULT, rpmpsm, rpmRC, RPMRC_FAIL, RPMRC_OK, RPMSENSE_TRIGGERIN, RPMSENSE_TRIGGERPOSTUN, RPMSENSE_TRIGGERUN, RPMSIGTYPE_HEADERSIG, rpmswAdd(), rpmswEnter(), rpmswExit(), RPMTAG_ARCH, RPMTAG_ARCHIVESIZE, RPMTAG_BASENAMES, RPMTAG_DEFAULTPREFIX, RPMTAG_EPOCH, RPMTAG_FILEGROUPNAME, RPMTAG_FILESTATES, RPMTAG_FILEUSERNAME, RPMTAG_HEADERIMAGE, RPMTAG_HEADERIMMUTABLE, RPMTAG_HEADERSIGNATURES, RPMTAG_INSTALLCOLOR, RPMTAG_INSTALLTIME, RPMTAG_NAME, RPMTAG_ORIGBASENAMES, RPMTAG_OS, RPMTAG_PAYLOADCOMPRESSOR, RPMTAG_POSTIN, RPMTAG_POSTINPROG, RPMTAG_POSTUN, RPMTAG_POSTUNPROG, RPMTAG_PREIN, RPMTAG_PREINPROG, RPMTAG_PREUN, RPMTAG_PREUNPROG, RPMTAG_RELEASE, RPMTAG_REMOVETID, RPMTAG_TRIGGERNAME, RPMTAG_VERSION, rpmTagTable, rpmteA(), rpmteE(), rpmteFd(), rpmteN(), rpmteNEVR(), rpmteO(), rpmteR(), 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, rpmts, 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(), rpmtsVSFlags(), RPMVSF_NOHDRCHK, rpmWriteSignature(), runImmedTriggers(), runInstScript(), runTriggers(), rpmpsm_s::scriptArg, rpmpsm_s::scriptTag, rpmpsm_s::sense, rpmlead::signature_type, rpmpsm_s::stepName, stpcpy(), tag2sln(), rpmpsm_s::te, rpmpsm_s::total, rpmpsm_s::ts, rpmlead::type, uint_32, urlPath(), rpmpsm_s::what, writeLead(), and xmalloc().

Referenced by rpmInstallSourcePackage(), rpmtsRun(), and rpmVerifyScript().

int rpmVersionCompare Header  first,
Header  second
 

Compare headers to determine which header is "newer".

Parameters:
first 1st header
second 2nd header
Returns:
result of comparison

Definition at line 48 of file psm.c.

References Header, headerGetEntry(), int_32, RPMTAG_EPOCH, RPMTAG_RELEASE, RPMTAG_VERSION, and rpmvercmp().

Referenced by hdr_compare(), rpmInstall(), and rpmtsAddInstallElement().

rpmRC runImmedTriggers rpmpsm  psm  )  [static]
 

Run triggers from this header that are fired by headers in the database.

Parameters:
psm package state machine data
Returns:
0 on success

Definition at line 1068 of file psm.c.

References alloca(), rpmpsm_s::fi, handleOneTrigger(), Header, HFD_t, HGE_t, int_32, rpmdbFreeIterator(), rpmdbGetIteratorCount(), rpmdbMatchIterator, rpmdbNextIterator(), rpmfi, rpmpsm, rpmRC, RPMRC_OK, RPMTAG_NAME, RPMTAG_TRIGGERINDEX, RPMTAG_TRIGGERNAME, rpmTagType, rpmts, rpmtsInitIterator(), and rpmpsm_s::ts.

Referenced by rpmpsmStage().

rpmRC runInstScript rpmpsm  psm  )  [static]
 

Retrieve and run scriptlet from header.

Parameters:
psm package state machine data
Returns:
rpmRC return code

Definition at line 872 of file psm.c.

References alloca(), argv, rpmpsm_s::fi, HFD_t, HGE_t, rpmpsm_s::progTag, RPM_STRING_TYPE, rpmfi, rpmpsm, rpmRC, RPMRC_OK, rpmTagType, runScript(), rpmpsm_s::scriptArg, rpmpsm_s::scriptTag, and tag2sln().

Referenced by rpmpsmStage().

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.

Parameters:
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
Returns:
0 on success

Definition at line 510 of file psm.c.

References _, _free(), alloca(), argv, rpmsqElem::child, doputenv(), errno, Fclose(), FD_t, fdDup(), Ferror(), rpmpsm_s::fi, Fileno(), Fopen(), Fwrite(), getenv(), Header, headerNVR(), headerSprintf(), HFD_t, HGE_t, ldconfig_done, ldconfig_path, makeTempFile(), psmWait(), rpmsqElem::reaped, rpmsqElem::reaper, RPMERR_SCRIPT, rpmError, rpmExpand(), rpmfi, rpmGetPath(), rpmHeaderFormats, rpmIsDebug, rpmIsVerbose, RPMMESS_DEBUG, rpmMessage, rpmpsm, rpmRC, RPMRC_FAIL, RPMRC_OK, rpmsqFork(), RPMTAG_ARCH, RPMTAG_INSTALLPREFIX, RPMTAG_INSTPREFIXES, rpmTagTable, rpmTagType, rpmts, rpmtsChrootDone(), rpmtsRootDir(), rpmtsScriptFd(), SCRIPT_PATH, rpmpsm_s::scriptTag, snprintf(), rpmpsm_s::sq, rpmsqElem::status, rpmpsm_s::stepName, stpcpy(), tag2sln(), rpmpsm_s::ts, rpmpsm_s::unorderedSuccessor, unsetenv(), URL_IS_PATH, URL_IS_UNKNOWN, and urlIsURL().

Referenced by handleOneTrigger(), and runInstScript().

rpmRC runTriggers rpmpsm  psm  )  [static]
 

Run trigger scripts in the database that are fired by this header.

Parameters:
psm package state machine data
Returns:
0 on success

Definition at line 1027 of file psm.c.

References rpmpsm_s::countCorrection, rpmpsm_s::fi, handleOneTrigger(), Header, rpmdbCountPackages(), rpmdbFreeIterator(), rpmdbMatchIterator, rpmdbNextIterator(), rpmfi, rpmpsm, rpmRC, RPMRC_NOTFOUND, RPMRC_OK, RPMTAG_TRIGGERNAME, rpmteN(), rpmts, rpmtsGetRdb(), rpmtsInitIterator(), rpmpsm_s::te, and rpmpsm_s::ts.

Referenced by rpmpsmStage().

const char* const tag2sln int  tag  )  [static]
 

Return scriptlet name from tag.

Parameters:
tag scriptlet tag
Returns:
name of scriptlet

Definition at line 442 of file psm.c.

References RPMTAG_POSTIN, RPMTAG_POSTUN, RPMTAG_PREIN, RPMTAG_PREUN, and RPMTAG_VERIFYSCRIPT.

Referenced by rpmpsmStage(), runInstScript(), and runScript().

rpmpsm XrpmpsmLink rpmpsm  psm,
const char *  msg,
const char *  fn,
unsigned  ln
 

Todo:
Remove debugging entry from the ABI.

Definition at line 1173 of file psm.c.

References _psm_debug, rpmpsm_s::nrefs, and rpmpsm.

rpmpsm XrpmpsmUnlink rpmpsm  psm,
const char *  msg,
const char *  fn,
unsigned  ln
 

Todo:
Remove debugging entry from the ABI.

Definition at line 1162 of file psm.c.

References _psm_debug, rpmpsm_s::nrefs, and rpmpsm.


Variable Documentation

int _psm_debug = 0
 

Definition at line 37 of file psm.c.

int _psm_threads = 0
 

Definition at line 39 of file psm.c.

int ldconfig_done = 0 [static]
 

Definition at line 483 of file psm.c.

Referenced by runScript().

const char* ldconfig_path = NULL [static]
 

Definition at line 489 of file psm.c.

Referenced by runScript().

char* SCRIPT_PATH = "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin" [static]
 

Definition at line 435 of file psm.c.

Referenced by runScript().

struct tagMacro tagMacros[] [static]
 

Macros to be defined from per-header tag values.

Todo:
Should other macros be added from header when installing a package?

Referenced by rpmInstallLoadMacros().


Generated on Tue May 22 18:03:10 2007 for rpm by doxygen 1.3.5