# header.c File Reference

`#include "system.h"`
`#include <header_internal.h>`
`#include "debug.h"`

Go to the source code of this file.

## Defines

#define | __HEADER_PROTOTYPES__
#define | PARSER_BEGIN 0
#define | PARSER_IN_ARRAY 1
#define | PARSER_IN_EXPR 2
#define | hdrchkTags(_ntags) ((_ntags) & 0xffff0000)
| Sanity check on no.
#define | hdrchkData(_nbytes) ((_nbytes) & 0xff000000)
| Sanity check on data size and/or offset.

## Functions

const char *const | tagName (int tag)
static void * | _free (const void *p)
| Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
static int | indexCmp (const void *avp, const void *bvp)
static int | offsetCmp (const void *avp, const void *bvp)
static int | dataLength (int_32 type, hPTR_t p, int_32 count, int onDisk)
| Return length of entry data.
static int | regionSwab (indexEntry entry, int il, int dl, entryInfo pe, char *dataStart, int regionid)
static void * | doHeaderUnload (Header h, int *lengthPtr)
static indexEntry | findEntry (Header h, int_32 tag, int_32 type)
| Find matching (tag,type) entry in header.
static int | copyEntry (const indexEntry entry, hTYP_t type, hPTR_t *p, hCNT_t c, int minMem)
static int | headerMatchLocale (const char *td, const char *l, const char *le)
| Does locale match entry in header i18n table?
static char * | headerFindI18NString (Header h, indexEntry entry)
| Return i18n string from header that matches locale.
static int | intGetEntry (Header h, int_32 tag, hTAG_t type, hPTR_t *p, hCNT_t c, int minMem)
| Retrieve tag data from header.
int | headerGetRawEntry (Header h, int_32 tag, int_32 *type, hPTR_t *p, int_32 *c)
static void | copyData (int_32 type, void *dstPtr, const void *srcPtr, int_32 c, int dataLength)
static void * | grabData (int_32 type, hPTR_t p, int_32 c, int *lengthPtr)
| Return (malloc'ed) copy of entry data.
static char | escapedChar (const char ch)
static sprintfToken | freeFormat (sprintfToken format, int num)
| Destroy headerSprintf format array.
static void | findTag (char *name, const headerTagTableEntry tags, const headerSprintfExtension extensions, headerTagTableEntry *tagMatch, headerSprintfExtension *extMatch)
static int | parseExpression (sprintfToken token, char *str, const headerTagTableEntry tags, const headerSprintfExtension extensions, char **endPtr, errmsg_t *errmsg)
static int | parseFormat (char *str, const headerTagTableEntry tags, const headerSprintfExtension extensions, sprintfToken *formatPtr, int *numTokensPtr, char **endPtr, int state, errmsg_t *errmsg)
static int | getExtension (Header h, headerTagTagFunction fn, hTYP_t typeptr, hPTR_t *data, hCNT_t countptr, extensionCache ext)
static char * | formatValue (sprintfTag tag, Header h, const headerSprintfExtension extensions, extensionCache extCache, int element)
static const char * | singleSprintf (Header h, sprintfToken token, const headerSprintfExtension extensions, extensionCache extCache, int element)
static extensionCache | allocateExtensionCache (const headerSprintfExtension extensions)
static extensionCache | freeExtensionCache (const headerSprintfExtension extensions, extensionCache cache)
static char * | octalFormat (int_32 type, hPTR_t data, char *formatPrefix, int padding, int element)
static char * | hexFormat (int_32 type, hPTR_t data, char *formatPrefix, int padding, int element)
static char * | realDateFormat (int_32 type, hPTR_t data, char *formatPrefix, int padding, int element, const char *strftimeFormat)
static char * | dateFormat (int_32 type, hPTR_t data, char *formatPrefix, int padding, int element)
static char * | dayFormat (int_32 type, hPTR_t data, char *formatPrefix, int padding, int element)
static char * | shescapeFormat (int_32 type, hPTR_t data, char *formatPrefix, int padding, int element)

## Variables

static unsigned char | header_magic [8]
static size_t | headerMaxbytes = (32*1024*1024)
static int | typeSizes []
HV_t | hdrVec = &hdrVec1
const struct headerSprintfExtension_s | headerDefaultFormats []
static struct HV_s | hdrVec1

## Detailed Description

Definition in file header.c.

## Define Documentation

#define __HEADER_PROTOTYPES__

| Definition at line 13 of file header.c.

#define hdrchkData | ( | _nbytes |  | ) | ((_nbytes) & 0xff000000)

| Sanity check on data size and/or offset. This check imposes a limit of 16Mb, more than enough. Definition at line 58 of file header.c. Referenced by doHeaderUnload().

#define hdrchkTags | ( | _ntags |  | ) | ((_ntags) & 0xffff0000)

| Sanity check on no. of tags. This check imposes a limit of 65K tags, more than enough. Definition at line 52 of file header.c. Referenced by doHeaderUnload().

#define PARSER_BEGIN 0

| Definition at line 31 of file header.c.

#define PARSER_IN_ARRAY 1

| Definition at line 32 of file header.c. Referenced by parseFormat().

#define PARSER_IN_EXPR 2

| Definition at line 33 of file header.c. Referenced by parseExpression(), and parseFormat().

## Function Documentation

static void* _free | ( | const void * | p | ) | `[inline, static]`

Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.

Parameters:

  | p | memory to free

Returns:
  NULL always

Definition at line 86 of file header.c.

Referenced by addFileToTagAux(), addOrAppendListEntry(), addSource(), alAllFileSatisfiesDepend(), alFree(), alFreeIndex(), alSatisfiesDepend(), armorFormat(), base64Format(), buildForTarget(), checkPackageDeps(), checkSpec(), cleanOSE(), closeSpec(), cpio_doio(), cpioHeaderRead(), db1close(), db1open(), db3close(), db3open(), db3stat(), db_init(), dbiFreeIndexSet(), dbiTagsInit(), dbiUpdateRecord(), defaultMachine(), dnlFreeIterator(), doBuildFileList(), doHeaderUnload(), domd5(), doPatch(), doReadRC(), doRmSource(), doScript(), doSetupMacro(), doUntar(), expandFilelist(), expandRegular(), fillOutMainPackage(), formatValue(), freeAttrRec(), freeExtensionCache(), freeFi(), freeFileList(), freeFilesystems(), freeFl(), freeFormat(), freeFSM(), freeHardLink(), freeNames(), freePackage(), freeRpmVar(), freeSl(), freeSources(), freeSpec(), freeSplitString(), freeSt(), freeStringBuf(), freeTriggerFiles(), fsmCommitLinks(), fsmMakeLinks(), fsmMapPath(), fsmStage(), fssizesTag(), genCpioListAndHeader(), generateDepends(), getFilesystemList(), handlePreambleTag(), htFree(), i18nTag(), IDTXfree(), IDTXglob(), ignoreDep(), machCompatCacheAdd(), machFindEquivs(), main(), makeGPGSignature(), makePGPSignature(), makeTempFile(), mapFreeIterator(), newRpmdb(), packageBinaries(), packageSources(), parseDescription(), parseExpressionBoolean(), parseExpressionString(), parseFiles(), parseForRegexLang(), parseForRegexMultiLib(), parseForSimple(), parseRCPOT(), parseScript(), parseSpec(), permsFormat(), pgpFreeDig(), pgpHexSet(), pgpReadPkts(), popMacro(), poptFreeContext(), poptGetNextOpt(), poptResetContext(), poptSetExecPath(), poptSetOtherOptionHelp(), printFileInfo(), printNewSpecfile(), processBinaryFile(), processPackageFiles(), processSourceFiles(), psmStage(), pushMacro(), readIcon(), readLine(), relocateFileList(), rhnUnload(), rpmCheckSig(), rpmdbAdd(), rpmdbClose(), rpmdbFindByFile(), rpmdbFindFpList(), rpmdbFreeIterator(), rpmdbMoveDatabase(), rpmdbNextIterator(), rpmdbRebuild(), rpmdbRemove(), rpmdbRemoveDatabase(), rpmdbSetIteratorRE(), rpmdepCheck(), rpmdepFreeConflicts(), rpmdepOrder(), rpmDetectPGPVersion(), rpmErase(), rpmExpandNumeric(), rpmFreeMacros(), rpmFreeRpmrc(), rpmGenPath(), rpmGetFilesystemUsage(), rpmGetPassPhrase(), rpmGetRpmlibProvides(), rpmGlob(), rpmInitMacros(), rpmInstall(), rpmInstallSource(), rpmInstallSourcePackage(), rpmlogClose(), rpmLookupSignatureType(), rpmProblemPrint(), rpmProblemSetFree(), rpmQueryVerify(), rpmRangesOverlap(), rpmReadConfigFiles(), rpmReadPackageManifest(), rpmReadRC(), rpmRebuildTargetVars(), rpmReSign(), rpmRollback(), rpmRunTransactions(), rpmSetMachine(), rpmSetVarArch(), rpmShowProgress(), rpmtransFree(), rpmVerifyDigest(), rpmVerifyScript(), runScript(), saveHardLink(), setPathDefault(), showQueryPackage(), singleOptionDefaultValue(), singleOptionHelp(), singleSprintf(), skipFiles(), triggercondsTag(), tsFreeIterator(), urlFind(), urlFreeCache(), urlSplit(), valueFree(), verifyGPGSignature(), verifyHeader(), verifyPGPSignature(), vrpmlog(), writeLinkedFile(), writeRPM(), XfdFree(), XurlFree(), and zapRelation().

static extensionCache allocateExtensionCache | ( | const headerSprintfExtension | extensions | ) | `[static]`

| Definition at line 2809 of file header.c. References HEADER_EXT_LAST, HEADER_EXT_MORE, headerSprintfExtension_s::more, headerSprintfExtension_s::type, headerSprintfExtension_s::u, and xcalloc().

static void copyData | ( | int_32 | type,
|  | void * | dstPtr,
|  | const void * | srcPtr,
|  | int_32 | c,
|  | int | dataLength
| ) | `[static]`

| Definition at line 1632 of file header.c. References dataLength(), RPM_I18NSTRING_TYPE, and RPM_STRING_ARRAY_TYPE. Referenced by grabData().

static int dataLength | ( | int_32 | type,
|  | hPTR_t | p,
|  | int_32 | count,
|  | int | onDisk
| ) | `[static]`

Return length of entry data.

Todo:
  Remove sanity check exit's.

Parameters:

  | type | entry data type
  | p | entry data
  | count | entry item count
  | onDisk | data is concatenated strings (with NUL's))?

Returns:
  no. bytes in data

Definition at line 319 of file header.c.

References _, EXIT_FAILURE, RPM_I18NSTRING_TYPE, RPM_STRING_ARRAY_TYPE, RPM_STRING_TYPE, and typeSizes.

Referenced by copyData(), grabData(), and regionSwab().

static char* dateFormat | ( | int_32 | type,
|  | hPTR_t | data,
|  | char * | formatPrefix,
|  | int | padding,
|  | int | element
| ) | `[static]`

| Definition at line 3005 of file header.c. References realDateFormat().

static char* dayFormat | ( | int_32 | type,
|  | hPTR_t | data,
|  | char * | formatPrefix,
|  | int | padding,
|  | int | element
| ) | `[static]`

| Definition at line 3014 of file header.c. References realDateFormat().

static char escapedChar | ( | const char | ch | ) | `[static]`

| Definition at line 2003 of file header.c. Referenced by parseFormat().

static indexEntry findEntry | ( | Header | h,
|  | int_32 | tag,
|  | int_32 | type
| ) | `[static]`

Find matching (tag,type) entry in header.

Parameters:

  | h | header
  | tag | entry tag
  | type | entry type

Returns:
  header entry

Definition at line 771 of file header.c.

References headerToken::flags, HEADERFLAG_SORTED, headerSort(), headerToken::index, indexCmp(), headerToken::indexUsed, indexEntry::info, RPM_NULL_TYPE, entryInfo::tag, and entryInfo::type.

Referenced by addMacro(), delMacro(), expandMacro(), headerFindI18NString(), headerGetRawEntry(), htGetEntry(), htHasEntry(), and intGetEntry().

static void findTag | ( | char * | name,
|  | const headerTagTableEntry | tags,
|  | const headerSprintfExtension | extensions,
|  | headerTagTableEntry * | tagMatch,
|  | headerSprintfExtension * | extMatch
| ) | `[static]`

| Definition at line 2058 of file header.c. References alloca(), HEADER_EXT_LAST, HEADER_EXT_MORE, HEADER_EXT_TAG, headerSprintfExtension_s::more, headerTagTableEntry_s::name, headerSprintfExtension_s::name, stpcpy(), headerSprintfExtension_s::type, headerSprintfExtension_s::u, and xstrcasecmp(). Referenced by parseExpression(), and parseFormat().

static char* formatValue | ( | sprintfTag | tag,
|  | Header | h,
|  | const headerSprintfExtension | extensions,
|  | extensionCache | extCache,
|  | int | element
| ) | `[static]`

Definition at line 2515 of file header.c.

References _, _free(), sprintfTag::arrayCount, sprintfTag::ext, sprintfTag::extNum, sprintfTag::format, headerSprintfExtension_s::formatFunction, getExtension(), HEADER_EXT_FORMAT, HEADER_EXT_LAST, HEADER_EXT_MORE, headerFreeData(), headerGetEntry(), headerSprintfExtension_s::more, headerSprintfExtension_s::name, sprintfTag::pad, RPM_BIN_TYPE, RPM_CHAR_TYPE, RPM_INT16_TYPE, RPM_INT32_TYPE, RPM_INT8_TYPE, RPM_STRING_ARRAY_TYPE, RPM_STRING_TYPE, stpcpy(), sprintfTag::tag, headerSprintfExtension_s::type, sprintfTag::type, headerSprintfExtension_s::u, xmalloc(), and xstrdup().

Referenced by singleSprintf().

static extensionCache freeExtensionCache | ( | const headerSprintfExtension | extensions,
|  | extensionCache | cache
| ) | `[static]`

Returns:
  NULL always

Definition at line 2832 of file header.c.

References _free(), extensionCache::data, HEADER_EXT_LAST, HEADER_EXT_MORE, headerSprintfExtension_s::more, headerSprintfExtension_s::type, and headerSprintfExtension_s::u.

static sprintfToken freeFormat | ( | sprintfToken | format,
|  | int | num
| ) | `[static]`

Destroy headerSprintf format array.

Parameters:

  | format | sprintf format array
  | num | number of elements

Returns:
  NULL always

Definition at line 2024 of file header.c.

References _free(), sprintfToken::array, sprintfToken::cond, sprintfToken::elseFormat, sprintfToken::format, sprintfToken::ifFormat, sprintfToken::numElseTokens, sprintfToken::numIfTokens, sprintfToken::numTokens, and sprintfToken::u.

Referenced by parseExpression(), and parseFormat().

static int getExtension | ( | Header | h,
|  | headerTagTagFunction | fn,
|  | hTYP_t | typeptr,
|  | hPTR_t * | data,
|  | hCNT_t | countptr,
|  | extensionCache | ext
| ) | `[static]`

Returns:
  0 on success, 1 on failure

Definition at line 2493 of file header.c.

References extensionCache::avail, extensionCache::count, extensionCache::data, extensionCache::freeit, and extensionCache::type.

Referenced by formatValue(), and singleSprintf().

static void* grabData | ( | int_32 | type,
|  | hPTR_t | p,
|  | int_32 | c,
|  | int * | lengthPtr
| ) | `[static]`

Return (malloc'ed) copy of entry data.

Parameters:

  | type | entry data type
  | p | entry data
  | c | entry item count

Return values:

  | lengthPtr | no. bytes in returned data

Returns:
  (malloc'ed) copy of entry data

Definition at line 1671 of file header.c.

References copyData(), dataLength(), and xmalloc().

static char* headerFindI18NString | ( | Header | h,
|  | indexEntry | entry
| ) | `[static]`

Return i18n string from header that matches locale.

Parameters:

  | h | header
  | entry | i18n string data

Returns:
  matching i18n string (or 1st string if no match)

Definition at line 1445 of file header.c.

References indexEntry::data, findEntry(), getenv(), HEADER_I18NTABLE, headerMatchLocale(), and RPM_STRING_ARRAY_TYPE.

Referenced by intGetEntry().

int headerGetRawEntry | ( | Header | h,
|  | int_32 | tag,
|  | int_32 * | type,
|  | hPTR_t * | p,
|  | int_32 * | c
| ) |

| Definition at line 1606 of file header.c. References copyEntry(), findEntry(), headerIsEntry(), and RPM_NULL_TYPE. Referenced by headerGetLangs().

static int headerMatchLocale | ( | const char * | td,
|  | const char * | l,
|  | const char * | le
| ) | `[static]`

Does locale match entry in header i18n table?

     * The range [l,le) contains the next locale to match:
     *    ll[_CC][.EEEEE][@dddd]
     * where
     *    ll	ISO language code (in lowercase).
     *    CC	(optional) ISO coutnry code (in uppercase).
     *    EEEEE	(optional) encoding (not really standardized).
     *    dddd	(optional) dialect.
     *

Parameters:

  | td | header i18n table data, NUL terminated
  | l | start of locale to match
  | le | end of locale to match

Returns:
  1 on match, 0 on no match

Definition at line 1372 of file header.c.

References alloca().

Referenced by headerFindI18NString().

static char* hexFormat | ( | int_32 | type,
|  | hPTR_t | data,
|  | char * | formatPrefix,
|  | int | padding,
|  | int | element
| ) | `[static]`

| Definition at line 2951 of file header.c. References _, RPM_INT32_TYPE, xmalloc(), and xstrdup().

static int indexCmp | ( | const void * | avp,
|  | const void * | bvp
| ) | `[static]`

| Definition at line 188 of file header.c. References indexEntry::info, and entryInfo::tag. Referenced by findEntry().

static int intGetEntry | ( | Header | h,
|  | int_32 | tag,
|  | hTAG_t | type,
|  | hPTR_t * | p,
|  | hCNT_t | c,
|  | int | minMem
| ) | `[static]`

Retrieve tag data from header.

Parameters:

  | h | header
  | tag | tag to retrieve

Return values:

  | type | address of type (or NULL)
  | p | address of data (or NULL)
  | c | address of count (or NULL)

Parameters:

  | minMem | string pointers reference header memory?

Returns:
  1 on success, 0 on not found

Definition at line 1499 of file header.c.

References copyEntry(), findEntry(), headerFindI18NString(), indexEntry::info, RPM_I18NSTRING_TYPE, RPM_NULL_TYPE, RPM_STRING_TYPE, and entryInfo::type.

static char* octalFormat | ( | int_32 | type,
|  | hPTR_t | data,
|  | char * | formatPrefix,
|  | int | padding,
|  | int | element
| ) | `[static]`

| Definition at line 2930 of file header.c. References _, RPM_INT32_TYPE, xmalloc(), and xstrdup().

static int offsetCmp | ( | const void * | avp,
|  | const void * | bvp
| ) | `[static]`

| Definition at line 212 of file header.c. References indexEntry::data, indexEntry::info, entryInfo::offset, and entryInfo::tag.

static int parseExpression | ( | sprintfToken | token,
|  | char * | str,
|  | const headerTagTableEntry | tags,
|  | const headerSprintfExtension | extensions,
|  | char ** | endPtr,
|  | errmsg_t * | errmsg
| ) | `[static]`

Definition at line 2367 of file header.c.

References _, sprintfToken::cond, sprintfToken::elseFormat, sprintfTag::ext, sprintfTag::extNum, findTag(), freeFormat(), sprintfToken::ifFormat, sprintfToken::numElseTokens, sprintfToken::numIfTokens, parseFormat(), PARSER_IN_EXPR, sprintfTag::tag, sprintfToken::tag, headerSprintfExtension_s::tagFunction, sprintfToken::type, headerSprintfExtension_s::u, sprintfToken::u, headerTagTableEntry_s::val, and xstrdup().

Referenced by parseFormat().

static int parseFormat | ( | char * | str,
|  | const headerTagTableEntry | tags,
|  | const headerSprintfExtension | extensions,
|  | sprintfToken * | formatPtr,
|  | int * | numTokensPtr,
|  | char ** | endPtr,
|  | int | state,
|  | errmsg_t * | errmsg
| ) | `[static]`

Definition at line 2117 of file header.c.

References _, sprintfToken::array, sprintfTag::arrayCount, escapedChar(), sprintfTag::ext, sprintfTag::extNum, findTag(), sprintfToken::format, sprintfTag::format, freeFormat(), sprintfTag::justOne, sprintfToken::len, sprintfToken::numTokens, sprintfTag::pad, parseExpression(), PARSER_IN_ARRAY, PARSER_IN_EXPR, sprintfToken::string, sprintfTag::tag, sprintfToken::tag, headerSprintfExtension_s::tagFunction, sprintfTag::type, sprintfToken::type, headerSprintfExtension_s::u, sprintfToken::u, headerTagTableEntry_s::val, xcalloc(), and xisdigit().

Referenced by parseExpression().

static char* realDateFormat | ( | int_32 | type,
|  | hPTR_t | data,
|  | char * | formatPrefix,
|  | int | padding,
|  | int | element,
|  | const char * | strftimeFormat
| ) | `[static]`

| Definition at line 2972 of file header.c. References _, RPM_INT32_TYPE, xmalloc(), and xstrdup(). Referenced by dateFormat(), and dayFormat().

static char* shescapeFormat | ( | int_32 | type,
|  | hPTR_t | data,
|  | char * | formatPrefix,
|  | int | padding,
|  | int | element
| ) | `[static]`

| Definition at line 3024 of file header.c. References alloca(), RPM_INT32_TYPE, and xmalloc().

static const char* singleSprintf | ( | Header | h,
|  | sprintfToken | token,
|  | const headerSprintfExtension | extensions,
|  | extensionCache | extCache,
|  | int | element
| ) | `[static]`

Definition at line 2691 of file header.c.

References _free(), sprintfToken::array, sprintfTag::arrayCount, sprintfToken::cond, sprintfToken::elseFormat, sprintfTag::ext, sprintfTag::extNum, sprintfToken::format, formatValue(), getExtension(), headerFreeData(), headerGetEntry(), sprintfToken::ifFormat, sprintfTag::justOne, sprintfToken::len, sprintfToken::numElseTokens, sprintfToken::numIfTokens, sprintfToken::numTokens, sprintfToken::string, sprintfTag::tag, sprintfToken::tag, sprintfToken::type, sprintfToken::u, xmalloc(), xrealloc(), and xstrdup().

const char* const tagName | ( | int | tag | ) |

Definition at line 10 of file tagName.c.

Referenced by checkForDuplicates(), checkForRequired(), db1basename(), db3close(), db3open(), dbiCclose(), dbiClose(), dbiCopen(), dbiCount(), dbiDel(), dbiGet(), dbiOpen(), dbiPut(), dbiSearch(), dbiSync(), dbiUpdateIndex(), dbiVerify(), handlePreambleTag(), i18nTag(), printNewSpecfile(), rpmdbAdd(), rpmdbInitIterator(), rpmdbMoveDatabase(), rpmdbRemove(), rpmdbRemoveDatabase(), rpmHeaderGetEntry(), and stashSt().

## Variable Documentation

struct HV_s hdrVec1 `[static]`

| Definition at line 3214 of file header.c.