Sync with rpm-4_0 branch.
CVS patchset: 4876 CVS date: 2001/06/17 22:18:03
This commit is contained in:
parent
c32276cdf5
commit
29ea1567e7
1
CHANGES
1
CHANGES
|
@ -117,6 +117,7 @@
|
|||
- popt: add POPT_CONTEXT_ARG_OPTS for all opts to return 1 (#30912).
|
||||
- fix: fsm reads/writes now return error on partial I/O.
|
||||
- fix: Ferror returned spurious error for gzdio/bzdio.
|
||||
- check for API/ABI creep, diddle up some compatibility.
|
||||
|
||||
4.0 -> 4.0.[12]
|
||||
- add doxygen and lclint annotations most everywhere.
|
||||
|
|
293
Doxyfile.in
293
Doxyfile.in
|
@ -104,7 +104,7 @@ FULL_PATH_NAMES = YES
|
|||
# only done if one of the specified strings matches the left-hand part of
|
||||
# the path. It is allowed to use relative paths in the argument list.
|
||||
|
||||
STRIP_FROM_PATH = @top_sourcedir@/
|
||||
STRIP_FROM_PATH = @top_srcdir@/
|
||||
|
||||
# The INTERNAL_DOCS tag determines if documentation
|
||||
# that is typed after a \internal command is included. If the tag is set
|
||||
|
@ -304,149 +304,152 @@ WARN_LOGFILE =
|
|||
# with spaces.
|
||||
|
||||
INPUT = \
|
||||
./Doxyheader \
|
||||
./build.c \
|
||||
./build.h \
|
||||
./config.h \
|
||||
./debug.h \
|
||||
./macros \
|
||||
./rpmqv.c \
|
||||
./rpmpopt-@VERSION@ \
|
||||
./rpmrc \
|
||||
./rpm2cpio.c \
|
||||
./system.h \
|
||||
./build/build.c \
|
||||
./build/buildio.h \
|
||||
./build/expression.c \
|
||||
./build/files.c \
|
||||
./build/misc.c \
|
||||
./build/myftw.c \
|
||||
./build/myftw.h \
|
||||
./build/names.c \
|
||||
./build/pack.c \
|
||||
./build/parseBuildInstallClean.c \
|
||||
./build/parseChangelog.c \
|
||||
./build/parseDescription.c \
|
||||
./build/parseFiles.c \
|
||||
./build/parsePreamble.c \
|
||||
./build/parsePrep.c \
|
||||
./build/parseReqs.c \
|
||||
./build/parseScript.c \
|
||||
./build/parseSpec.c \
|
||||
./build/reqprov.c \
|
||||
./build/rpmbuild.h \
|
||||
./build/rpmspec.h \
|
||||
./build/spec.c \
|
||||
./doc/manual/builddependencies \
|
||||
./doc/manual/buildroot \
|
||||
./doc/manual/conditionalbuilds \
|
||||
./doc/manual/dependencies \
|
||||
./doc/manual/format \
|
||||
./doc/manual/hregions \
|
||||
./doc/manual/macros \
|
||||
./doc/manual/multiplebuilds \
|
||||
./doc/manual/queryformat \
|
||||
./doc/manual/signatures \
|
||||
./doc/manual/relocatable \
|
||||
./doc/manual/spec \
|
||||
./doc/manual/triggers \
|
||||
./doc/manual/tsort \
|
||||
./lib/cpio.c \
|
||||
./lib/cpio.h \
|
||||
./lib/depends.c \
|
||||
./lib/depends.h \
|
||||
./lib/formats.c \
|
||||
./lib/fs.c \
|
||||
./lib/fsm.c \
|
||||
./lib/fsm.h \
|
||||
./lib/header.c \
|
||||
./lib/header.h \
|
||||
./lib/manifest.c \
|
||||
./lib/manifest.h \
|
||||
./lib/md5.c \
|
||||
./lib/md5.h \
|
||||
./lib/md5sum.c \
|
||||
./lib/misc.c \
|
||||
./lib/misc.h \
|
||||
./lib/package.c \
|
||||
./lib/poptBT.c \
|
||||
./lib/poptI.c \
|
||||
./lib/poptK.c \
|
||||
./lib/poptQV.c \
|
||||
./lib/problems.c \
|
||||
./lib/psm.c \
|
||||
./lib/psm.h \
|
||||
./lib/query.c \
|
||||
./lib/rpmchecksig.c \
|
||||
./lib/rpmcli.h \
|
||||
./lib/rpminstall.c \
|
||||
./lib/rpmlead.c \
|
||||
./lib/rpmlead.h \
|
||||
./lib/rpmlib.h \
|
||||
./lib/rpmlibprov.c \
|
||||
./lib/rpmrc.c \
|
||||
./lib/signature.c \
|
||||
./lib/signature.h \
|
||||
./lib/stringbuf.c \
|
||||
./lib/stringbuf.h \
|
||||
./lib/tagName.c \
|
||||
./lib/tagtable.c \
|
||||
./lib/transaction.c \
|
||||
./lib/verify.c \
|
||||
./rpmdb/db1.c \
|
||||
./rpmdb/db3.c \
|
||||
./rpmdb/dbconfig.c \
|
||||
./rpmdb/falloc.c \
|
||||
./rpmdb/falloc.h \
|
||||
./rpmdb/fprint.c \
|
||||
./rpmdb/fprint.h \
|
||||
./rpmdb/poptDB.c \
|
||||
./rpmdb/rpmhash.c \
|
||||
./rpmdb/rpmhash.h \
|
||||
./rpmdb/rpmdb.c \
|
||||
./rpmdb/rpmdb.h \
|
||||
./rpmio/base64.c \
|
||||
./rpmio/base64.h \
|
||||
./rpmio/digest.c \
|
||||
./rpmio/macro.c \
|
||||
./rpmio/rpmlog.c \
|
||||
./rpmio/rpmerr.h \
|
||||
./rpmio/rpmio.c \
|
||||
./rpmio/rpmio.h \
|
||||
./rpmio/rpmio_internal.h \
|
||||
./rpmio/rpmio_api.c \
|
||||
./rpmio/rpmmacro.h \
|
||||
./rpmio/rpmmalloc.c \
|
||||
./rpmio/rpmmessages.h \
|
||||
./rpmio/rpmrpc.c \
|
||||
./rpmio/rpmurl.h \
|
||||
./rpmio/strcasecmp.c \
|
||||
./rpmio/stubs.c \
|
||||
./rpmio/ugid.c \
|
||||
./rpmio/ugid.h \
|
||||
./rpmio/url.c \
|
||||
./popt/findme.c \
|
||||
./popt/findme.h \
|
||||
./popt/popt.c \
|
||||
./popt/popt.h \
|
||||
./popt/poptconfig.c \
|
||||
./popt/popthelp.c \
|
||||
./popt/poptint.h \
|
||||
./popt/poptparse.c \
|
||||
./python/hash.c \
|
||||
./python/hash.h \
|
||||
./python/rpmmodule.c \
|
||||
./python/upgrade.c \
|
||||
./python/upgrade.h \
|
||||
./tools/dump.c \
|
||||
./tools/dumpdb.c \
|
||||
./tools/javadeps.c \
|
||||
./tools/rpmarchive.c \
|
||||
./tools/rpmchecksig.c \
|
||||
./tools/rpmheader.c \
|
||||
./tools/rpminject.c \
|
||||
./tools/rpmlead.c \
|
||||
./tools/rpmsignature.c
|
||||
@top_srcdir@/Doxyheader \
|
||||
@top_srcdir@/build.c \
|
||||
@top_srcdir@/build.h \
|
||||
@top_srcdir@/config.h \
|
||||
@top_srcdir@/debug.h \
|
||||
@top_srcdir@/macros \
|
||||
@top_srcdir@/rpmqv.c \
|
||||
@top_srcdir@/rpmpopt-@VERSION@ \
|
||||
@top_srcdir@/rpmrc \
|
||||
@top_srcdir@/rpm2cpio.c \
|
||||
@top_srcdir@/system.h \
|
||||
@top_srcdir@/build/build.c \
|
||||
@top_srcdir@/build/buildio.h \
|
||||
@top_srcdir@/build/expression.c \
|
||||
@top_srcdir@/build/files.c \
|
||||
@top_srcdir@/build/misc.c \
|
||||
@top_srcdir@/build/myftw.c \
|
||||
@top_srcdir@/build/myftw.h \
|
||||
@top_srcdir@/build/names.c \
|
||||
@top_srcdir@/build/pack.c \
|
||||
@top_srcdir@/build/parseBuildInstallClean.c \
|
||||
@top_srcdir@/build/parseChangelog.c \
|
||||
@top_srcdir@/build/parseDescription.c \
|
||||
@top_srcdir@/build/parseFiles.c \
|
||||
@top_srcdir@/build/parsePreamble.c \
|
||||
@top_srcdir@/build/parsePrep.c \
|
||||
@top_srcdir@/build/parseReqs.c \
|
||||
@top_srcdir@/build/parseScript.c \
|
||||
@top_srcdir@/build/parseSpec.c \
|
||||
@top_srcdir@/build/reqprov.c \
|
||||
@top_srcdir@/build/rpmbuild.h \
|
||||
@top_srcdir@/build/rpmspec.h \
|
||||
@top_srcdir@/build/spec.c \
|
||||
@top_srcdir@/doc/manual/builddependencies \
|
||||
@top_srcdir@/doc/manual/buildroot \
|
||||
@top_srcdir@/doc/manual/conditionalbuilds \
|
||||
@top_srcdir@/doc/manual/dependencies \
|
||||
@top_srcdir@/doc/manual/format \
|
||||
@top_srcdir@/doc/manual/hregions \
|
||||
@top_srcdir@/doc/manual/macros \
|
||||
@top_srcdir@/doc/manual/multiplebuilds \
|
||||
@top_srcdir@/doc/manual/queryformat \
|
||||
@top_srcdir@/doc/manual/signatures \
|
||||
@top_srcdir@/doc/manual/relocatable \
|
||||
@top_srcdir@/doc/manual/spec \
|
||||
@top_srcdir@/doc/manual/triggers \
|
||||
@top_srcdir@/doc/manual/tsort \
|
||||
@top_srcdir@/lib/cpio.c \
|
||||
@top_srcdir@/lib/cpio.h \
|
||||
@top_srcdir@/lib/depends.c \
|
||||
@top_srcdir@/lib/depends.h \
|
||||
@top_srcdir@/lib/formats.c \
|
||||
@top_srcdir@/lib/fs.c \
|
||||
@top_srcdir@/lib/fsm.c \
|
||||
@top_srcdir@/lib/fsm.h \
|
||||
@top_srcdir@/lib/header.c \
|
||||
@top_srcdir@/lib/header.h \
|
||||
@top_srcdir@/lib/header_internal.c \
|
||||
@top_srcdir@/lib/header_internal.h \
|
||||
@top_srcdir@/lib/manifest.c \
|
||||
@top_srcdir@/lib/manifest.h \
|
||||
@top_srcdir@/lib/md5.c \
|
||||
@top_srcdir@/lib/md5.h \
|
||||
@top_srcdir@/lib/md5sum.c \
|
||||
@top_srcdir@/lib/misc.c \
|
||||
@top_srcdir@/lib/misc.h \
|
||||
@top_srcdir@/lib/package.c \
|
||||
@top_srcdir@/lib/poptBT.c \
|
||||
@top_srcdir@/lib/poptI.c \
|
||||
@top_srcdir@/lib/poptK.c \
|
||||
@top_srcdir@/lib/poptQV.c \
|
||||
@top_srcdir@/lib/problems.c \
|
||||
@top_srcdir@/lib/psm.c \
|
||||
@top_srcdir@/lib/psm.h \
|
||||
@top_srcdir@/lib/query.c \
|
||||
@top_srcdir@/lib/rpmchecksig.c \
|
||||
@top_srcdir@/lib/rpmcli.h \
|
||||
@top_srcdir@/lib/rpminstall.c \
|
||||
@top_srcdir@/lib/rpmlead.c \
|
||||
@top_srcdir@/lib/rpmlead.h \
|
||||
@top_srcdir@/lib/rpmlib.h \
|
||||
@top_srcdir@/lib/rpmlibprov.c \
|
||||
@top_srcdir@/lib/rpmrc.c \
|
||||
@top_srcdir@/lib/rpmvercmp.c \
|
||||
@top_srcdir@/lib/signature.c \
|
||||
@top_srcdir@/lib/signature.h \
|
||||
@top_srcdir@/lib/stringbuf.c \
|
||||
@top_srcdir@/lib/stringbuf.h \
|
||||
@top_srcdir@/lib/tagName.c \
|
||||
@top_srcdir@/lib/tagtable.c \
|
||||
@top_srcdir@/lib/transaction.c \
|
||||
@top_srcdir@/lib/verify.c \
|
||||
@top_srcdir@/rpmdb/db1.c \
|
||||
@top_srcdir@/rpmdb/db3.c \
|
||||
@top_srcdir@/rpmdb/dbconfig.c \
|
||||
@top_srcdir@/rpmdb/falloc.c \
|
||||
@top_srcdir@/rpmdb/falloc.h \
|
||||
@top_srcdir@/rpmdb/fprint.c \
|
||||
@top_srcdir@/rpmdb/fprint.h \
|
||||
@top_srcdir@/rpmdb/poptDB.c \
|
||||
@top_srcdir@/rpmdb/rpmhash.c \
|
||||
@top_srcdir@/rpmdb/rpmhash.h \
|
||||
@top_srcdir@/rpmdb/rpmdb.c \
|
||||
@top_srcdir@/rpmdb/rpmdb.h \
|
||||
@top_srcdir@/rpmio/base64.c \
|
||||
@top_srcdir@/rpmio/base64.h \
|
||||
@top_srcdir@/rpmio/digest.c \
|
||||
@top_srcdir@/rpmio/macro.c \
|
||||
@top_srcdir@/rpmio/rpmlog.c \
|
||||
@top_srcdir@/rpmio/rpmerr.h \
|
||||
@top_srcdir@/rpmio/rpmio.c \
|
||||
@top_srcdir@/rpmio/rpmio.h \
|
||||
@top_srcdir@/rpmio/rpmio_internal.h \
|
||||
@top_srcdir@/rpmio/rpmio_api.c \
|
||||
@top_srcdir@/rpmio/rpmmacro.h \
|
||||
@top_srcdir@/rpmio/rpmmalloc.c \
|
||||
@top_srcdir@/rpmio/rpmmessages.h \
|
||||
@top_srcdir@/rpmio/rpmrpc.c \
|
||||
@top_srcdir@/rpmio/rpmurl.h \
|
||||
@top_srcdir@/rpmio/strcasecmp.c \
|
||||
@top_srcdir@/rpmio/stubs.c \
|
||||
@top_srcdir@/rpmio/ugid.c \
|
||||
@top_srcdir@/rpmio/ugid.h \
|
||||
@top_srcdir@/rpmio/url.c \
|
||||
@top_srcdir@/popt/findme.c \
|
||||
@top_srcdir@/popt/findme.h \
|
||||
@top_srcdir@/popt/popt.c \
|
||||
@top_srcdir@/popt/popt.h \
|
||||
@top_srcdir@/popt/poptconfig.c \
|
||||
@top_srcdir@/popt/popthelp.c \
|
||||
@top_srcdir@/popt/poptint.h \
|
||||
@top_srcdir@/popt/poptparse.c \
|
||||
@top_srcdir@/python/hash.c \
|
||||
@top_srcdir@/python/hash.h \
|
||||
@top_srcdir@/python/rpmmodule.c \
|
||||
@top_srcdir@/python/upgrade.c \
|
||||
@top_srcdir@/python/upgrade.h \
|
||||
@top_srcdir@/tools/dump.c \
|
||||
@top_srcdir@/tools/dumpdb.c \
|
||||
@top_srcdir@/tools/javadeps.c \
|
||||
@top_srcdir@/tools/rpmarchive.c \
|
||||
@top_srcdir@/tools/rpmchecksig.c \
|
||||
@top_srcdir@/tools/rpmheader.c \
|
||||
@top_srcdir@/tools/rpminject.c \
|
||||
@top_srcdir@/tools/rpmlead.c \
|
||||
@top_srcdir@/tools/rpmsignature.c
|
||||
|
||||
# If the value of the INPUT tag contains directories, you can use the
|
||||
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
|
||||
|
@ -477,7 +480,7 @@ EXCLUDE_PATTERNS =
|
|||
# directories that contain example code fragments that are included (see
|
||||
# the \include command).
|
||||
|
||||
EXAMPLE_PATH = @top_sourcedir@/doc/manual
|
||||
EXAMPLE_PATH = @top_srcdir@/doc/manual
|
||||
|
||||
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
|
||||
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
|
||||
|
|
|
@ -16,7 +16,7 @@ pkgincdir = $(pkgincludedir)
|
|||
pkginc_HEADERS = \
|
||||
header.h misc.h rpmcli.h rpmlib.h stringbuf.h
|
||||
noinst_HEADERS = \
|
||||
cpio.h depends.h fsm.h \
|
||||
cpio.h depends.h fsm.h header_internal.h \
|
||||
manifest.h md5.h psm.h \
|
||||
rpmlead.h signature.h
|
||||
|
||||
|
@ -32,9 +32,9 @@ LIBS =
|
|||
lib_LTLIBRARIES = librpm.la
|
||||
librpm_la_SOURCES = \
|
||||
cpio.c depends.c formats.c fs.c fsm.c getdate.c \
|
||||
header.c manifest.c md5.c md5sum.c misc.c package.c \
|
||||
header.c header_internal.c manifest.c md5.c md5sum.c misc.c package.c \
|
||||
problems.c poptBT.c poptI.c poptK.c poptQV.c psm.c query.c \
|
||||
rpmchecksig.c rpminstall.c rpmlead.c rpmlibprov.c rpmrc.c \
|
||||
rpmchecksig.c rpminstall.c rpmlead.c rpmlibprov.c rpmrc.c rpmvercmp.c \
|
||||
signature.c stringbuf.c tagName.c tagtable.c transaction.c \
|
||||
verify.c
|
||||
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
#include <rpmlib.h>
|
||||
|
||||
#include "depends.h"
|
||||
#include "rpmdb.h"
|
||||
#include "misc.h"
|
||||
#include "rpmdb.h" /* XXX response cache needs dbiOpen et al. */
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
/*@access dbiIndex@*/ /* XXX compared with NULL */
|
||||
|
|
241
lib/header.c
241
lib/header.c
|
@ -14,11 +14,7 @@
|
|||
|
||||
#include "system.h"
|
||||
|
||||
#if !defined(__LCLINT__)
|
||||
#include <netinet/in.h>
|
||||
#endif /* __LCLINT__ */
|
||||
|
||||
#include <header.h>
|
||||
#include <header_internal.h>
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
|
@ -58,98 +54,6 @@ static int typeSizes[] = {
|
|||
-1 /*!< RPM_I18NSTRING_TYPE */
|
||||
};
|
||||
|
||||
/**
|
||||
* Description of tag data.
|
||||
*/
|
||||
struct entryInfo {
|
||||
int_32 tag; /*!< Tag identifier. */
|
||||
int_32 type; /*!< Tag data type. */
|
||||
int_32 offset; /*!< Offset into data segment (ondisk only). */
|
||||
int_32 count; /*!< Number of tag elements. */
|
||||
};
|
||||
|
||||
#define REGION_TAG_TYPE RPM_BIN_TYPE
|
||||
#define REGION_TAG_COUNT sizeof(struct entryInfo)
|
||||
|
||||
#define ENTRY_IS_REGION(_e) ((_e)->info.tag < HEADER_I18NTABLE)
|
||||
#define ENTRY_IN_REGION(_e) ((_e)->info.offset < 0)
|
||||
|
||||
/**
|
||||
* A single tag from a Header.
|
||||
*/
|
||||
struct indexEntry {
|
||||
struct entryInfo info; /*!< Description of tag data. */
|
||||
/*@owned@*/ void * data; /*!< Location of tag data. */
|
||||
int length; /*!< No. bytes of data. */
|
||||
int rdlen; /*!< No. bytes of data in region. */
|
||||
};
|
||||
|
||||
/**
|
||||
* The Header data structure.
|
||||
*/
|
||||
struct headerToken {
|
||||
/*@owned@*/ struct indexEntry * index; /*!< Array of tags. */
|
||||
int indexUsed; /*!< Current size of tag array. */
|
||||
int indexAlloced; /*!< Allocated size of tag array. */
|
||||
int region_allocated; /*!< Is 1st header region allocated? */
|
||||
int sorted; /*!< Are header entries sorted? */
|
||||
int legacy; /*!< Header came from legacy source? */
|
||||
/*@refs@*/ int nrefs; /*!< Reference count. */
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
struct sprintfTag {
|
||||
/*@null@*/ headerTagTagFunction ext; /*!< if NULL tag element is invalid */
|
||||
int extNum;
|
||||
int_32 tag;
|
||||
int justOne;
|
||||
int arrayCount;
|
||||
/*@kept@*/ char * format;
|
||||
/*@kept@*/ /*@null@*/ char * type;
|
||||
int pad;
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
struct extensionCache {
|
||||
int_32 type;
|
||||
int_32 count;
|
||||
int avail;
|
||||
int freeit;
|
||||
/*@owned@*/ const void * data;
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
struct sprintfToken {
|
||||
enum {
|
||||
PTOK_NONE = 0,
|
||||
PTOK_TAG,
|
||||
PTOK_ARRAY,
|
||||
PTOK_STRING,
|
||||
PTOK_COND
|
||||
} type;
|
||||
union {
|
||||
struct {
|
||||
/*@only@*/ struct sprintfToken * format;
|
||||
int numTokens;
|
||||
} array;
|
||||
struct sprintfTag tag;
|
||||
struct {
|
||||
/*@dependent@*/ char * string;
|
||||
int len;
|
||||
} string;
|
||||
struct {
|
||||
/*@only@*/ /*@null@*/ struct sprintfToken * ifFormat;
|
||||
int numIfTokens;
|
||||
/*@only@*/ /*@null@*/ struct sprintfToken * elseFormat;
|
||||
int numElseTokens;
|
||||
struct sprintfTag tag;
|
||||
} cond;
|
||||
} u;
|
||||
};
|
||||
|
||||
/**
|
||||
* Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
|
||||
* @param p memory to free
|
||||
|
@ -1062,124 +966,6 @@ exit:
|
|||
return h;
|
||||
}
|
||||
|
||||
void headerDump(Header h, FILE *f, int flags,
|
||||
const struct headerTagTableEntry * tags)
|
||||
{
|
||||
int i;
|
||||
struct indexEntry *p;
|
||||
const struct headerTagTableEntry * tage;
|
||||
const char *tag;
|
||||
char *type;
|
||||
|
||||
/* First write out the length of the index (count of index entries) */
|
||||
fprintf(f, "Entry count: %d\n", h->indexUsed);
|
||||
|
||||
/* Now write the index */
|
||||
p = h->index;
|
||||
fprintf(f, "\n CT TAG TYPE "
|
||||
" OFSET COUNT\n");
|
||||
for (i = 0; i < h->indexUsed; i++) {
|
||||
switch (p->info.type) {
|
||||
case RPM_NULL_TYPE: type = "NULL"; break;
|
||||
case RPM_CHAR_TYPE: type = "CHAR"; break;
|
||||
case RPM_BIN_TYPE: type = "BIN"; break;
|
||||
case RPM_INT8_TYPE: type = "INT8"; break;
|
||||
case RPM_INT16_TYPE: type = "INT16"; break;
|
||||
case RPM_INT32_TYPE: type = "INT32"; break;
|
||||
/*case RPM_INT64_TYPE: type = "INT64"; break;*/
|
||||
case RPM_STRING_TYPE: type = "STRING"; break;
|
||||
case RPM_STRING_ARRAY_TYPE: type = "STRING_ARRAY"; break;
|
||||
case RPM_I18NSTRING_TYPE: type = "I18N_STRING"; break;
|
||||
default: type = "(unknown)"; break;
|
||||
}
|
||||
|
||||
tage = tags;
|
||||
while (tage->name && tage->val != p->info.tag) tage++;
|
||||
|
||||
if (!tage->name)
|
||||
tag = "(unknown)";
|
||||
else
|
||||
tag = tage->name;
|
||||
|
||||
fprintf(f, "Entry : %3.3d (%d)%-14s %-18s 0x%.8x %.8d\n", i,
|
||||
p->info.tag, tag, type, (unsigned) p->info.offset,
|
||||
(int) p->info.count);
|
||||
|
||||
if (flags & HEADER_DUMP_INLINE) {
|
||||
char *dp = p->data;
|
||||
int c = p->info.count;
|
||||
int ct = 0;
|
||||
|
||||
/* Print the data inline */
|
||||
switch (p->info.type) {
|
||||
case RPM_INT32_TYPE:
|
||||
while (c--) {
|
||||
fprintf(f, " Data: %.3d 0x%08x (%d)\n", ct++,
|
||||
(unsigned) *((int_32 *) dp),
|
||||
(int) *((int_32 *) dp));
|
||||
dp += sizeof(int_32);
|
||||
}
|
||||
break;
|
||||
|
||||
case RPM_INT16_TYPE:
|
||||
while (c--) {
|
||||
fprintf(f, " Data: %.3d 0x%04x (%d)\n", ct++,
|
||||
(unsigned) (*((int_16 *) dp) & 0xffff),
|
||||
(int) *((int_16 *) dp));
|
||||
dp += sizeof(int_16);
|
||||
}
|
||||
break;
|
||||
case RPM_INT8_TYPE:
|
||||
while (c--) {
|
||||
fprintf(f, " Data: %.3d 0x%02x (%d)\n", ct++,
|
||||
(unsigned) (*((int_8 *) dp) & 0xff),
|
||||
(int) *((int_8 *) dp));
|
||||
dp += sizeof(int_8);
|
||||
}
|
||||
break;
|
||||
case RPM_BIN_TYPE:
|
||||
while (c > 0) {
|
||||
fprintf(f, " Data: %.3d ", ct);
|
||||
while (c--) {
|
||||
fprintf(f, "%02x ", (unsigned) (*(int_8 *)dp & 0xff));
|
||||
ct++;
|
||||
dp += sizeof(int_8);
|
||||
if (! (ct % 8)) {
|
||||
/*@loopbreak@*/ break;
|
||||
}
|
||||
}
|
||||
fprintf(f, "\n");
|
||||
}
|
||||
break;
|
||||
case RPM_CHAR_TYPE:
|
||||
while (c--) {
|
||||
char ch = (char) *((char *) dp);
|
||||
fprintf(f, " Data: %.3d 0x%2x %c (%d)\n", ct++,
|
||||
(unsigned)(ch & 0xff),
|
||||
(isprint(ch) ? ch : ' '),
|
||||
(int) *((char *) dp));
|
||||
dp += sizeof(char);
|
||||
}
|
||||
break;
|
||||
case RPM_STRING_TYPE:
|
||||
case RPM_STRING_ARRAY_TYPE:
|
||||
case RPM_I18NSTRING_TYPE:
|
||||
while (c--) {
|
||||
fprintf(f, " Data: %.3d %s\n", ct++, (char *) dp);
|
||||
dp = strchr(dp, 0);
|
||||
dp++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, _("Data type %d not supported\n"),
|
||||
(int) p->info.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find matching (tag,type) entry in header.
|
||||
* @param h header
|
||||
|
@ -1497,11 +1283,6 @@ Header headerLink(Header h)
|
|||
/*@-refcounttrans@*/ return h; /*@=refcounttrans@*/
|
||||
}
|
||||
|
||||
int headerUsageCount(Header h)
|
||||
{
|
||||
return h->nrefs;
|
||||
}
|
||||
|
||||
unsigned int headerSizeof(Header h, enum hMagic magicp)
|
||||
{
|
||||
struct indexEntry * entry;
|
||||
|
@ -1641,26 +1422,6 @@ int headerAddEntry(Header h, int_32 tag, int_32 type, const void *p, int_32 c)
|
|||
return 1;
|
||||
}
|
||||
|
||||
char **
|
||||
headerGetLangs(Header h)
|
||||
{
|
||||
char **s, *e, **table;
|
||||
int i, type, count;
|
||||
|
||||
if (!headerGetRawEntry(h, HEADER_I18NTABLE, &type, (const void **)&s, &count))
|
||||
return NULL;
|
||||
|
||||
/* XXX xcalloc never returns NULL. */
|
||||
if ((table = (char **)xcalloc((count+1), sizeof(char *))) == NULL)
|
||||
return NULL;
|
||||
|
||||
for (i = 0, e = *s; i < count > 0; i++, e += strlen(e)+1)
|
||||
table[i] = e;
|
||||
table[count] = NULL;
|
||||
|
||||
/*@-nullret@*/ return table; /*@=nullret@*/ /* LCL: double indirection? */
|
||||
}
|
||||
|
||||
int headerAddI18NString(Header h, int_32 tag, const char * string, const char * lang)
|
||||
{
|
||||
struct indexEntry * table, * entry;
|
||||
|
|
28
lib/header.h
28
lib/header.h
|
@ -266,25 +266,6 @@ Header headerLink(Header h)
|
|||
/*@null@*/ Header headerFree( /*@null@*/ /*@killref@*/ Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Return header reference count.
|
||||
* @param h header
|
||||
* @return no. of references
|
||||
*/
|
||||
/*@unused@*/
|
||||
int headerUsageCount(Header h) /*@*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Dump a header in human readable format (for debugging).
|
||||
* @param h header
|
||||
* @param flags 0 or HEADER_DUMP_LINLINE
|
||||
* @param tags array of tag name/value pairs
|
||||
*/
|
||||
/*@unused@*/
|
||||
void headerDump(Header h, FILE *f, int flags,
|
||||
const struct headerTagTableEntry * tags);
|
||||
#define HEADER_DUMP_INLINE 1
|
||||
|
||||
/*@-redef@*/ /* LCL: no clue */
|
||||
typedef const char * errmsg_t;
|
||||
/*@=redef@*/
|
||||
|
@ -338,15 +319,6 @@ int headerModifyEntry(Header h, int_32 tag, int_32 type,
|
|||
const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Return array of locales found in header.
|
||||
* The array is terminated with a NULL sentinel.
|
||||
* @param h header
|
||||
* @return array of locales (or NULL on error)
|
||||
*/
|
||||
/*@unused@*/
|
||||
/*@only@*/ /*@null@*/ char ** headerGetLangs(Header h) /*@*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Add locale specific tag to header.
|
||||
* A NULL lang is interpreted as the C locale. Here are the rules:
|
||||
|
|
|
@ -0,0 +1,128 @@
|
|||
/** \ingroup header
|
||||
* \file lib/header_internal.c
|
||||
*/
|
||||
|
||||
#include "system.h"
|
||||
|
||||
#include <header_internal.h>
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
void headerDump(Header h, FILE *f, int flags,
|
||||
const struct headerTagTableEntry * tags)
|
||||
{
|
||||
int i;
|
||||
struct indexEntry *p;
|
||||
const struct headerTagTableEntry * tage;
|
||||
const char *tag;
|
||||
char *type;
|
||||
|
||||
/* First write out the length of the index (count of index entries) */
|
||||
fprintf(f, "Entry count: %d\n", h->indexUsed);
|
||||
|
||||
/* Now write the index */
|
||||
p = h->index;
|
||||
fprintf(f, "\n CT TAG TYPE "
|
||||
" OFSET COUNT\n");
|
||||
for (i = 0; i < h->indexUsed; i++) {
|
||||
switch (p->info.type) {
|
||||
case RPM_NULL_TYPE: type = "NULL"; break;
|
||||
case RPM_CHAR_TYPE: type = "CHAR"; break;
|
||||
case RPM_BIN_TYPE: type = "BIN"; break;
|
||||
case RPM_INT8_TYPE: type = "INT8"; break;
|
||||
case RPM_INT16_TYPE: type = "INT16"; break;
|
||||
case RPM_INT32_TYPE: type = "INT32"; break;
|
||||
/*case RPM_INT64_TYPE: type = "INT64"; break;*/
|
||||
case RPM_STRING_TYPE: type = "STRING"; break;
|
||||
case RPM_STRING_ARRAY_TYPE: type = "STRING_ARRAY"; break;
|
||||
case RPM_I18NSTRING_TYPE: type = "I18N_STRING"; break;
|
||||
default: type = "(unknown)"; break;
|
||||
}
|
||||
|
||||
tage = tags;
|
||||
while (tage->name && tage->val != p->info.tag) tage++;
|
||||
|
||||
if (!tage->name)
|
||||
tag = "(unknown)";
|
||||
else
|
||||
tag = tage->name;
|
||||
|
||||
fprintf(f, "Entry : %3.3d (%d)%-14s %-18s 0x%.8x %.8d\n", i,
|
||||
p->info.tag, tag, type, (unsigned) p->info.offset,
|
||||
(int) p->info.count);
|
||||
|
||||
if (flags & HEADER_DUMP_INLINE) {
|
||||
char *dp = p->data;
|
||||
int c = p->info.count;
|
||||
int ct = 0;
|
||||
|
||||
/* Print the data inline */
|
||||
switch (p->info.type) {
|
||||
case RPM_INT32_TYPE:
|
||||
while (c--) {
|
||||
fprintf(f, " Data: %.3d 0x%08x (%d)\n", ct++,
|
||||
(unsigned) *((int_32 *) dp),
|
||||
(int) *((int_32 *) dp));
|
||||
dp += sizeof(int_32);
|
||||
}
|
||||
break;
|
||||
|
||||
case RPM_INT16_TYPE:
|
||||
while (c--) {
|
||||
fprintf(f, " Data: %.3d 0x%04x (%d)\n", ct++,
|
||||
(unsigned) (*((int_16 *) dp) & 0xffff),
|
||||
(int) *((int_16 *) dp));
|
||||
dp += sizeof(int_16);
|
||||
}
|
||||
break;
|
||||
case RPM_INT8_TYPE:
|
||||
while (c--) {
|
||||
fprintf(f, " Data: %.3d 0x%02x (%d)\n", ct++,
|
||||
(unsigned) (*((int_8 *) dp) & 0xff),
|
||||
(int) *((int_8 *) dp));
|
||||
dp += sizeof(int_8);
|
||||
}
|
||||
break;
|
||||
case RPM_BIN_TYPE:
|
||||
while (c > 0) {
|
||||
fprintf(f, " Data: %.3d ", ct);
|
||||
while (c--) {
|
||||
fprintf(f, "%02x ", (unsigned) (*(int_8 *)dp & 0xff));
|
||||
ct++;
|
||||
dp += sizeof(int_8);
|
||||
if (! (ct % 8)) {
|
||||
/*@loopbreak@*/ break;
|
||||
}
|
||||
}
|
||||
fprintf(f, "\n");
|
||||
}
|
||||
break;
|
||||
case RPM_CHAR_TYPE:
|
||||
while (c--) {
|
||||
char ch = (char) *((char *) dp);
|
||||
fprintf(f, " Data: %.3d 0x%2x %c (%d)\n", ct++,
|
||||
(unsigned)(ch & 0xff),
|
||||
(isprint(ch) ? ch : ' '),
|
||||
(int) *((char *) dp));
|
||||
dp += sizeof(char);
|
||||
}
|
||||
break;
|
||||
case RPM_STRING_TYPE:
|
||||
case RPM_STRING_ARRAY_TYPE:
|
||||
case RPM_I18NSTRING_TYPE:
|
||||
while (c--) {
|
||||
fprintf(f, " Data: %.3d %s\n", ct++, (char *) dp);
|
||||
dp = strchr(dp, 0);
|
||||
dp++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, _("Data type %d not supported\n"),
|
||||
(int) p->info.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
#ifndef H_HEADER_INTERNAL
|
||||
#define H_HEADER_INTERNAL
|
||||
|
||||
/** \ingroup header
|
||||
* \file lib/header_internal.h
|
||||
*/
|
||||
|
||||
#include <header.h>
|
||||
|
||||
#if !defined(__LCLINT__)
|
||||
#include <netinet/in.h>
|
||||
#endif /* __LCLINT__ */
|
||||
|
||||
|
||||
/**
|
||||
* Description of tag data.
|
||||
*/
|
||||
struct entryInfo {
|
||||
int_32 tag; /*!< Tag identifier. */
|
||||
int_32 type; /*!< Tag data type. */
|
||||
int_32 offset; /*!< Offset into data segment (ondisk only). */
|
||||
int_32 count; /*!< Number of tag elements. */
|
||||
};
|
||||
|
||||
#define REGION_TAG_TYPE RPM_BIN_TYPE
|
||||
#define REGION_TAG_COUNT sizeof(struct entryInfo)
|
||||
|
||||
#define ENTRY_IS_REGION(_e) ((_e)->info.tag < HEADER_I18NTABLE)
|
||||
#define ENTRY_IN_REGION(_e) ((_e)->info.offset < 0)
|
||||
|
||||
/**
|
||||
* A single tag from a Header.
|
||||
*/
|
||||
struct indexEntry {
|
||||
struct entryInfo info; /*!< Description of tag data. */
|
||||
/*@owned@*/ void * data; /*!< Location of tag data. */
|
||||
int length; /*!< No. bytes of data. */
|
||||
int rdlen; /*!< No. bytes of data in region. */
|
||||
};
|
||||
|
||||
/**
|
||||
* The Header data structure.
|
||||
*/
|
||||
struct headerToken {
|
||||
/*@owned@*/ struct indexEntry * index; /*!< Array of tags. */
|
||||
int indexUsed; /*!< Current size of tag array. */
|
||||
int indexAlloced; /*!< Allocated size of tag array. */
|
||||
int region_allocated; /*!< Is 1st header region allocated? */
|
||||
int sorted; /*!< Are header entries sorted? */
|
||||
int legacy; /*!< Header came from legacy source? */
|
||||
/*@refs@*/ int nrefs; /*!< Reference count. */
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
struct sprintfTag {
|
||||
/*@null@*/ headerTagTagFunction ext; /*!< if NULL tag element is invalid */
|
||||
int extNum;
|
||||
int_32 tag;
|
||||
int justOne;
|
||||
int arrayCount;
|
||||
/*@kept@*/ char * format;
|
||||
/*@kept@*/ /*@null@*/ char * type;
|
||||
int pad;
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
struct extensionCache {
|
||||
int_32 type;
|
||||
int_32 count;
|
||||
int avail;
|
||||
int freeit;
|
||||
/*@owned@*/ const void * data;
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
struct sprintfToken {
|
||||
enum {
|
||||
PTOK_NONE = 0,
|
||||
PTOK_TAG,
|
||||
PTOK_ARRAY,
|
||||
PTOK_STRING,
|
||||
PTOK_COND
|
||||
} type;
|
||||
union {
|
||||
struct {
|
||||
/*@only@*/ struct sprintfToken * format;
|
||||
int numTokens;
|
||||
} array;
|
||||
struct sprintfTag tag;
|
||||
struct {
|
||||
/*@dependent@*/ char * string;
|
||||
int len;
|
||||
} string;
|
||||
struct {
|
||||
/*@only@*/ /*@null@*/ struct sprintfToken * ifFormat;
|
||||
int numIfTokens;
|
||||
/*@only@*/ /*@null@*/ struct sprintfToken * elseFormat;
|
||||
int numElseTokens;
|
||||
struct sprintfTag tag;
|
||||
} cond;
|
||||
} u;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \ingroup header
|
||||
* Dump a header in human readable format (for debugging).
|
||||
* @param h header
|
||||
* @param flags 0 or HEADER_DUMP_LINLINE
|
||||
* @param tags array of tag name/value pairs
|
||||
*/
|
||||
/*@unused@*/
|
||||
void headerDump(Header h, FILE *f, int flags,
|
||||
const struct headerTagTableEntry * tags);
|
||||
#define HEADER_DUMP_INLINE 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* H_HEADER_INTERNAL */
|
112
lib/misc.c
112
lib/misc.c
|
@ -94,129 +94,25 @@ int rpmfileexists(const char * urlfn)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* compare alpha and numeric segments of two versions */
|
||||
/* return 1: a is newer than b */
|
||||
/* 0: a and b are the same version */
|
||||
/* -1: b is newer than a */
|
||||
int rpmvercmp(const char * a, const char * b)
|
||||
{
|
||||
char oldch1, oldch2;
|
||||
char * str1, * str2;
|
||||
char * one, * two;
|
||||
int rc;
|
||||
int isnum;
|
||||
|
||||
/* easy comparison to see if versions are identical */
|
||||
if (!strcmp(a, b)) return 0;
|
||||
|
||||
str1 = alloca(strlen(a) + 1);
|
||||
str2 = alloca(strlen(b) + 1);
|
||||
|
||||
strcpy(str1, a);
|
||||
strcpy(str2, b);
|
||||
|
||||
one = str1;
|
||||
two = str2;
|
||||
|
||||
/* loop through each version segment of str1 and str2 and compare them */
|
||||
while (*one && *two) {
|
||||
while (*one && !xisalnum(*one)) one++;
|
||||
while (*two && !xisalnum(*two)) two++;
|
||||
|
||||
str1 = one;
|
||||
str2 = two;
|
||||
|
||||
/* grab first completely alpha or completely numeric segment */
|
||||
/* leave one and two pointing to the start of the alpha or numeric */
|
||||
/* segment and walk str1 and str2 to end of segment */
|
||||
if (xisdigit(*str1)) {
|
||||
while (*str1 && xisdigit(*str1)) str1++;
|
||||
while (*str2 && xisdigit(*str2)) str2++;
|
||||
isnum = 1;
|
||||
} else {
|
||||
while (*str1 && xisalpha(*str1)) str1++;
|
||||
while (*str2 && xisalpha(*str2)) str2++;
|
||||
isnum = 0;
|
||||
}
|
||||
|
||||
/* save character at the end of the alpha or numeric segment */
|
||||
/* so that they can be restored after the comparison */
|
||||
oldch1 = *str1;
|
||||
*str1 = '\0';
|
||||
oldch2 = *str2;
|
||||
*str2 = '\0';
|
||||
|
||||
/* take care of the case where the two version segments are */
|
||||
/* different types: one numeric, the other alpha (i.e. empty) */
|
||||
if (one == str1) return -1; /* arbitrary */
|
||||
if (two == str2) return 1;
|
||||
|
||||
if (isnum) {
|
||||
/* this used to be done by converting the digit segments */
|
||||
/* to ints using atoi() - it's changed because long */
|
||||
/* digit segments can overflow an int - this should fix that. */
|
||||
|
||||
/* throw away any leading zeros - it's a number, right? */
|
||||
while (*one == '0') one++;
|
||||
while (*two == '0') two++;
|
||||
|
||||
/* whichever number has more digits wins */
|
||||
if (strlen(one) > strlen(two)) return 1;
|
||||
if (strlen(two) > strlen(one)) return -1;
|
||||
}
|
||||
|
||||
/* strcmp will return which one is greater - even if the two */
|
||||
/* segments are alpha or if they are numeric. don't return */
|
||||
/* if they are equal because there might be more segments to */
|
||||
/* compare */
|
||||
rc = strcmp(one, two);
|
||||
if (rc) return rc;
|
||||
|
||||
/* restore character that was replaced by null above */
|
||||
*str1 = oldch1;
|
||||
one = str1;
|
||||
*str2 = oldch2;
|
||||
two = str2;
|
||||
}
|
||||
|
||||
/* this catches the case where all numeric and alpha segments have */
|
||||
/* compared identically but the segment sepparating characters were */
|
||||
/* different */
|
||||
if ((!*one) && (!*two)) return 0;
|
||||
|
||||
/* whichever version still has characters left over wins */
|
||||
if (!*one) return -1; else return 1;
|
||||
}
|
||||
|
||||
int doputenv(const char *str)
|
||||
{
|
||||
char * a;
|
||||
|
||||
/* FIXME: this leaks memory! */
|
||||
|
||||
a = xmalloc(strlen(str) + 1);
|
||||
strcpy(a, str);
|
||||
|
||||
return putenv(a);
|
||||
}
|
||||
|
||||
int dosetenv(const char *name, const char *value, int overwrite)
|
||||
int dosetenv(const char * name, const char * value, int overwrite)
|
||||
{
|
||||
int i;
|
||||
char * a;
|
||||
|
||||
/* FIXME: this leaks memory! */
|
||||
|
||||
if (!overwrite && getenv(name)) return 0;
|
||||
|
||||
i = strlen(name) + strlen(value) + 2;
|
||||
a = xmalloc(i);
|
||||
if (!a) return 1;
|
||||
|
||||
strcpy(a, name);
|
||||
strcat(a, "=");
|
||||
strcat(a, value);
|
||||
|
||||
/* FIXME: this leaks memory! */
|
||||
a = xmalloc(strlen(name) + strlen(value) + sizeof("="));
|
||||
(void) stpcpy( stpcpy( stpcpy( a, name), "="), value);
|
||||
return putenv(a);
|
||||
}
|
||||
|
||||
|
|
|
@ -47,10 +47,12 @@ void freeSplitString( /*@only@*/ char ** list)
|
|||
int rpmfileexists(const char * urlfn)
|
||||
/*@modifies fileSystem @*/;
|
||||
|
||||
#ifdef DYING
|
||||
/**
|
||||
*/
|
||||
int rpmvercmp(const char * a, const char * b)
|
||||
/*@*/;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These are like the libc functions, but they malloc() the space which
|
||||
|
@ -72,7 +74,7 @@ int doputenv(const char * str)
|
|||
* A unique temporaray file path will be generated using
|
||||
* rpmGenPath(prefix, "%{_tmppath}/", "rpm-tmp.XXXXX")
|
||||
* where "XXXXXX" is filled in using rand(3). The file is opened, and
|
||||
* the link count and (dev,ino) location are * verified after opening.
|
||||
* the link count and (dev,ino) location are verified after opening.
|
||||
* The file name and the open file handle are returned.
|
||||
*
|
||||
* @param prefix leading part of temp file path
|
||||
|
@ -86,7 +88,8 @@ int makeTempFile(/*@null@*/ const char * prefix,
|
|||
/*@modifies *fnptr, *fdptr, fileSystem @*/;
|
||||
|
||||
/**
|
||||
* @return cureent working directory (malloc'ed)
|
||||
* Return (malloc'd) current working directory.
|
||||
* @return current working directory (malloc'ed)
|
||||
*/
|
||||
/*@only@*/ char * currentDirectory(void)
|
||||
/*@modifies fileSystem @*/;
|
||||
|
|
|
@ -5,9 +5,9 @@
|
|||
* \file lib/rpmcli.h
|
||||
*/
|
||||
|
||||
#include <rpmlib.h>
|
||||
#include <rpmurl.h>
|
||||
#include <rpmmacro.h>
|
||||
#include "rpmlib.h"
|
||||
#include "rpmurl.h"
|
||||
#include "rpmmacro.h"
|
||||
|
||||
/** \ingroup rpmcli
|
||||
* Should version 3 packages be produced?
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include <rpmcli.h>
|
||||
|
||||
#include "manifest.h"
|
||||
#include "misc.h"
|
||||
#include "misc.h" /* XXX for rpmGlob() */
|
||||
#include "debug.h"
|
||||
|
||||
/*@access rpmTransactionSet@*/ /* XXX compared with NULL */
|
||||
|
|
34
lib/rpmlib.h
34
lib/rpmlib.h
|
@ -841,6 +841,12 @@ int rpmdbSetIteratorModified(/*@null@*/ rpmdbMatchIterator mi, int modified)
|
|||
/*@null@*/ Header rpmdbNextIterator(/*@null@*/ rpmdbMatchIterator mi)
|
||||
/*@modifies mi @*/;
|
||||
|
||||
/** @todo Remove debugging entry from the ABI. */
|
||||
/*@unused@*/
|
||||
/*@null@*/ Header XrpmdbNextIterator(rpmdbMatchIterator mi,
|
||||
const char * f, unsigned int l)
|
||||
/*@modifies mi @*/;
|
||||
|
||||
/** \ingroup rpmdb
|
||||
* Return database iterator.
|
||||
* @param db rpm database
|
||||
|
@ -931,19 +937,21 @@ void printDepFlags(FILE *fp, const char *version, int flags)
|
|||
/*@modifies *fp, fileSystem @*/;
|
||||
|
||||
/**
|
||||
* Dependency problems found by rpmdepCheck().
|
||||
* @todo Rename, but rpmfind prevents "struct rpmDependencyConflict_s".
|
||||
*/
|
||||
typedef /*@abstract@*/ struct rpmDependencyConflict_s {
|
||||
const char * byName;
|
||||
const char * byVersion;
|
||||
const char * byRelease;
|
||||
Header byHeader;
|
||||
typedef /*@abstract@*/ struct rpmDependencyConflict {
|
||||
const char * byName; /*!< package name */
|
||||
const char * byVersion; /*!< package version */
|
||||
const char * byRelease; /*!< package release */
|
||||
Header byHeader; /*!< header with dependency problems */
|
||||
/*
|
||||
* These needs fields are misnamed -- they are used for the package
|
||||
* which isn't needed as well.
|
||||
*/
|
||||
const char * needsName;
|
||||
const char * needsVersion;
|
||||
int needsFlags;
|
||||
const char * needsName; /*!< dependency name */
|
||||
const char * needsVersion; /*!< dependency epoch:version-release */
|
||||
int needsFlags; /*!< dependency flags */
|
||||
/*@owned@*/ /*@null@*/ const void ** suggestedPackages; /* terminated by NULL */
|
||||
enum {
|
||||
RPMDEP_SENSE_REQUIRES, /*!< requirement not satisfied. */
|
||||
|
@ -1373,6 +1381,16 @@ int rpmGetRpmlibProvides(/*@null@*/ /*@out@*/ const char *** provNames,
|
|||
/*@null@*/ /*@out@*/ const char *** provVersions)
|
||||
/*@ modifies *provNames, *provFlags, *provVersions @*/;
|
||||
|
||||
/** \ingroup rpmtrans
|
||||
* Segmented string compare for version and/or release.
|
||||
*
|
||||
* @param a 1st string
|
||||
* @param b 2nd string
|
||||
* @return +1 if a is "newer", 0 if equal, -1 if b is "newer"
|
||||
*/
|
||||
int rpmvercmp(const char * a, const char * b)
|
||||
/*@*/;
|
||||
|
||||
/** \ingroup rpmtrans
|
||||
* Compare two versioned dependency ranges, looking for overlap.
|
||||
* @param AName 1st dependncy name string
|
||||
|
|
|
@ -0,0 +1,103 @@
|
|||
/** \ingroup rpmtrans
|
||||
* \file lib/rpmvercmp.c
|
||||
*/
|
||||
|
||||
#include "system.h"
|
||||
|
||||
#include <rpmio.h>
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
/* compare alpha and numeric segments of two versions */
|
||||
/* return 1: a is newer than b */
|
||||
/* 0: a and b are the same version */
|
||||
/* -1: b is newer than a */
|
||||
int rpmvercmp(const char * a, const char * b)
|
||||
{
|
||||
char oldch1, oldch2;
|
||||
char * str1, * str2;
|
||||
char * one, * two;
|
||||
int rc;
|
||||
int isnum;
|
||||
|
||||
/* easy comparison to see if versions are identical */
|
||||
if (!strcmp(a, b)) return 0;
|
||||
|
||||
str1 = alloca(strlen(a) + 1);
|
||||
str2 = alloca(strlen(b) + 1);
|
||||
|
||||
strcpy(str1, a);
|
||||
strcpy(str2, b);
|
||||
|
||||
one = str1;
|
||||
two = str2;
|
||||
|
||||
/* loop through each version segment of str1 and str2 and compare them */
|
||||
while (*one && *two) {
|
||||
while (*one && !xisalnum(*one)) one++;
|
||||
while (*two && !xisalnum(*two)) two++;
|
||||
|
||||
str1 = one;
|
||||
str2 = two;
|
||||
|
||||
/* grab first completely alpha or completely numeric segment */
|
||||
/* leave one and two pointing to the start of the alpha or numeric */
|
||||
/* segment and walk str1 and str2 to end of segment */
|
||||
if (xisdigit(*str1)) {
|
||||
while (*str1 && xisdigit(*str1)) str1++;
|
||||
while (*str2 && xisdigit(*str2)) str2++;
|
||||
isnum = 1;
|
||||
} else {
|
||||
while (*str1 && xisalpha(*str1)) str1++;
|
||||
while (*str2 && xisalpha(*str2)) str2++;
|
||||
isnum = 0;
|
||||
}
|
||||
|
||||
/* save character at the end of the alpha or numeric segment */
|
||||
/* so that they can be restored after the comparison */
|
||||
oldch1 = *str1;
|
||||
*str1 = '\0';
|
||||
oldch2 = *str2;
|
||||
*str2 = '\0';
|
||||
|
||||
/* take care of the case where the two version segments are */
|
||||
/* different types: one numeric, the other alpha (i.e. empty) */
|
||||
if (one == str1) return -1; /* arbitrary */
|
||||
if (two == str2) return 1;
|
||||
|
||||
if (isnum) {
|
||||
/* this used to be done by converting the digit segments */
|
||||
/* to ints using atoi() - it's changed because long */
|
||||
/* digit segments can overflow an int - this should fix that. */
|
||||
|
||||
/* throw away any leading zeros - it's a number, right? */
|
||||
while (*one == '0') one++;
|
||||
while (*two == '0') two++;
|
||||
|
||||
/* whichever number has more digits wins */
|
||||
if (strlen(one) > strlen(two)) return 1;
|
||||
if (strlen(two) > strlen(one)) return -1;
|
||||
}
|
||||
|
||||
/* strcmp will return which one is greater - even if the two */
|
||||
/* segments are alpha or if they are numeric. don't return */
|
||||
/* if they are equal because there might be more segments to */
|
||||
/* compare */
|
||||
rc = strcmp(one, two);
|
||||
if (rc) return rc;
|
||||
|
||||
/* restore character that was replaced by null above */
|
||||
*str1 = oldch1;
|
||||
one = str1;
|
||||
*str2 = oldch2;
|
||||
two = str2;
|
||||
}
|
||||
|
||||
/* this catches the case where all numeric and alpha segments have */
|
||||
/* compared identically but the segment sepparating characters were */
|
||||
/* different */
|
||||
if ((!*one) && (!*two)) return 0;
|
||||
|
||||
/* whichever version still has characters left over wins */
|
||||
if (!*one) return -1; else return 1;
|
||||
}
|
|
@ -18,10 +18,10 @@
|
|||
#endif
|
||||
|
||||
#include <rpmlib.h>
|
||||
#include <rpmmacro.h> /* XXX for rpmGetPath */
|
||||
#include <rpmmacro.h> /* XXX for rpmGetPath() */
|
||||
|
||||
#include "md5.h"
|
||||
#include "misc.h"
|
||||
#include "misc.h" /* XXX for dosetenv() and makeTempFile() */
|
||||
#include "rpmlead.h"
|
||||
#include "signature.h"
|
||||
#include "debug.h"
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include "fprint.h"
|
||||
#include "rpmhash.h"
|
||||
#include "md5.h"
|
||||
#include "misc.h"
|
||||
#include "misc.h" /* XXX stripTrailingChar, splitString, currentDirectory */
|
||||
#include "rpmdb.h"
|
||||
|
||||
/* XXX FIXME: merge with existing (broken?) tests in system.h */
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
#include "psm.h"
|
||||
#include "md5.h"
|
||||
#include "misc.h"
|
||||
#include "misc.h" /* XXX for uidToUname() and gnameToGid() */
|
||||
#include "debug.h"
|
||||
|
||||
/*@access TFI_t*/
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#/*! \page config_macros Default configuration: /usr/lib/rpm/macros
|
||||
# \verbatim
|
||||
#
|
||||
# $Id: macros.in,v 1.81 2001/06/15 21:52:47 jbj Exp $
|
||||
# $Id: macros.in,v 1.82 2001/06/17 22:18:03 jbj Exp $
|
||||
#
|
||||
# This is a global RPM configuration file. All changes made here will
|
||||
# be lost when the rpm package is upgraded. Any per-system configuration
|
||||
|
@ -705,7 +705,7 @@ cd %{u2p:%{_builddir}}\
|
|||
CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ; \
|
||||
CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ; \
|
||||
FFLAGS="${FFLAGS:-%optflags}" ; export FFLAGS ; \
|
||||
%{?__libtoolize:[ -f configure.in ] && %{__libtoolize} --copy --force} ; \
|
||||
%{?__libtoolize:[ -f configure.in ] && %{__libtoolize} --copy --force ;} \
|
||||
./configure \\\
|
||||
--target=%{_target_platform} \\\
|
||||
--prefix=%{_prefix} \\\
|
||||
|
|
|
@ -30,6 +30,7 @@ lib/formats.c
|
|||
lib/fs.c
|
||||
lib/fsm.c
|
||||
lib/header.c
|
||||
lib/header_internal.c
|
||||
lib/manifest.c
|
||||
lib/md5.c
|
||||
lib/md5sum.c
|
||||
|
@ -46,6 +47,7 @@ lib/rpmchecksig.c
|
|||
lib/rpminstall.c
|
||||
lib/rpmlead.c
|
||||
lib/rpmrc.c
|
||||
lib/rpmvercmp.c
|
||||
lib/signature.c
|
||||
lib/stringbuf.c
|
||||
lib/transaction.c
|
||||
|
|
|
@ -1273,7 +1273,7 @@ static PyObject * rpmtransRemove(rpmtransObject * s, PyObject * args) {
|
|||
/** \ingroup python
|
||||
*/
|
||||
static PyObject * rpmtransDepCheck(rpmtransObject * s, PyObject * args) {
|
||||
struct rpmDependencyConflict_s * conflicts;
|
||||
rpmDependencyConflict conflicts;
|
||||
int numConflicts;
|
||||
PyObject * list, * cf;
|
||||
int i;
|
||||
|
|
26
rpm2cpio.c
26
rpm2cpio.c
|
@ -14,14 +14,14 @@ int main(int argc, char **argv)
|
|||
FD_t gzdi;
|
||||
|
||||
setprogname(argv[0]); /* Retrofit glibc __progname */
|
||||
if (argc == 1) {
|
||||
if (argc == 1)
|
||||
fdi = fdDup(STDIN_FILENO);
|
||||
} else {
|
||||
else
|
||||
fdi = Fopen(argv[1], "r.ufdio");
|
||||
}
|
||||
|
||||
if (fdi == NULL || Ferror(fdi)) {
|
||||
fprintf(stderr, _("cannot open package: %s\n"), Fstrerror(fdi));
|
||||
if (Ferror(fdi)) {
|
||||
fprintf(stderr, "%s: %s: %s\n", argv[0],
|
||||
(argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
fdo = fdDup(STDOUT_FILENO);
|
||||
|
@ -61,25 +61,9 @@ int main(int argc, char **argv)
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
#ifdef DYING
|
||||
{ char buffer[BUFSIZ];
|
||||
int ct;
|
||||
while ((ct = Fread(buffer, sizeof(buffer[0]), sizeof(buffer), gzdi)) > 0) {
|
||||
Fwrite(buffer, sizeof(buffer[0]), ct, fdo);
|
||||
}
|
||||
|
||||
if (ct < 0) {
|
||||
fprintf (stderr, "rpm2cpio: zlib: %s\n", Fstrerror(gzdi));
|
||||
rc = EXIT_FAILURE;
|
||||
} else {
|
||||
rc = EXIT_SUCCESS;
|
||||
}
|
||||
}
|
||||
#else
|
||||
rc = ufdCopy(gzdi, fdo);
|
||||
rc = (rc <= 0) ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
Fclose(fdo);
|
||||
#endif
|
||||
|
||||
Fclose(gzdi); /* XXX gzdi == fdi */
|
||||
|
||||
|
|
|
@ -1859,6 +1859,12 @@ int rpmdbSetIteratorModified(rpmdbMatchIterator mi, int modified) {
|
|||
return rc;
|
||||
}
|
||||
|
||||
Header XrpmdbNextIterator(rpmdbMatchIterator mi,
|
||||
/*@unused@*/ const char * f, /*@unused@*/ unsigned int l)
|
||||
{
|
||||
return rpmdbNextIterator(mi);
|
||||
}
|
||||
|
||||
Header rpmdbNextIterator(rpmdbMatchIterator mi)
|
||||
{
|
||||
dbiIndex dbi;
|
||||
|
|
|
@ -389,12 +389,14 @@ ssize_t fdWrite(void * cookie, const char * buf, size_t count)
|
|||
int fdClose( /*@only@*/ void * cookie)
|
||||
/*@modifies *cookie, fileSystem @*/;
|
||||
|
||||
/* XXX FD_t reference count debugging wrappers */
|
||||
/**
|
||||
* FD_t reference count debugging wrappers.
|
||||
* @todo Remove debugging entries from the ABI.
|
||||
*/
|
||||
#define fdLink(_fd, _msg) fdio->_fdref(_fd, _msg, __FILE__, __LINE__)
|
||||
#define fdFree(_fd, _msg) fdio->_fdderef(_fd, _msg, __FILE__, __LINE__)
|
||||
#define fdNew(_msg) fdio->_fdnew(_msg, __FILE__, __LINE__)
|
||||
|
||||
|
||||
/** \ingroup rpmio
|
||||
*/
|
||||
int fdWritable(FD_t fd, int secs)
|
||||
|
|
|
@ -59,6 +59,8 @@ extern int url_iobuf_size;
|
|||
* @return new instance
|
||||
*/
|
||||
urlinfo urlNew(const char * msg) /*@*/;
|
||||
|
||||
/** @todo Remove debugging entry from the ABI. */
|
||||
urlinfo XurlNew(const char * msg, const char * file, unsigned line) /*@*/;
|
||||
#define urlNew(_msg) XurlNew(_msg, __FILE__, __LINE__)
|
||||
|
||||
|
@ -70,6 +72,8 @@ urlinfo XurlNew(const char * msg, const char * file, unsigned line) /*@*/;
|
|||
*/
|
||||
urlinfo urlLink(urlinfo u, const char * msg)
|
||||
/*@modifies u @*/;
|
||||
|
||||
/** @todo Remove debugging entry from the ABI. */
|
||||
urlinfo XurlLink(urlinfo u, const char * msg, const char * file, unsigned line)
|
||||
/*@modifies u @*/;
|
||||
#define urlLink(_u, _msg) XurlLink(_u, _msg, __FILE__, __LINE__)
|
||||
|
@ -82,6 +86,8 @@ urlinfo XurlLink(urlinfo u, const char * msg, const char * file, unsigned line)
|
|||
*/
|
||||
urlinfo urlFree( /*@killref@*/ urlinfo u, const char * msg)
|
||||
/*@modifies u @*/;
|
||||
|
||||
/** @todo Remove debugging entry from the ABI. */
|
||||
urlinfo XurlFree( /*@killref@*/ urlinfo u, const char * msg,
|
||||
const char * file, unsigned line)
|
||||
/*@modifies u @*/;
|
||||
|
|
10
tools/dump.c
10
tools/dump.c
|
@ -1,6 +1,7 @@
|
|||
#include "system.h"
|
||||
|
||||
#include <rpmlib.h>
|
||||
#include "header_internal.h"
|
||||
#include "debug.h"
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
|
@ -15,20 +16,21 @@ int main(int argc, char ** argv)
|
|||
fdi = Fopen(argv[1], "r.ufdio");
|
||||
}
|
||||
|
||||
if (fdi == NULL || Ferror(fdi)) {
|
||||
fprintf(stderr, _("cannot open %s: %s\n"), argv[1], strerror(errno));
|
||||
if (Ferror(fdi)) {
|
||||
fprintf(stderr, _("cannot open %s: %s\n"),
|
||||
(argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
h = headerRead(fdi, HEADER_MAGIC_YES);
|
||||
if (!h) {
|
||||
fprintf(stderr, _("headerRead error: %s\n"), strerror(errno));
|
||||
fprintf(stderr, _("headerRead error: %s\n"), Fstrerror(fdi));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
Fclose(fdi);
|
||||
|
||||
headerDump(h, stdout, HEADER_DUMP_INLINE, rpmTagTable);
|
||||
headerFree(h);
|
||||
h = headerFree(h);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "system.h"
|
||||
|
||||
#include "rpmlib.h"
|
||||
#include <rpmlib.h>
|
||||
#include "header_internal.h"
|
||||
#include "debug.h"
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
|
@ -19,7 +20,7 @@ int main(int argc, char ** argv)
|
|||
}
|
||||
|
||||
if (rpmdbOpen("", &db, O_RDONLY, 0644)) {
|
||||
fprintf(stderr, _("cannot open /var/lib/rpm/packages.rpm\n"));
|
||||
fprintf(stderr, _("cannot open Packages\n"));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
@ -36,14 +37,14 @@ int main(int argc, char ** argv)
|
|||
if (!(dspBlockNum != 0 && dspBlockNum != blockNum))
|
||||
continue;
|
||||
|
||||
headerDump(h, stdout, 1, rpmTagTable);
|
||||
headerDump(h, stdout, HEADER_DUMP_INLINE, rpmTagTable);
|
||||
fprintf(stdout, "Offset: %d\n", _RECNUM);
|
||||
|
||||
if (dspBlockNum && blockNum > dspBlockNum)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
rpmdbFreeIterator(mi);
|
||||
mi = rpmdbFreeIterator(mi);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -22,8 +22,9 @@ int main(int argc, char **argv)
|
|||
} else {
|
||||
fdi = Fopen(argv[1], "r.ufdio");
|
||||
}
|
||||
if (fdi == NULL || Ferror(fdi)) {
|
||||
perror("input");
|
||||
if (Ferror(fdi)) {
|
||||
fprintf(stderr, "%s: %s: %s\n", argv[0],
|
||||
(argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,8 +21,9 @@ int main(int argc, char **argv)
|
|||
fdi = Fopen(argv[1], "r.ufdio");
|
||||
}
|
||||
|
||||
if (fdi == NULL || Ferror(fdi)) {
|
||||
perror("input");
|
||||
if (Ferror(fdi)) {
|
||||
fprintf(stderr, "%s: %s: %s\n", argv[0],
|
||||
(argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,8 @@ int main(int argc, char **argv)
|
|||
fdi = Fopen(argv[1], "r.ufdio");
|
||||
}
|
||||
if (fdi == NULL || Ferror(fdi)) {
|
||||
perror(argv[1]);
|
||||
fprintf(stderr, "%s: %s: %s\n", argv[0],
|
||||
(argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,8 @@ int main(int argc, char **argv)
|
|||
fdi = Fopen(argv[1], "r.ufdio");
|
||||
}
|
||||
if (Ferror(fdi)) {
|
||||
perror("input");
|
||||
fprintf(stderr, "%s: %s: %s\n", argv[0],
|
||||
(argc == 1 ? "<stdin>" : argv[1]), Fstrerror(fdi));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue