# PAYLOAD.

## Files

file | cpio.c
| Handle cpio payloads within rpm packages.

file | cpio.h
| Structures used to handle cpio payloads within rpm packages.

file | fsm.c
| File state machine to handle a payload from a package.

file | fsm.h
| File state machine to handle a payload within an rpm package.

file | psm.c
| Package state machine to handle a package from a transaction set.

file | psm.h
| Package state machine to handle a package from a transaction set.

file | rpmlib.h

## Data Structures

struct | cpioCrcPhysicalHeader
struct | dnli_s
struct | hardLink_s
struct | fsmIterator_s
struct | fsm_s

## RPMTS

typedef fsmIterator_s * | FSMI_t
typedef fsm_s * | FSM_t

## Defines

#define | CPIOERR_CHECK_ERRNO 0x00008000

## Typedefs

typedef enum cpioMapFlags_e | cpioMapFlags
typedef dnli_s * | DNLI_t

## Enumerations

enum

cpioErrorReturns {
CPIOERR_BAD_MAGIC = (2 ), CPIOERR_BAD_HEADER = (3 ), CPIOERR_OPEN_FAILED = (4 | 0x00008000 ), CPIOERR_CHMOD_FAILED = (5 | 0x00008000 ),
CPIOERR_CHOWN_FAILED = (6 | 0x00008000 ), CPIOERR_WRITE_FAILED = (7 | 0x00008000 ), CPIOERR_UTIME_FAILED = (8 | 0x00008000 ), CPIOERR_UNLINK_FAILED = (9 | 0x00008000 ),
CPIOERR_RENAME_FAILED = (10 | 0x00008000 ), CPIOERR_SYMLINK_FAILED = (11 | 0x00008000 ), CPIOERR_STAT_FAILED = (12 | 0x00008000 ), CPIOERR_LSTAT_FAILED = (13 | 0x00008000 ),
CPIOERR_MKDIR_FAILED = (14 | 0x00008000 ), CPIOERR_RMDIR_FAILED = (15 | 0x00008000 ), CPIOERR_MKNOD_FAILED = (16 | 0x00008000 ), CPIOERR_MKFIFO_FAILED = (17 | 0x00008000 ),
CPIOERR_LINK_FAILED = (18 | 0x00008000 ), CPIOERR_READLINK_FAILED = (19 | 0x00008000 ), CPIOERR_READ_FAILED = (20 | 0x00008000 ), CPIOERR_COPY_FAILED = (21 | 0x00008000 ),
CPIOERR_HDR_SIZE = (22 ), CPIOERR_HDR_TRAILER = (23 ), CPIOERR_UNKNOWN_FILETYPE = (24 ), CPIOERR_MISSING_HARDLINK = (25 ),
CPIOERR_MD5SUM_MISMATCH = (26 ), CPIOERR_INTERNAL = (27 ), CPIOERR_UNMAPPED_FILE = (28 )
}

enum | cpioMapFlags_e { 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), CPIO_MAP_ABSOLUTE = (1 << 5), CPIO_MAP_ADDDOT = (1 << 6), CPIO_ALL_HARDLINKS = (1 << 7), CPIO_MAP_TYPE = (1 << 8), CPIO_MULTILIB = (1 << 31) }

## Functions

const char *const | cpioStrerror (int rc)
const char * | fsmFsPath (const FSM_t fsm, const struct stat *st, const char *subdir, const char *suffix)
void * | mapFreeIterator (const void *p)
void * | mapInitIterator (const void *a, const void *b)
int | mapNextIterator (void *a)
int | cpioStrCmp (const void *a, const void *b)
int | mapFind (void *a, const char *fsmPath)
void * | dnlFreeIterator (const void *a)
int | dnlCount (const DNLI_t dnli)
int | dnlIndex (const DNLI_t dnli)
void * | dnlInitIterator (const FSM_t fsm, int reverse)
const char * | dnlNextIterator (DNLI_t dnli)
int | saveHardLink (FSM_t fsm)
void * | freeHardLink (struct hardLink_s *li)
int | expandRegular (FSM_t fsm)
int | writeFile (FSM_t fsm, int writeData)
int | writeLinkedFile (FSM_t fsm)
int | fsmMakeLinks (FSM_t fsm)
int | fsmCommitLinks (FSM_t fsm)

## Define Documentation

#define CPIOERR_CHECK_ERRNO 0x00008000

Note:
  CPIO_CHECK_ERRNO bit is set only if errno is valid.

Definition at line 23 of file cpio.h.

Referenced by cpioStrerror().

## Typedef Documentation

typedef enum cpioMapFlags_e cpioMapFlags

typedef struct dnli_s * DNLI_t

| Directory name iterator. Referenced by dnlCount(), dnlFreeIterator(), dnlIndex(), dnlInitIterator(), and dnlNextIterator().

