# lib/rpmfc.c File Reference

`#include "system.h"`
`#include <signal.h>`
`#include <rpmio.h>`
`#include <rpmcb.h>`
`#include <rpmtag.h>`
`#include <rpmbuild.h>`
`#include <argv.h>`
`#include <rpmmg.h>`
`#include <rpmfc.h>`
`#include <rpmns.h>`
`#include <rpmds.h>`
`#include <rpmfi.h>`
`#include "debug.h"`

Include dependency graph for rpmfc.c:

Go to the source code of this file.

## Data Structures

struct | rpmfcApplyTbl_s
struct | DepMsg_s

## Defines

#define | _RPMEVR_INTERNAL
#define | _RPMFC_INTERNAL
#define | _RPMNS_INTERNAL
#define | _RPMDS_INTERNAL
#define | _suffix(_s, _x) (slen >= sizeof(_x) && !strcmp((_s)+slen-(sizeof(_x)-1), (_x)))

## Typedefs

typedef struct rpmfcApplyTbl_s * | rpmfcApplyTbl
typedef struct DepMsg_s * | DepMsg_t

## Functions

static int | rpmfcExpandAppend (ARGV_t *argvp, const ARGV_t av)
static StringBuf | getOutputFrom (const char *dir, ARGV_t argv, const char *writePtr, int writeBytesLeft, int failNonZero)
| Return output from helper script.
int | rpmfcExec (ARGV_t av, StringBuf sb_stdin, StringBuf *sb_stdoutp, int failnonzero)
| Return helper output.
static int | rpmfcSaveArg (ARGV_t *argvp, const char *key)
static char * | rpmfcFileDep (char *buf, int ix, rpmds ds)
static int | rpmfcHelper (rpmfc fc, unsigned char deptype, const char *nsdep)
| Run per-interpreter dependency helper.
int | rpmfcColoring (const char *fmstr)
| Return file color given file(1) string.
void | rpmfcPrint (const char *msg, rpmfc fc, FILE *fp)
| Print results of file classification.
rpmfc | rpmfcFree (rpmfc fc)
| Destroy a file classifier.
rpmfc | rpmfcNew (void)
| Create a file classifier.
static int | rpmfcSCRIPT (rpmfc fc)
| Extract script dependencies.
static int | rpmfcMergePR (void *context, rpmds ds)
| Merge provides/requires dependencies into a rpmfc container.
static int | rpmfcELF (rpmfc fc)
| Extract Elf dependencies.
rpmRC | rpmfcApply (rpmfc fc)
| Build file/package dependency dictionary and mappings.
rpmRC | rpmfcClassify (rpmfc fc, ARGV_t argv, uint16_t *fmode)
| Build file class dictionary and mappings.
static void | printDeps (Header h)
| Print dependencies in a header.
static rpmRC | rpmfcGenerateDependsHelper (const Spec spec, Package pkg, rpmfi fi)
static int | rpmfcGenerateScriptletDeps (const Spec spec, Package pkg)
rpmRC | rpmfcGenerateDepends (void *specp, void *pkgp)
| Generate package dependencies.

## Variables

static struct rpmfcTokens_s | rpmfcTokens []
static struct rpmfcApplyTbl_s | rpmfcApplyTable []
| XXX Having two entries for rpmfcSCRIPT may be unnecessary duplication.
static struct DepMsg_s | depMsgs []
static DepMsg_t | DepMsgs = depMsgs
static struct DepMsg_s | scriptMsgs []
static DepMsg_t | ScriptMsgs = scriptMsgs

## Define Documentation

#define _RPMDS_INTERNAL

Definition at line 19 of file rpmfc.c.

#define _RPMEVR_INTERNAL

Definition at line 8 of file rpmfc.c.

#define _RPMFC_INTERNAL

Definition at line 13 of file rpmfc.c.

#define _RPMNS_INTERNAL

Definition at line 16 of file rpmfc.c.

#define _suffix | ( | _s,
|  | _x |  | ) | (slen >= sizeof(_x) && !strcmp((_s)+slen-(sizeof(_x)-1), (_x)))

Referenced by rpmfcClassify(), and rpmInitMacros().

## Typedef Documentation

typedef struct DepMsg_s* DepMsg_t

Definition at line 1113 of file rpmfc.c.

typedef struct rpmfcApplyTbl_s * rpmfcApplyTbl

## Function Documentation

static void printDeps | ( | Header | h | ) | `[static]`

Print dependencies in a header.

Parameters:

  | h | header

Definition at line 1176 of file rpmfc.c.

References DepMsg_s::ftag, DepMsg_s::mask, DepMsg_s::msg, DepMsg_s::ntag, rpmdsDNEVR(), rpmdsFlags(), rpmdsFree(), rpmdsInit(), rpmdsNew(), rpmdsNext(), rpmlog(), RPMLOG_NOTICE, and DepMsg_s::xor.

