rpm  5.4.10
Data Structures | Macros | Typedefs | Functions | Variables
fsm.c File Reference

File state machine to handle a payload from a package. More...

#include "system.h"
#include <rpmio_internal.h>
#include <rpmcb.h>
#include "rpmsq.h"
#include <rpmsx.h>
#include "cpio.h"
#include "tar.h"
#include "ugid.h"
#include <rpmtag.h>
#include <rpmtypes.h>
#include <rpmdb.h>
#include "rpmfi.h"
#include <fsm.h>
#include "rpmte.h"
#include "rpmts.h"
#include "debug.h"
Include dependency graph for fsm.c:

Go to the source code of this file.

Data Structures

struct  dnli_s
 Directory name iterator. More...
 

Macros

#define _RPMDB_INTERNAL
 
#define _RPMFI_INTERNAL
 
#define _IOSM_INTERNAL
 
#define fsmUNSAFE   fsmStage
 
#define _USE_RPMTE
 
#define alloca_strdup(_s)   strcpy((char *)alloca(strlen(_s)+1), (_s))
 
#define _FSM_DEBUG   0
 
#define SUFFIX_RPMORIG   ".rpmorig"
 
#define SUFFIX_RPMSAVE   ".rpmsave"
 
#define SUFFIX_RPMNEW   ".rpmnew"
 
#define _tsmask   (RPMTRANS_FLAG_PKGCOMMIT | RPMTRANS_FLAG_COMMIT)
 
#define IS_DEV_LOG(_x)
 
#define _fafilter(_a)
 

Typedefs

typedef struct dnli_sDNLI_t
 Directory name iterator. More...
 

Functions

static rpmts fsmGetTs (const IOSM_t fsm)
 Retrieve transaction set from file state machine iterator. More...
 
static rpmfi fsmGetFi (const IOSM_t fsm)
 Retrieve transaction element file info from file state machine iterator. More...
 
static const char * fsmFsPath (const IOSM_t fsm, const struct stat *st, const char *subdir, const char *suffix)
 Build path to file from file info, ornamented with subdir and suffix. More...
 
static void * mapFreeIterator (void *_iter)
 Destroy file info iterator. More...
 
static void * mapInitIterator (rpmfi fi, int reverse)
 Create file info iterator. More...
 
static int mapNextIterator (void *_iter)
 Return next index into file info. More...
 
static int cpioStrCmp (const void *a, const void *b)
 
static int mapFind (FSMI_t iter, const char *fsmPath)
 Locate archive path in file info. More...
 
static void * dnlFreeIterator (const void *_dnli)
 Destroy directory name iterator. More...
 
static int dnlCount (const DNLI_t dnli)
 
static int dnlIndex (const DNLI_t dnli)
 
static void * dnlInitIterator (const IOSM_t fsm, int reverse)
 Create directory name iterator. More...
 
static const char * dnlNextIterator (DNLI_t dnli)
 Return next directory name (from file info). More...
 
int fsmNext (IOSM_t fsm, iosmFileStage nstage)
 File state machine driver. More...
 
static int saveHardLink (IOSM_t fsm)
 Save hard link in chain. More...
 
static void * freeHardLink (struct hardLink_s *li)
 Destroy set of hard links. More...
 
IOSM_t newFSM (void)
 Create file state machine instance. More...
 
IOSM_t freeFSM (IOSM_t fsm)
 Destroy file state machine instance. More...
 
int fsmSetup (void *_fsm, iosmFileStage goal, const char *afmt, const void *_ts, const void *_fi, FD_t cfd, unsigned int *archiveSize, const char **failedFile)
 Load external data into file state machine. More...
 
int fsmTeardown (void *_fsm)
 Clean file state machine. More...
 
static int fsmMapFContext (IOSM_t fsm)
 
int fsmMapPath (IOSM_t fsm)
 Map next file path and action. More...
 
int fsmMapAttrs (IOSM_t fsm)
 Map file stat(2) info. More...
 
static int extractRegular (IOSM_t fsm)
 Create file from payload stream. More...
 
static int writeFile (IOSM_t fsm, int writeData)
 Write next item to payload stream. More...
 