typedef struct fsm_s* FSM_t

File state machine data.

Definition at line 1240 of file rpmlib.h.

Referenced by cpioHeaderRead(), cpioHeaderWrite(), cpioTrailerWrite(), dnlInitIterator(), expandRegular(), freeFSM(), fsmCommitLinks(), fsmFsPath(), fsmGetFi(), fsmGetTs(), fsmMakeLinks(), fsmMapAttrs(), fsmMapPath(), fsmMkdirs(), fsmRmdirs(), fsmSetup(), fsmStage(), fsmTeardown(), newFSM(), saveHardLink(), writeFile(), and writeLinkedFile().

typedef struct fsmIterator_s* FSMI_t

| Iterator across package file info, forward on install, backward on erase. Definition at line 1235 of file rpmlib.h. Referenced by fsmGetFi(), fsmGetTs(), mapFind(), mapInitIterator(), and mapNextIterator().

## Enumeration Type Documentation

enum cpioErrorReturns

Enumeration values:

  CPIOERR_BAD_MAGIC |
  CPIOERR_BAD_HEADER |
  CPIOERR_OPEN_FAILED |
  CPIOERR_CHMOD_FAILED |
  CPIOERR_CHOWN_FAILED |
  CPIOERR_WRITE_FAILED |
  CPIOERR_UTIME_FAILED |
  CPIOERR_UNLINK_FAILED |
  CPIOERR_RENAME_FAILED |
  CPIOERR_SYMLINK_FAILED |
  CPIOERR_STAT_FAILED |
  CPIOERR_LSTAT_FAILED |
  CPIOERR_MKDIR_FAILED |
  CPIOERR_RMDIR_FAILED |
  CPIOERR_MKNOD_FAILED |
  CPIOERR_MKFIFO_FAILED |
  CPIOERR_LINK_FAILED |
  CPIOERR_READLINK_FAILED |
  CPIOERR_READ_FAILED |
  CPIOERR_COPY_FAILED |
  CPIOERR_HDR_SIZE |
  CPIOERR_HDR_TRAILER |
  CPIOERR_UNKNOWN_FILETYPE |
  CPIOERR_MISSING_HARDLINK |
  CPIOERR_MD5SUM_MISMATCH |
  CPIOERR_INTERNAL |
  CPIOERR_UNMAPPED_FILE |

Definition at line 27 of file cpio.h.

enum cpioMapFlags_e

Enumeration values:

  CPIO_MAP_PATH |
  CPIO_MAP_MODE |
  CPIO_MAP_UID |
  CPIO_MAP_GID |
  CPIO_FOLLOW_SYMLINKS | only for building.
  CPIO_MAP_ABSOLUTE |
  CPIO_MAP_ADDDOT |
  CPIO_ALL_HARDLINKS | fail if hardlinks are missing.
  CPIO_MAP_TYPE | only for building.
  CPIO_MULTILIB | internal, only for building.

Definition at line 60 of file cpio.h.

## Function Documentation

int cpioStrCmp | ( | const void * | a,
|  | const void * | b
| ) | `[static]`

| Definition at line 138 of file fsm.c. Referenced by mapFind().

const char* const cpioStrerror | ( | int | rc | ) |

Return formatted error message on payload handling failure.

Parameters:

  error | code

Returns:
  formatted error string

Definition at line 180 of file cpio.c.

References _, CPIOERR_BAD_HEADER, CPIOERR_BAD_MAGIC, CPIOERR_CHECK_ERRNO, CPIOERR_CHMOD_FAILED, CPIOERR_CHOWN_FAILED, CPIOERR_COPY_FAILED, CPIOERR_HDR_SIZE, CPIOERR_INTERNAL, CPIOERR_LINK_FAILED, CPIOERR_LSTAT_FAILED, CPIOERR_MD5SUM_MISMATCH, CPIOERR_MISSING_HARDLINK, CPIOERR_MKDIR_FAILED, CPIOERR_MKFIFO_FAILED, CPIOERR_MKNOD_FAILED, CPIOERR_OPEN_FAILED, CPIOERR_READ_FAILED, CPIOERR_READLINK_FAILED, CPIOERR_RENAME_FAILED, CPIOERR_RMDIR_FAILED, CPIOERR_STAT_FAILED, CPIOERR_SYMLINK_FAILED, CPIOERR_UNKNOWN_FILETYPE, CPIOERR_UNLINK_FAILED, CPIOERR_UNMAPPED_FILE, CPIOERR_UTIME_FAILED, CPIOERR_WRITE_FAILED, errno, and strerror().

Referenced by cpio_doio(), and psmStage().

int dnlCount | ( | const DNLI_t | dnli | ) | `[inline, static]`

