rpm 5.3.7
Data Structures | Defines | Typedefs | Functions | Variables

lib/rpmfc.c File Reference

#include "system.h"
#include <signal.h>
#include <rpmio.h>
#include <rpmiotypes.h>
#include <rpmlog.h>
#include <rpmurl.h>
#include <rpmmg.h>
#include <argv.h>
#include <mire.h>
#include <rpmtag.h>
#include <rpmbuild.h>
#include <rpmns.h>
#include <rpmfc.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 _MIRE_INTERNAL
#define _RPMEVR_INTERNAL
#define _RPMNS_INTERNAL
#define _RPMFC_INTERNAL
#define _RPMDS_INTERNAL
#define _suffix(_s, _x)   (slen >= sizeof(_x) && !strcmp((_s)+slen-(sizeof(_x)-1), (_x)))

Typedefs

typedef struct rpmfcApplyTbl_srpmfcApplyTbl
typedef struct DepMsg_sDepMsg_t

Functions

static int rpmfcExpandAppend (ARGV_t *argvp, const ARGV_t av)
static rpmiob getOutputFrom (const char *dir, ARGV_t argv, const char *writePtr, size_t writeBytesLeft, int failNonZero)
 Return output from helper script.
int rpmfcExec (ARGV_t av, rpmiob iob_stdin, rpmiob *iob_stdoutp, int failnonzero)
static int rpmfcSaveArg (ARGV_t *argvp, const char *key)
static char * rpmfcFileDep (char *buf, size_t ix, rpmds ds)
static void * rpmfcExpandRegexps (const char *str, int *nmirep)
static int rpmfcMatchRegexps (void *mires, int nmire, const char *str, char deptype)
static void * rpmfcFreeRegexps (void *mires, int nmire)
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.
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, rpmuint16_t *fmode)
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.
static void rpmfcFini (void *_fc)
static rpmfc rpmfcGetPool (rpmioPool pool)
rpmfc rpmfcNew (void)
 Create a file classifier.

Variables

static int _filter_values = 1
static int _filter_execs = 1
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
rpmioPool _rpmfcPool = NULL

Define Documentation

#define _MIRE_INTERNAL

Definition at line 11 of file rpmfc.c.

#define _RPMDS_INTERNAL

Definition at line 24 of file rpmfc.c.

#define _RPMEVR_INTERNAL

Definition at line 15 of file rpmfc.c.

#define _RPMFC_INTERNAL

Definition at line 21 of file rpmfc.c.

#define _RPMNS_INTERNAL

Definition at line 18 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 1284 of file rpmfc.c.

typedef struct rpmfcApplyTbl_s * rpmfcApplyTbl

Function Documentation

static rpmiob getOutputFrom ( const char *  dir,
ARGV_t  argv,
const char *  writePtr,
size_t  writeBytesLeft,
int  failNonZero 
) [static]

Return output from helper script.

Todo:
Use poll(2) rather than select(2), if available.
Parameters:
dirdirectory to run in (or NULL)
argvprogram and arguments to run
writePtrbytes to feed to script on stdin (or NULL)
writeBytesLeftno. of bytes to feed to script on stdin
failNonZerois script failure an error?
Returns:
buffered stdout from script, NULL on error

Definition at line 69 of file rpmfc.c.

References _, _free(), argvJoin(), Chdir(), D_, errno, EXIT_FAILURE, rpmiobAppend(), rpmiobFree(), rpmiobNew(), rpmlog(), RPMLOG_DEBUG, RPMLOG_ERR, and unsetenv().

Referenced by rpmfcExec().

static void printDeps ( Header  h) [static]

Print dependencies in a header.

Parameters:
hheader

Definition at line 1349 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:
fcfile classifier
Returns:
RPMRC_OK on success

Definition at line 962 of file rpmfc.c.

References _, _filter_execs, argiAdd(), argiCount(), argvCount(), rpmfcApplyTbl_s::colormask, D_, rpmfcApplyTbl_s::func, mireRegexec(), rpmdsFind(), rpmdsFree(), rpmdsSingle(), rpmfcExpandRegexps(), rpmfcFreeRegexps(), rpmlog(), RPMLOG_DEBUG, RPMLOG_NOTICE, and RPMRC_OK.

Referenced by main(), and rpmfcGenerateDepends().

rpmRC rpmfcClassify ( rpmfc  fc,
ARGV_t  argv,
rpmuint16_t fmode 
)
int rpmfcColoring ( const char *  fmstr)

Return file color given file(1) string.

Parameters:
fmstrfile(1) string
Returns:
file color

Definition at line 637 of file rpmfc.c.

References RPMFC_BLACK, and rpmfcTokens.

Referenced by rpmfcClassify().

static int rpmfcELF ( rpmfc  fc) [static]

Extract Elf dependencies.

Parameters:
fcfile classifier
Returns:
0 on success

Definition at line 930 of file rpmfc.c.

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