Referenced by rpmfcGenerateDepends().

rpmRC rpmfcApply | ( | rpmfc | fc | ) |

Build file/package dependency dictionary and mappings.

Parameters:

  | fc | file classifier

Returns:
  RPMRC_OK on success

Definition at line 863 of file rpmfc.c.

References argiAdd(), argiCount(), argvCount(), rpmfcApplyTbl_s::colormask, rpmfcApplyTbl_s::func, rpmdsFind(), rpmdsFree(), rpmdsSingle(), RPMFC_PYTHON, RPMRC_OK, RPMTAG_PROVIDENAME, and RPMTAG_REQUIRENAME.

Referenced by main(), and rpmfcGenerateDepends().

rpmRC rpmfcClassify | ( | rpmfc | fc,
|  | ARGV_t | argv,
|  | uint16_t * | fmode |
| ) |  |  |

Build file class dictionary and mappings.

Parameters:

  | fc | file classifier
  | argv | files to classify
  | fmode | files mode_t array (or NULL)

Returns:
  RPMRC_OK on success

Definition at line 970 of file rpmfc.c.

References _free(), _suffix, argiAdd(), argvAdd(), argvCount(), argvFree(), argvSearch(), rpmExpand(), RPMFC_INCLUDE, RPMFC_WHITE, rpmfcColoring(), rpmfcSaveArg(), rpmlog(), RPMLOG_DEBUG, rpmmgFile(), rpmmgFree(), rpmmgNew(), RPMRC_OK, S_IFSOCK, and urlPath().

Referenced by main(), and rpmfcGenerateDepends().

int rpmfcColoring | ( | const char * | fmstr | ) |

Return file color given file(1) string.

Parameters:

  | fmstr | file(1) string

Returns:
  file color

Definition at line 531 of file rpmfc.c.

References RPMFC_BLACK, RPMFC_INCLUDE, and rpmfcTokens.

Referenced by rpmfcClassify().

static int rpmfcELF | ( | rpmfc | fc | ) | `[static]`

Extract Elf dependencies.

Parameters:

  | fc | file classifier

Returns:
  0 on success

Definition at line 833 of file rpmfc.c.

References rpmdsELF(), RPMELF_FLAG_SKIPPROVIDES, RPMELF_FLAG_SKIPREQUIRES, and rpmfcMergePR().

int rpmfcExec | ( | ARGV_t | av,
|  | StringBuf | sb_stdin,
|  | StringBuf * | sb_stdoutp,
|  | int | failnonzero |
| ) |  |  |

Return helper output.

Parameters:

  | av | helper argv (with possible macros)
  | sb_stdin | helper input

Return values:

  | *sb_stdoutp | helper output

Parameters:

  | failnonzero | Is non-zero helper exit status a failure?

Definition at line 207 of file rpmfc.c.

References _free(), argvAppend(), argvFree(), freeStringBuf(), getOutputFrom(), getStringBuf(), rpmExpand(), and rpmfcExpandAppend().

Referenced by checkFiles(), rpmfcGenerateDependsHelper(), rpmfcGenerateScriptletDeps(), and rpmfcHelper().

static int rpmfcExpandAppend | ( | ARGV_t * | argvp,
|  | const ARGV_t | av |
| ) |  |  | `[static]`

Definition at line 29 of file rpmfc.c.

References argvCount(), rpmExpand(), and xrealloc().

Referenced by rpmfcExec().

static char* rpmfcFileDep | ( | char * | buf,
|  | int | ix,
|  | rpmds | ds |
| ) |  |  | `[static]`

Definition at line 282 of file rpmfc.c.

References rpmdsEVR(), rpmdsFlags(), rpmdsN(), rpmdsTagN(), RPMTAG_PROVIDENAME, and RPMTAG_REQUIRENAME.

Referenced by rpmfcHelper(), rpmfcMergePR(), and rpmfcSCRIPT().

rpmfc rpmfcFree | ( | rpmfc | fc | ) |

Destroy a file classifier.

Parameters:

  | fc | file classifier

Returns:
  NULL always

Definition at line 623 of file rpmfc.c.

References _free(), argiFree(), argvFree(), freeStringBuf(), and rpmdsFree().

Referenced by main(), and rpmfcGenerateDepends().

rpmRC rpmfcGenerateDepends | ( | void * | specp,
|  | void * | pkgp |
| ) |  |  |

Generate package dependencies.

Parameters:

  | specp | spec file control
  | pkgp | package control

Returns:
  RPMRC_OK on success

Definition at line 1394 of file rpmfc.c.