| Definition at line 210 of file fsm.c. References transactionFileInfo_s::dc, DNLI_t, and dnli_s::fi. Referenced by fsmMkdirs(), and fsmRmdirs().

void* dnlFreeIterator | ( | const void * | a | ) | `[static]`

Destroy directory name iterator.

Parameters:

  a | directory name iterator

Return values:

  NULL | always

Definition at line 198 of file fsm.c.

References _free(), dnli_s::active, and DNLI_t.

Referenced by fsmMkdirs(), and fsmRmdirs().

int dnlIndex | ( | const DNLI_t | dnli | ) | `[inline, static]`

| Definition at line 218 of file fsm.c. References DNLI_t, and dnli_s::isave. Referenced by fsmMkdirs(), and fsmRmdirs().

void* dnlInitIterator | ( | const FSM_t | fsm,
|  | int | reverse
| ) | `[static]`

Create directory name iterator.

Parameters:

  fsm | file state machine data
  reverse | traverse directory names in reverse order?

Returns:
  directory name iterator

Definition at line 230 of file fsm.c.

References _, transactionFileInfo_s::actions, transactionFileInfo_s::bnl, transactionFileInfo_s::dc, transactionFileInfo_s::dil, transactionFileInfo_s::dnl, DNLI_t, transactionFileInfo_s::fc, transactionFileInfo_s::fmodes, FSM_t, fsmGetFi(), RPMMESS_DEBUG, rpmMessage, TFI_t, xcalloc(), and XFA_SKIPPING.

Referenced by fsmMkdirs(), and fsmRmdirs().

const char* dnlNextIterator | ( | DNLI_t | dnli | ) | `[static]`

Return next directory name (from file info).

Parameters:

  dnli | directory name iterator

Returns:
  next directory name

Definition at line 306 of file fsm.c.

References dnli_s::active, transactionFileInfo_s::dc, transactionFileInfo_s::dnl, DNLI_t, dnli_s::fi, dnli_s::i, dnli_s::isave, dnli_s::reverse, and TFI_t.

Referenced by fsmMkdirs(), and fsmRmdirs().

int expandRegular | ( | FSM_t | fsm | ) | `[static]`

Create file from payload stream.

Todo:
  Legacy: support brokenEndian MD5 checks?

Parameters:

  fsm | file state machine data

Returns:
  0 on success

Definition at line 670 of file fsm.c.

References _free(), CPIOERR_MD5SUM_MISMATCH, fdFiniDigest(), fdInitDigest(), Fflush(), fsm_s::fmd5sum, FSM_DREAD, FSM_NOTIFY, FSM_t, FSM_WCLOSE, FSM_WOPEN, FSM_WRITE, fsmStage(), PGPHASHALGO_MD5, fsm_s::sb, fsm_s::wfd, fsm_s::wrlen, fsm_s::wrnb, and fsm_s::wrsize.

Referenced by fsmStage().

void* freeHardLink | ( | struct hardLink_s * | li | ) | `[static]`

Destroy set of hard links.

Parameters:

  li | set of hard links

Definition at line 422 of file fsm.c.

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

Referenced by freeFSM(), and fsmStage().

int fsmCommitLinks | ( | FSM_t | fsm | ) | `[static]`

Commit hard linked file set atomically.

Parameters:

  fsm | file state machine data

Returns:
  0 on success

Definition at line 978 of file fsm.c.

References _free(), fsm_s::action, hardLink_s::filex, FSM_COMMIT, FSM_MAP, FSM_t, fsmStage(), fsm_s::ix, fsm_s::li, fsm_s::links, hardLink_s::next, hardLink_s::nlink, fsm_s::nsuffix, fsm_s::path, hardLink_s::sb, fsm_s::sb, and XFA_SKIPPING.

Referenced by fsmStage().