int rpmfcExec ( ARGV_t  av,
rpmiob  iob_stdin,
rpmiob iob_stdoutp,
int  failnonzero 
)
static int rpmfcExpandAppend ( ARGV_t argvp,
const ARGV_t  av 
) [static]

Definition at line 40 of file rpmfc.c.

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

Referenced by rpmfcExec().

static void* rpmfcExpandRegexps ( const char *  str,
int *  nmirep 
) [static]

Definition at line 330 of file rpmfc.c.

References _, _free(), mireAppend(), mireFree(), rpmExpand(), rpmlog(), RPMLOG_NOTICE, and RPMMIRE_REGEX.

Referenced by rpmfcApply().

static char* rpmfcFileDep ( char *  buf,
size_t  ix,
rpmds  ds 
) [static]

Definition at line 300 of file rpmfc.c.

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

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

static void rpmfcFini ( void *  _fc) [static]

Definition at line 1839 of file rpmfc.c.

References argiFree(), argvFree(), rpmdsFree(), and rpmiobFree().

Referenced by rpmfcGetPool().

static void* rpmfcFreeRegexps ( void *  mires,
int  nmire 
) [static]

Definition at line 394 of file rpmfc.c.

References mireFreeAll().

Referenced by rpmfcApply().

rpmRC rpmfcGenerateDepends ( void *  specp,
void *  pkgp 
)
static rpmRC rpmfcGenerateDependsHelper ( const Spec  spec,
Package  pkg,
rpmfi  fi 
) [static]
static int rpmfcGenerateScriptletDeps ( const Spec  spec,
Package  pkg 
) [static]
static rpmfc rpmfcGetPool ( rpmioPool  pool) [static]

Definition at line 1868 of file rpmfc.c.

References _rpmfc_debug, _rpmfcPool, rpmfcFini(), rpmioGetPool(), and rpmioNewPool().

Referenced by rpmfcNew().

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

Run per-interpreter dependency helper.

Parameters:
fcfile classifier
deptype'P' == Provides:, 'R' == Requires:, helper
nsdepclass name for interpreter (e.g. "perl")
Returns:
0 on success

Definition at line 410 of file rpmfc.c.

References _filter_values, argvCount(), argvFree(), argvSplit(), rpmdsFree(), rpmdsMerge(), rpmdsSingle(), rpmfcExec(), rpmfcFileDep(), rpmfcMatchRegexps(), rpmfcSaveArg(), rpmiobAppend(), rpmiobFree(), rpmiobNew(), rpmiobStr(), RPMSENSE_EQUAL, RPMSENSE_GREATER, RPMSENSE_LESS, and snprintf().

Referenced by rpmfcSCRIPT().

static int rpmfcMatchRegexps ( void *  mires,
int  nmire,
const char *  str,
char  deptype 
) [static]

Definition at line 373 of file rpmfc.c.

References _, D_, mireRegexec(), rpmlog(), RPMLOG_DEBUG, and RPMLOG_NOTICE.

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

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

Merge provides/requires dependencies into a rpmfc container.

Parameters:
contextmerge dependency set(s) container
dsdependency set to merge
Returns:
0 on success

Definition at line 881 of file rpmfc.c.

References _filter_values, _rpmfc_debug, rpmdsMerge(), rpmdsTagN(), rpmfcFileDep(), rpmfcMatchRegexps(), rpmfcSaveArg(), and tagName().

Referenced by rpmfcELF().

rpmfc rpmfcNew ( void  )

Create a file classifier.

Returns:
new file classifier

Definition at line 1884 of file rpmfc.c.

References rpmfcGetPool(), rpmfcLink(), and 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:
msgmessage prefix (NULL for none)
fcfile classifier
fpoutput file handle (NULL for stderr)

Definition at line 652 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 285 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:
fcfile classifier
Returns:
0 on success

Definition at line 734 of file rpmfc.c.

References _filter_values, _free(), rpmdsFree(), rpmdsMerge(), rpmdsSingle(), rpmExpand(), rpmfcFileDep(), rpmfcHelper(), rpmfcMatchRegexps(), and rpmfcSaveArg().


Variable Documentation

int _filter_execs = 1 [static]

Definition at line 36 of file rpmfc.c.

Referenced by rpmfcApply().

int _filter_values = 1 [static]

Definition at line 34 of file rpmfc.c.

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

Definition at line 1866 of file rpmfc.c.

Referenced by rpmfcGetPool().

struct DepMsg_s depMsgs[] [static]

Definition at line 1304 of file rpmfc.c.

DepMsg_t DepMsgs = depMsgs [static]

Definition at line 1343 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 955 of file rpmfc.c.

struct rpmfcTokens_s rpmfcTokens[] [static]

Definition at line 537 of file rpmfc.c.

Referenced by rpmfcColoring().

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 1480 of file rpmfc.c.

Definition at line 1498 of file rpmfc.c.