References _free(), _rpmfc_debug, alloca(), argiCount(), argiData(), rpmDataType_u::argv, argvCount(), argvData(), argvFree(), Package_s::autoProv, Package_s::autoReq, _HE_s::c, Package_s::cpioList, Package_s::ds, Package_s::header, headerDel(), headerPut(), DepMsg_s::msg, _HE_s::p, printDeps(), rpmDataType_u::ptr, Spec_s::rootURL, RPM_STRING_ARRAY_TYPE, RPM_UINT32_TYPE, rpmdsCount(), rpmdsEVR(), rpmdsFree(), rpmdsMerge(), rpmdsN(), rpmdsNew(), rpmdsSingle(), rpmExpandNumeric(), rpmfcApply(), rpmfcClassify(), rpmfcFree(), rpmfcGenerateDependsHelper(), rpmfcGenerateScriptletDeps(), rpmfcNew(), rpmfcPrint(), rpmfiFC(), rpmfiFFlags(), rpmfiFMode(), rpmfiFN(), rpmfiInit(), RPMFILE_CONFIG, rpmfiNext(), rpmGenPath(), RPMRC_OK, RPMSENSE_EQUAL, RPMTAG_CLASSDICT, RPMTAG_DEPENDSDICT, RPMTAG_FILECLASS, RPMTAG_FILECOLORS, RPMTAG_FILEDEPENDSN, RPMTAG_FILEDEPENDSX, RPMTAG_PROVIDEFLAGS, RPMTAG_PROVIDENAME, RPMTAG_PROVIDEVERSION, RPMTAG_REQUIREFLAGS, RPMTAG_REQUIRENAME, RPMTAG_REQUIREVERSION, _HE_s::t, _HE_s::tag, rpmDataType_u::ui32p, urlPath(), xcalloc(), and xstrdup().

Referenced by processBinaryFiles().

static rpmRC rpmfcGenerateDependsHelper | ( | const Spec | spec,
|  | Package | pkg,
|  | rpmfi | fi |
| ) |  |  | `[static]`

Definition at line 1222 of file rpmfc.c.

References _, _free(), Spec_s::_parseRCPOT, appendLineStringBuf, DepMsg_s::argv, Package_s::autoProv, Package_s::autoReq, freeStringBuf(), DepMsg_s::ftag, getStringBuf(), DepMsg_s::msg, newStringBuf(), DepMsg_s::ntag, rpmExpand(), rpmfcExec(), rpmfiFN(), rpmfiInit(), rpmfiNext(), rpmlog(), RPMLOG_ERR, RPMLOG_NOTICE, RPMRC_FAIL, RPMRC_OK, RPMTAG_PROVIDEFLAGS, and RPMTAG_REQUIREFLAGS.

Referenced by rpmfcGenerateDepends().

static int rpmfcGenerateScriptletDeps | ( | const Spec | spec,
|  | Package | pkg |
| ) |  |  | `[static]`

Definition at line 1324 of file rpmfc.c.

References _free(), Spec_s::_parseRCPOT, alloca(), appendLineStringBuf, DepMsg_s::argv, freeStringBuf(), DepMsg_s::ftag, getStringBuf(), Package_s::header, headerGet(), DepMsg_s::mask, DepMsg_s::msg, newStringBuf(), DepMsg_s::ntag, _HE_s::p, rpmDataType_u::ptr, rpmfcExec(), stpcpy(), rpmDataType_u::str, stripTrailingBlanksStringBuf(), _HE_s::tag, truncStringBuf(), and DepMsg_s::vtag.

Referenced by rpmfcGenerateDepends().

static int rpmfcHelper | ( | rpmfc | fc,
|  | unsigned char | deptype,
|  | const char * | nsdep |
| ) |  |  | `[static]`

Run per-interpreter dependency helper.

Parameters:

  | fc | file classifier
  | deptype | 'P' == Provides:, 'R' == Requires:, helper
  | nsdep | class name for interpreter (e.g. "perl")

Returns:
  0 on success

Definition at line 316 of file rpmfc.c.

References appendLineStringBuf, argvCount(), argvFree(), argvSplit(), freeStringBuf(), getStringBuf(), newStringBuf(), rpmdsFree(), rpmdsMerge(), rpmdsSingle(), rpmfcExec(), rpmfcFileDep(), rpmfcSaveArg(), RPMSENSE_EQUAL, RPMSENSE_GREATER, RPMSENSE_LESS, RPMTAG_PROVIDENAME, RPMTAG_REQUIRENAME, and snprintf().

Referenced by rpmfcSCRIPT().

static int rpmfcMergePR | ( | void * | context,
|  | rpmds | ds |
| ) |  |  | `[static]`

Merge provides/requires dependencies into a rpmfc container.

Parameters:

  | context | merge dependency set(s) container
  | ds | dependency set to merge