const char* fsmFsPath | ( | const FSM_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:

  fsm | file state machine data
  st | file stat info
  subdir | subdir to use (NULL disables)
  suffix | suffix to use (NULL disables)

Return values:

  path | to file

Definition at line 55 of file fsm.c.

References fsm_s::baseName, fsm_s::dirName, FSM_t, stpcpy(), and xmalloc().

Referenced by fsmMapPath(), and fsmStage().

int fsmMakeLinks | ( | FSM_t | fsm | ) | `[static]`

Create pending hard links to existing file.

Parameters:

  fsm | file state machine data

Returns:
  0 on success

Definition at line 920 of file fsm.c.

References _free(), fsm_s::action, CPIOERR_LSTAT_FAILED, hardLink_s::createdPath, fsm_s::failedFile, hardLink_s::filex, FSM_LINK, FSM_MAP, FSM_t, FSM_VERIFY, fsmStage(), fsm_s::ix, fsm_s::li, hardLink_s::linksLeft, hardLink_s::nlink, fsm_s::nsuffix, fsm_s::opath, fsm_s::path, XFA_SKIPPING, and xstrdup().

Referenced by fsmStage().

int mapFind | ( | void * | a,
|  | const char * | fsmPath
| ) | `[static]`

Locate archive path in file info.

Parameters:

  a | file info iterator
  fsmPath | archive path

Returns:
  index into file info, -1 if archive path was not found

Definition at line 161 of file fsm.c.

References transactionFileInfo_s::apath, cpioStrCmp(), transactionFileInfo_s::fc, fsmIterator_s::fi, FSMI_t, fsmIterator_s::i, mapNextIterator(), and TFI_t.

Referenced by fsmStage().

void* mapFreeIterator | ( | const void * | p | ) | `[static]`

Destroy file info iterator.

Parameters:

  p | file info iterator

Return values:

  NULL | always

Definition at line 88 of file fsm.c.

References _free().

Referenced by freeFSM(), and fsmTeardown().

void* mapInitIterator | ( | const void * | a,
|  | const void * | b
| ) | `[static]`

Create file info iterator.

Parameters:

  a | transaction set
  b | transaction element file info

Returns:
  file info iterator

Definition at line 100 of file fsm.c.

References transactionFileInfo_s::action, FA_COPYOUT, transactionFileInfo_s::fc, FSMI_t, rpmTransactionSet, TFI_t, transactionFileInfo_s::type, and xcalloc().

Referenced by fsmSetup().

int mapNextIterator | ( | void * | a | ) | `[static]`

Return next index into file info.

Parameters:

  a | file info iterator

Returns:
  next index, -1 on termination

Definition at line 122 of file fsm.c.

References transactionFileInfo_s::fc, fsmIterator_s::fi, FSMI_t, fsmIterator_s::i, fsmIterator_s::isave, fsmIterator_s::reverse, and TFI_t.

Referenced by fsmStage(), and mapFind().

int saveHardLink | ( | FSM_t | fsm | ) | `[static]`

Save hard link in chain.

Parameters:

  fsm | file state machine data

Returns:
  Is chain only partially filled?

Definition at line 335 of file fsm.c.

References _free(), transactionFileInfo_s::actions, hardLink_s::createdPath, hardLink_s::filex, FSM_MAP, FSM_PKGBUILD, FSM_PKGINSTALL, FSM_t, fsmGetFi(), fsmStage(), fsm_s::goal, fsm_s::ix, fsm_s::li, hardLink_s::linkIndex, fsm_s::links, hardLink_s::linksLeft, hardLink_s::next, hardLink_s::nlink, fsm_s::nsuffix, hardLink_s::nsuffix, fsm_s::path, hardLink_s::sb, fsm_s::sb, TFI_t, xcalloc(), and XFA_SKIPPING.

Referenced by fsmStage().

int writeFile | ( | FSM_t | fsm,
|  | int | writeData
| ) | `[static]`

Write next item to payload stream.

Parameters:

  fsm | file state machine data
  writeData | should data be written?

Returns:
  0 on success

Definition at line 734 of file fsm.c.

References alloca(), alloca_strdup, transactionFileInfo_s::ap, transactionFileInfo_s::apath, fsm_s::baseName, transactionFileInfo_s::bnl, fsm_s::cfd, CPIO_MAP_ABSOLUTE, CPIO_MAP_ADDDOT, CPIO_MAP_PATH, fsm_s::dirName, fdGetCpioPos(), Fileno(), FSM_DWRITE, FSM_HWRITE, FSM_PAD, FSM_RCLOSE, FSM_READ, FSM_READLINK, FSM_ROPEN, FSM_t, fsmGetFi(), fsmGetTs(), fsmStage(), transactionFileInfo_s::h, fsm_s::ix, availablePackage::key, fsm_s::mapFlags, rpmTransactionSet_s::notify, rpmTransactionSet_s::notifyData, fsm_s::opath, fsm_s::osb, fsm_s::path, fsm_s::rdbuf, fsm_s::rdlen, fsm_s::rdnb, fsm_s::rdsize, fsm_s::rfd, RPMCALLBACK_INST_PROGRESS, rpmTransactionSet, S_ISLNK, fsm_s::sb, stpcpy(), transactionFileInfo_s::striplen, TFI_t, and fsm_s::wrnb.

Referenced by fsmStage(), and writeLinkedFile().

int writeLinkedFile | ( | FSM_t | fsm | ) | `[static]`

Write set of linked files to payload stream.

Parameters:

  fsm | file state machine data

Returns:
  0 on success

Definition at line 876 of file fsm.c.

References _free(), fsm_s::failedFile, hardLink_s::filex, FSM_MAP, FSM_t, fsmStage(), fsm_s::ix, fsm_s::li, hardLink_s::nlink, fsm_s::nsuffix, fsm_s::path, writeFile(), and xstrdup().

Referenced by fsmStage().