rpm  5.4.14
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 voidmapFreeIterator (void *_iter)
 Destroy 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 voiddnlFreeIterator (const void *_dnli)
 Destroy directory name iterator. More...
 
static int dnlCount (const DNLI_t dnli)
 
static int dnlIndex (const DNLI_t dnli)
 
static voiddnlInitIterator (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 voidfreeHardLink (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
 
static voiditer = (FSMI_t) xcalloc(1, sizeof(*iter))
 Create file info iterator. More...
 
iter fi = ((rpmfi) rpmioLinkPoolItem((rpmioItem)( fi ), "mapIterator" , __FILE__, __LINE__))
 
iter reverse = reverse
 
iter i = (iter->reverse ? (fi->fc - 1) : 0)
 
iter isave = iter->i
 

Detailed Description

File state machine to handle a payload from a package.

Definition in file fsm.c.

Macro Definition Documentation

#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:2681

Referenced by fsmStage().

#define _FSM_DEBUG   0

Definition at line 59 of file fsm.c.

#define _IOSM_INTERNAL

Definition at line 27 of file fsm.c.

#define _RPMDB_INTERNAL

Definition at line 21 of file fsm.c.

#define _RPMFI_INTERNAL

Definition at line 24 of file fsm.c.

Referenced by fsmSetup(), and iosmSetup().

#define _USE_RPMTE

Definition at line 31 of file fsm.c.

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

Definition at line 57 of file fsm.c.

#define fsmUNSAFE   fsmStage

Definition at line 29 of file fsm.c.

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

#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] == ';'))
return NULL
Definition: poptALL.c:613

Definition at line 1593 of file fsm.c.

Referenced by fsmStage().

#define SUFFIX_RPMNEW   ".rpmnew"

Definition at line 98 of file fsm.c.

Referenced by fsmMapPath().

#define SUFFIX_RPMORIG   ".rpmorig"

Definition at line 96 of file fsm.c.

Referenced by fsmMapPath().

#define SUFFIX_RPMSAVE   ".rpmsave"

Definition at line 97 of file fsm.c.

Referenced by fsmMapPath().

Function Documentation

IOSM_t freeFSM ( IOSM_t  fsm)

Destroy file state machine instance.

Parameters
fsmfile state machine
Returns
always NULL

Definition at line 557 of file fsm.c.

References _free(), iosm_s::dnlx, freeHardLink(), iosm_s::iter, iosm_s::ldn, iosm_s::li, iosm_s::links, mapFreeIterator(), hardLink_s::next, NULL, and iosm_s::path.

Referenced by rpmfiFini().

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, iter, iosm_s::iter, and NULL.

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

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 iter, iosm_s::iter, NULL, and iosmIterator_s::ts.

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

int fsmMapAttrs ( IOSM_t  fsm)
static int fsmMapFContext ( IOSM_t  fsm)
static

Definition at line 783 of file fsm.c.

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

Referenced by fsmStage().

int fsmMapPath ( IOSM_t  fsm)
static int fsmMkdirs ( IOSM_t  fsm)
static

Create (if necessary) directories not explicitly included in package.

Parameters
fsmfile state machine data
Returns
0 on success

Definition at line 1441 of file fsm.c.

References _free(), D_, dc, dnlCount(), dnlFreeIterator(), dnlIndex(), dnlInitIterator(), dnlNextIterator(), iosm_s::dnlx, iosm_s::fcontext, fsmGetFi(), fsmNext(), fsmUNSAFE, i, IOSM_LSETFCON, IOSM_LSTAT, IOSM_MKDIR, IOSMERR_ENOENT, iosm_s::ldn, iosm_s::ldnalloc, iosm_s::ldnlen, iosm_s::nofcontexts, NULL, iosm_s::osb, iosm_s::path, path, rc, iosm_s::rdbuf, rpmlog(), RPMLOG_DEBUG, rpmsxMatch(), iosm_s::sb, st, stpcpy(), strcmp(), te, urlPath(), void, xcalloc(), and xrealloc.

Referenced by fsmStage().

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 fsmCommitLinks(), fsmMakeLinks(), fsmMkdirs(), fsmRmdirs(), fsmSetup(), fsmStage(), saveHardLink(), writeFile(), and writeLinkedFile().

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 1386 of file fsm.c.

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

Referenced by fsmStage().

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

File state machine driver.

Parameters
fsmfile state machine
stagenext stage
Returns
0 on success

Definition at line 1600 of file fsm.c.

References _, _fafilter, _free(), iosm_s::action, alloca(), assert(), iosm_s::astriplen, b, iosm_s::cfd, iosm_s::commit, hardLink_s::createdPath, iosm_s::debug, iosm_s::diskchecked, dlen, iosm_s::dnlx, errno, iosm_s::exists, extractRegular(), FA_ERASE, FA_UNKNOWN, iosm_s::failedFile, Fclose(), iosm_s::fcontext, fd, fdGetCpioPos(), iosm_s::fflags, Fileno(), hardLink_s::filex, fn, Fopen(), freeHardLink(), fsmCommitLinks(), fsmFsPath(), fsmGetFi(), fsmGetTs(), fsmMakeLinks(), fsmMapAttrs(), fsmMapFContext(), fsmMapPath(), fsmMkdirs(), fsmNext(), fsmRmdirs(), fsmUNSAFE, iosm_s::goal, i, int, 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, j, 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(), memset(), iosm_s::mkdirsdone, mode, hardLink_s::next, hardLink_s::nlink, iosm_s::nsuffix, NULL, iosm_s::opath, iosm_s::osb, iosm_s::osuffix, iosm_s::path, path, iosm_s::postpone, ptr, iosm_s::rc, 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, rpmtsGetRdb(), rpmtsNotify(), S_ISLNK, S_ISSOCK, saveHardLink(), hardLink_s::sb, iosm_s::sb, st, iosm_s::stage, stpcpy(), strcmp(), iosm_s::strict_erasures, iosm_s::subdir, iosm_s::sufbuf, iosm_s::suffix, t, Unlink(), urlPath(), void, iosm_s::wrb, iosm_s::wrbuf, writeFile(), writeLinkedFile(), iosm_s::wrsize, xmalloc, and xstrdup().

Referenced by fsmNext().

int fsmTeardown ( void _fsm)

Clean file state machine.

Parameters
_fsmfile state machine
Returns
0 on success

Definition at line 751 of file fsm.c.

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

Referenced by cpio_doio(), and rpmpsmStage().

IOSM_t newFSM ( void  )

Create file state machine instance.

Returns
file state machine

Definition at line 551 of file fsm.c.

References xcalloc().

Referenced by rpmfiNew().

Variable Documentation

int _fsm_debug = 0

Definition at line 61 of file fsm.c.

Referenced by fsmSetup().

int _fsm_threads = 0

Definition at line 65 of file fsm.c.

Referenced by fsmSetup().

iter fi = ((rpmfi) rpmioLinkPoolItem((rpmioItem)( fi ), "mapIterator" , __FILE__, __LINE__))
iter i = (iter->reverse ? (fi->fc - 1) : 0)

Definition at line 173 of file fsm.c.

iter isave = iter->i

Definition at line 174 of file fsm.c.

return iter = (FSMI_t) xcalloc(1, sizeof(*iter))

Create file info iterator.

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

Definition at line 168 of file fsm.c.

Referenced by fsmGetFi(), fsmGetTs(), iosmGetFi(), and mapFreeIterator().

iter reverse = reverse

Definition at line 172 of file fsm.c.