Returns:
  0 on success

Definition at line 795 of file rpmfc.c.

References _rpmfc_debug, rpmdsMerge(), rpmdsTagN(), rpmfcFileDep(), rpmfcSaveArg(), RPMTAG_PROVIDENAME, RPMTAG_REQUIRENAME, and tagName().

Referenced by rpmfcELF().

rpmfc rpmfcNew | ( | void |  | ) |

Create a file classifier.

Returns:
  new file classifier

Definition at line 648 of file rpmfc.c.

References xcalloc().

Referenced by main(), and rpmfcGenerateDepends().

void rpmfcPrint | ( | const char * | msg,
|  | rpmfc | fc,
|  | FILE * | fp |
| ) |  |  |

Print results of file classification.

Todo:
  Remove debugging routine.

Parameters:

  | msg | message prefix (NULL for none)
  | fc | file classifier
  | fp | output file handle (NULL for stderr)

Definition at line 546 of file rpmfc.c.

References rpmdsCount(), rpmdsDNEVR(), rpmdsNext(), rpmdsSetIx(), and RPMFC_BLACK.

Referenced by main(), and rpmfcGenerateDepends().

static int rpmfcSaveArg | ( | ARGV_t * | argvp,
|  | const char * | key |
| ) |  |  | `[static]`

Definition at line 267 of file rpmfc.c.

References argvAdd(), argvSearch(), and argvSort().

Referenced by rpmfcClassify(), rpmfcHelper(), rpmfcMergePR(), and rpmfcSCRIPT().

static int rpmfcSCRIPT | ( | rpmfc | fc | ) | `[static]`

Extract script dependencies.

Parameters:

  | fc | file classifier

Returns:
  0 on success

Definition at line 659 of file rpmfc.c.

References rpmdsFree(), rpmdsMerge(), rpmdsSingle(), RPMFC_BOURNE, RPMFC_LIBTOOL, RPMFC_MODULE, RPMFC_MONO, RPMFC_PERL, RPMFC_PHP, RPMFC_PKGCONFIG, RPMFC_PYTHON, rpmfcFileDep(), rpmfcHelper(), rpmfcSaveArg(), and RPMTAG_REQUIRENAME.

## Variable Documentation

DepMsg_t DepMsgs = depMsgs `[static]`

Definition at line 1170 of file rpmfc.c.

struct DepMsg_s depMsgs[]`[static]`

Definition at line 1132 of file rpmfc.c.

struct rpmfcApplyTbl_s rpmfcApplyTable[]`[static]`

Initial value:

     {
        { rpmfcELF,         RPMFC_ELF },
        { rpmfcSCRIPT,      (RPMFC_SCRIPT|RPMFC_PERL|RPMFC_PYTHON|RPMFC_LIBTOOL|RPMFC_PKGCONFIG|RPMFC_BOURNE|RPMFC_JAVA|RPMFC_PHP|RPMFC_MONO) },
        { NULL, 0 }
    }

XXX Having two entries for rpmfcSCRIPT may be unnecessary duplication.

Definition at line 857 of file rpmfc.c.

struct rpmfcTokens_s rpmfcTokens[]`[static]`

Definition at line 432 of file rpmfc.c.

Referenced by rpmfcColoring().

DepMsg_t ScriptMsgs = scriptMsgs `[static]`

Definition at line 1320 of file rpmfc.c.

struct DepMsg_s scriptMsgs[]`[static]`

Initial value:

     {
      { "Requires(pre)",    { "%{?__scriptlet_requires}", NULL, NULL, NULL },
            RPMTAG_PREINPROG, RPMTAG_PREIN, RPMTAG_REQUIREFLAGS,
            RPMSENSE_SCRIPT_PRE, 0 },
      { "Requires(post)",   { "%{?__scriptlet_requires}", NULL, NULL, NULL },
            RPMTAG_POSTINPROG, RPMTAG_POSTIN, RPMTAG_REQUIREFLAGS,
            RPMSENSE_SCRIPT_POST, 0 },
      { "Requires(preun)",  { "%{?__scriptlet_requires}", NULL, NULL, NULL },
            RPMTAG_PREUNPROG, RPMTAG_PREUN, RPMTAG_REQUIREFLAGS,
            RPMSENSE_SCRIPT_PREUN, 0 },
      { "Requires(postun)", { "%{?__scriptlet_requires}", NULL, NULL, NULL },
            RPMTAG_POSTUNPROG, RPMTAG_POSTUN, RPMTAG_REQUIREFLAGS,
            RPMSENSE_SCRIPT_POSTUN, 0 },
      { NULL,               { NULL, NULL, NULL, NULL },     0, 0, 0, 0, 0 }
    }

Definition at line 1303 of file rpmfc.c.