static int writeLinkedFile (IOSM_t fsm)
 Write set of linked files to payload stream. More...
 
static int fsmMakeLinks (IOSM_t fsm)
 Create pending hard links to existing file. More...
 
static int fsmCommitLinks (IOSM_t fsm)
 Commit hard linked file set atomically. More...
 
static int fsmRmdirs (IOSM_t fsm)
 Remove (if created) directories not explicitly included in package. More...
 
static int fsmMkdirs (IOSM_t fsm)
 Create (if necessary) directories not explicitly included in package. More...
 
int fsmStage (IOSM_t fsm, iosmFileStage stage)
 File state machine driver. More...
 

Variables

int _fsm_debug = 0
 
int _fsm_threads = 0
 

Detailed Description

File state machine to handle a payload from a package.

Definition in file fsm.c.

Macro Definition Documentation

§ _fafilter

#define _fafilter (   _a)
Value:
(!((_a) == FA_CREATE || (_a) == FA_ERASE || (_a) == FA_COPYIN || (_a) == FA_COPYOUT) \
Definition: iosm.h:30
Definition: iosm.h:29
Definition: iosm.h:36
const char * iosmFileActionString(iosmFileAction a)
Return formatted string representation of file disposition.
Definition: iosm.c:2677

Referenced by fsmStage().

§ _FSM_DEBUG

#define _FSM_DEBUG   0

Definition at line 59 of file fsm.c.

§ _IOSM_INTERNAL

#define _IOSM_INTERNAL

Definition at line 27 of file fsm.c.

§ _RPMDB_INTERNAL

#define _RPMDB_INTERNAL

Definition at line 21 of file fsm.c.

§ _RPMFI_INTERNAL

#define _RPMFI_INTERNAL

Definition at line 24 of file fsm.c.

§ _tsmask

Referenced by fsmSetup(), and iosmSetup().

§ _USE_RPMTE

#define _USE_RPMTE

Definition at line 31 of file fsm.c.

§ alloca_strdup

#define alloca_strdup (   _s)    strcpy((char *)alloca(strlen(_s)+1), (_s))

Definition at line 57 of file fsm.c.

§ fsmUNSAFE

#define fsmUNSAFE   fsmStage

Definition at line 29 of file fsm.c.

Referenced by fsmMakeLinks(), fsmMkdirs(), fsmSetup(), fsmStage(), fsmTeardown(), and writeFile().

§ IS_DEV_LOG

#define IS_DEV_LOG (   _x)
Value:
((_x) != NULL && strlen(_x) >= (sizeof("/dev/log")-1) && \
!strncmp((_x), "/dev/log", sizeof("/dev/log")-1) && \
((_x)[sizeof("/dev/log")-1] == '\0' || \
(_x)[sizeof("/dev/log")-1] == ';'))

Definition at line 1594 of file fsm.c.

Referenced by fsmStage().

§ SUFFIX_RPMNEW

#define SUFFIX_RPMNEW   ".rpmnew"

Definition at line 98 of file fsm.c.

Referenced by fsmMapPath().

§ SUFFIX_RPMORIG

#define SUFFIX_RPMORIG   ".rpmorig"

Definition at line 96 of file fsm.c.

Referenced by fsmMapPath().

§ SUFFIX_RPMSAVE

#define SUFFIX_RPMSAVE   ".rpmsave"

Definition at line 97 of file fsm.c.

Referenced by fsmMapPath().

Typedef Documentation

§ DNLI_t

typedef struct dnli_s * DNLI_t

Directory name iterator.

Function Documentation

§ cpioStrCmp()

static int cpioStrCmp ( const void *  a,
const void *  b 
)
static

Definition at line 205 of file fsm.c.

References urlPath().

Referenced by mapFind().

§ dnlCount()

static int dnlCount ( const DNLI_t  dnli)
inlinestatic

Definition at line 294 of file fsm.c.

References dnli_s::fi.

Referenced by fsmMkdirs(), and fsmRmdirs().

§ dnlFreeIterator()

static void* dnlFreeIterator ( const void *  _dnli)
static

Destroy directory name iterator.

Parameters
_dnlidirectory name iterator
Return values
NULLalways

Definition at line 282 of file fsm.c.

References _free(), and dnli_s::active.

Referenced by fsmMkdirs(), and fsmRmdirs().

§ dnlIndex()

static int dnlIndex ( const DNLI_t  dnli)
inlinestatic

Definition at line 302 of file fsm.c.

References dnli_s::isave.

Referenced by fsmMkdirs(), and fsmRmdirs().

§ dnlInitIterator()

static void* dnlInitIterator ( const IOSM_t  fsm,
int  reverse 
)
static

Create directory name iterator.

Parameters
fsmfile state machine data
reversetraverse directory names in reverse order?
Returns
directory name iterator

Definition at line 316 of file fsm.c.

References dnli_s::active, D_, dnli_s::fi, fsmGetFi(), dnli_s::i, iosmFileActionSkipped(), dnli_s::reverse, rpmfiInit(), rpmfiNext(), rpmlog(), RPMLOG_DEBUG, urlPath(), and xcalloc().

Referenced by fsmMkdirs(), and fsmRmdirs().

§ dnlNextIterator()

static const char* dnlNextIterator ( DNLI_t  dnli)
static

Return next directory name (from file info).

Parameters
dnlidirectory name iterator
Returns
next directory name

Definition at line 403 of file fsm.c.

References dnli_s::active, dnli_s::fi, fsmStage(), dnli_s::i, dnli_s::isave, iosm_s::nstage, and dnli_s::reverse.

Referenced by fsmMkdirs(), and fsmRmdirs().

§ extractRegular()

static int extractRegular ( IOSM_t  fsm)
static

§ freeFSM()

IOSM_t freeFSM ( IOSM_t  fsm)

Destroy file state machine instance.

Parameters
fsmfile state machine
Returns
always NULL

Definition at line 562 of file fsm.c.

References _free(), arSetup(), iosm_s::dnlx, dnli_s::fi, freeHardLink(), iosm_s::iter, iosm_s::ldn, iosm_s::li, iosm_s::links, iosm_s::lmtab, iosm_s::lmtablen, iosm_s::lmtaboff, mapFreeIterator(), hardLink_s::next, iosm_s::path, rpmfiBN(), rpmfiInit(), rpmfiNext(), stpcpy(), urlPath(), and xmalloc.

Referenced by rpmfiFini().

§ freeHardLink()

static void* freeHardLink ( struct hardLink_s li)
static

Destroy set of hard links.

Parameters
liset of hard links
Returns
NULL always

Definition at line 546 of file fsm.c.

References _free(), hardLink_s::filex, and hardLink_s::nsuffix.

Referenced by freeFSM(), and fsmStage().

§ fsmCommitLinks()

static int fsmCommitLinks ( IOSM_t  fsm)
static

Commit hard linked file set atomically.

Parameters
fsmfile state machine data
Returns
0 on success

Definition at line 1343 of file fsm.c.

References _free(), iosm_s::action, hardLink_s::filex, fsmNext(), dnli_s::i, IOSM_COMMIT, IOSM_MAP, iosmFileActionSkipped(), iosm_s::ix, iosm_s::li, iosm_s::links, hardLink_s::next, hardLink_s::nlink, iosm_s::nsuffix, iosm_s::path, hardLink_s::sb, and iosm_s::sb.

Referenced by fsmStage().

§ fsmFsPath()

static const char* fsmFsPath ( const IOSM_t  fsm,
const struct stat *  st,
const char *  subdir,
const char *  suffix 
)
static

Build path to file from file info, ornamented with subdir and suffix.

Parameters
fsmfile state machine data
stfile stat info
subdirsubdir to use (NULL disables)
suffixsuffix to use (NULL disables)
Return values
pathto file

Definition at line 109 of file fsm.c.

References iosm_s::baseName, iosm_s::dirName, stpcpy(), and xmalloc.

Referenced by fsmMapPath(), and fsmStage().

§ fsmGetFi()

static rpmfi fsmGetFi ( const IOSM_t  fsm)
static

Retrieve transaction element file info from file state machine iterator.

Parameters
fsmfile state machine
Returns
transaction element file info

Definition at line 87 of file fsm.c.

References iosmIterator_s::fi, and iosm_s::iter.

Referenced by dnlInitIterator(), fsmMapAttrs(), fsmMapFContext(), fsmMapPath(), fsmMkdirs(), fsmStage(), saveHardLink(), and writeFile().

§ fsmGetTs()

static rpmts fsmGetTs ( const IOSM_t  fsm)
static

Retrieve transaction set from file state machine iterator.

Parameters
fsmfile state machine
Returns
transaction set

Definition at line 73 of file fsm.c.

References iosm_s::iter, and iosmIterator_s::ts.

Referenced by extractRegular(), fsmStage(), and fsmTeardown().

§ fsmMakeLinks()

static int fsmMakeLinks ( IOSM_t  fsm)
static

Create pending hard links to existing file.

Parameters
fsmfile state machine data
Returns
0 on success

Definition at line 1282 of file fsm.c.

References _free(), iosm_s::action, hardLink_s::createdPath, iosm_s::failedFile, hardLink_s::filex, fsmNext(), fsmUNSAFE, dnli_s::i, IOSM_LINK, IOSM_MAP, IOSM_VERIFY, IOSMERR_ENOENT, iosmFileActionSkipped(), iosm_s::ix, iosm_s::li, hardLink_s::linksLeft, hardLink_s::nlink, iosm_s::nsuffix, iosm_s::opath, iosm_s::path, and xstrdup().

Referenced by fsmStage().

§ fsmMapAttrs()

int fsmMapAttrs ( IOSM_t  fsm)

§ fsmMapFContext()

static int fsmMapFContext ( IOSM_t  fsm)
static

Definition at line 788 of file fsm.c.

References iosm_s::fcontext, fsmGetFi(), dnli_s::i, iosm_s::ix, iosm_s::nofcontexts, iosm_s::path, rpmsxMatch(), and iosm_s::sb.

Referenced by fsmStage().

§ fsmMapPath()

int fsmMapPath ( IOSM_t  fsm)

§ fsmMkdirs()

static int fsmMkdirs ( IOSM_t  fsm)
static

§ fsmNext()

int fsmNext ( IOSM_t  fsm,
iosmFileStage  nstage 
)

File state machine driver.

Parameters
fsmfile state machine
nstagenext stage
Returns
0 on success

Definition at line 438 of file fsm.c.

References fsmStage(), iosm_s::multithreaded, iosm_s::nstage, rpmsqJoin(), and rpmsqThread().

Referenced by extractRegular(), fsmCommitLinks(), fsmMakeLinks(), fsmMkdirs(), fsmRmdirs(), fsmSetup(), fsmStage(), saveHardLink(), writeFile(), and writeLinkedFile().

§ fsmRmdirs()

static int fsmRmdirs ( IOSM_t  fsm)
static

Remove (if created) directories not explicitly included in package.

Parameters
fsmfile state machine data
Returns
0 on success

Definition at line 1387 of file fsm.c.

References dc, dnlCount(), dnlFreeIterator(), dnlIndex(), dnlInitIterator(), dnlNextIterator(), iosm_s::dnlx, fsmNext(), IOSM_RMDIR, iosm_s::ldn, iosm_s::path, iosm_s::rdbuf, and stpcpy().

Referenced by fsmStage().

§ fsmSetup()

int fsmSetup ( void *  _fsm,
iosmFileStage  goal,
const char *  afmt,
const void *  _ts,
const void *  _fi,
FD_t  cfd,
unsigned int *  archiveSize,
const char **  failedFile 
)

§ fsmStage()

int fsmStage ( IOSM_t  fsm,
iosmFileStage  stage 
)

File state machine driver.

Parameters
fsmfile state machine
stagenext stage
Returns
0 on success

Definition at line 1601 of file fsm.c.

References _, _fafilter, _free(), iosm_s::action, alloca(), iosm_s::astriplen, iosm_s::cfd, iosm_s::commit, hardLink_s::createdPath, iosm_s::debug, iosm_s::diskchecked, iosm_s::dnlx, errno, iosm_s::exists, extractRegular(), FA_ERASE, FA_UNKNOWN, iosm_s::failedFile, Fclose(), iosm_s::fcontext, fdGetCpioPos(), iosm_s::fflags, dnli_s::fi, Fileno(), hardLink_s::filex, Fopen(), freeHardLink(), fsmCommitLinks(), fsmFsPath(), fsmGetFi(), fsmGetTs(), fsmMakeLinks(), fsmMapAttrs(), fsmMapFContext(), fsmMapPath(), fsmMkdirs(), fsmNext(), fsmRmdirs(), fsmUNSAFE, iosm_s::goal, dnli_s::i, IOSM_ALL_HARDLINKS, IOSM_CHMOD, IOSM_CHOWN, IOSM_CHROOT, IOSM_COMMIT, IOSM_CREATE, IOSM_DEAD, IOSM_DESTROY, IOSM_DREAD, IOSM_DWRITE, IOSM_EAT, IOSM_FINI, IOSM_FOLLOW_SYMLINKS, IOSM_HREAD, IOSM_HWRITE, IOSM_INIT, IOSM_INTERNAL, IOSM_LCHOWN, IOSM_LINK, IOSM_LSETFCON, IOSM_LSTAT, IOSM_MAP, IOSM_MKDIR, IOSM_MKDIRS, IOSM_MKFIFO, IOSM_MKLINKS, IOSM_MKNOD, IOSM_NEXT, IOSM_NOTIFY, IOSM_PAD, IOSM_PAYLOAD_EXTRACT, IOSM_PAYLOAD_LIST, IOSM_PKGBUILD, IOSM_PKGCOMMIT, IOSM_PKGERASE, IOSM_PKGINSTALL, IOSM_POS, IOSM_POST, IOSM_PRE, IOSM_PROCESS, IOSM_RCLOSE, IOSM_READ, IOSM_READLINK, IOSM_RENAME, IOSM_RMDIR, IOSM_RMDIRS, IOSM_ROPEN, IOSM_STAT, IOSM_SYMLINK, IOSM_SYSCALL, IOSM_TRAILER, IOSM_UNDO, IOSM_UNKNOWN, IOSM_UNLINK, IOSM_UTIME, IOSM_VERBOSE, IOSM_VERIFY, IOSM_WCLOSE, IOSM_WOPEN, IOSM_WRITE, IOSMERR_ENOENT, IOSMERR_ENOTEMPTY, IOSMERR_HDR_TRAILER, IOSMERR_MISSING_HARDLINK, IOSMERR_UNKNOWN_FILETYPE, IOSMERR_UNLINK_FAILED, IOSMERR_UNMAPPED_FILE, iosmFileActionSkipped(), iosmFileStageString(), iosmStage(), IS_DEV_LOG, iosm_s::iter, iosm_s::ix, iosm_s::ldn, iosm_s::ldnalloc, iosm_s::ldnlen, iosm_s::li, hardLink_s::linkIndex, iosm_s::links, hardLink_s::linksLeft, iosm_s::lpath, Lstat(), mapFind(), iosm_s::mapFlags, mapNextIterator(), iosm_s::mkdirsdone, hardLink_s::next, hardLink_s::nlink, iosm_s::nsuffix, iosm_s::opath, iosm_s::osb, iosm_s::osuffix, iosm_s::path, iosm_s::postpone, iosm_s::rc, iosm_s::rdb, iosm_s::rdbuf, iosm_s::rdsize, iosm_s::repackaged, RPMCALLBACK_INST_PROGRESS, RPMFILE_GHOST, RPMFILE_MISSINGOK, rpmfiTypeString(), rpmlog(), RPMLOG_DEBUG, RPMLOG_ERR, RPMLOG_WARNING, RPMRC_FAIL, rpmtsGetRdb(), rpmtsNotify(), S_ISLNK, S_ISSOCK, saveHardLink(), hardLink_s::sb, iosm_s::sb, iosm_s::stage, stpcpy(), iosm_s::strict_erasures, iosm_s::subdir, iosm_s::sufbuf, iosm_s::suffix, Unlink(), urlPath(), iosm_s::wrb, iosm_s::wrbuf, writeFile(), writeLinkedFile(), iosm_s::wrsize, xmalloc, and xstrdup().

Referenced by dnlNextIterator(), and fsmNext().

§ fsmTeardown()

int fsmTeardown ( void *  _fsm)

Clean file state machine.

Parameters
_fsmfile state machine
Returns
0 on success

Definition at line 756 of file fsm.c.

References _free(), iosm_s::cfd, iosm_s::debug, iosm_s::failedFile, fdFree(), fsmGetTs(), fsmUNSAFE, IOSM_DESTROY, iosm_s::iter, iosm_s::lmtab, mapFreeIterator(), iosm_s::op_digest, iosm_s::rc, rpmswAdd(), RPMTS_OP_DIGEST, rpmtsFree(), rpmtsOp(), and iosmIterator_s::ts.

Referenced by cpio_doio(), and rpmpsmStage().

§ mapFind()

static int mapFind ( FSMI_t  iter,
const char *  fsmPath 
)
static

Locate archive path in file info.

Parameters
iterfile info iterator
fsmPatharchive path
Returns
index into file info, -1 if archive path was not found

Definition at line 239 of file fsm.c.

References cpioStrCmp(), iosmIterator_s::fi, iosmIterator_s::i, mapNextIterator(), and rpmfiFC().

Referenced by fsmStage().

§ mapFreeIterator()

static void* mapFreeIterator ( void *  _iter)
static

Destroy file info iterator.

Parameters
_iterfile info iterator
Return values
NULLalways

Definition at line 141 of file fsm.c.

References _free(), iosmIterator_s::fi, rpmfiUnlink(), rpmtsFree(), and iosmIterator_s::ts.

Referenced by freeFSM(), and fsmTeardown().

§ mapInitIterator()

static void* mapInitIterator ( rpmfi  fi,
int  reverse 
)
static

Create file info iterator.

Parameters
fitransaction element file info
reverseiterate in reverse order?
Returns
file info iterator

Definition at line 163 of file fsm.c.

References iosmIterator_s::fi, iosmIterator_s::i, iosmIterator_s::isave, reverse, iosmIterator_s::reverse, rpmfiLink(), and xcalloc().

Referenced by fsmSetup().

§ mapNextIterator()

static int mapNextIterator ( void *  _iter)
static

Return next index into file info.

Parameters
_iterfile info iterator
Returns
next index, -1 on termination

Definition at line 183 of file fsm.c.

References iosmIterator_s::fi, iosmIterator_s::i, iosmIterator_s::isave, and iosmIterator_s::reverse.

Referenced by fsmStage(), and mapFind().

§ newFSM()

IOSM_t newFSM ( void  )

Create file state machine instance.

Returns
file state machine

Definition at line 556 of file fsm.c.

References xcalloc().

Referenced by rpmfiNew().

§ saveHardLink()

static int saveHardLink ( IOSM_t  fsm)
static

§ writeFile()

static int writeFile ( IOSM_t  fsm,
int  writeData 
)
static

§ writeLinkedFile()

static int writeLinkedFile ( IOSM_t  fsm)
static

Write set of linked files to payload stream.

Parameters
fsmfile state machine data
Returns
0 on success

Definition at line 1208 of file fsm.c.

References _free(), iosm_s::astriplen, iosm_s::failedFile, hardLink_s::filex, fsmNext(), iosm_s::headerWrite, dnli_s::i, IOSM_MAP, iosm_s::ix, iosm_s::li, iosm_s::lpath, hardLink_s::nlink, iosm_s::nsuffix, iosm_s::path, stpcpy(), tarHeaderWrite(), urlPath(), writeFile(), xmalloc, and xstrdup().

Referenced by fsmStage().

Variable Documentation

§ _fsm_debug

int _fsm_debug = 0

Definition at line 61 of file fsm.c.

Referenced by fsmSetup().

§ _fsm_threads

int _fsm_threads = 0

Definition at line 65 of file fsm.c.

Referenced by fsmSetup().