- preliminary abstraction to support per-header methods.
CVS patchset: 4878 CVS date: 2001/06/19 11:38:51
This commit is contained in:
parent
29ea1567e7
commit
c6bd3de937
1
CHANGES
1
CHANGES
|
@ -118,6 +118,7 @@
|
|||
- 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.
|
||||
- preliminary abstraction to support per-header methods.
|
||||
|
||||
4.0 -> 4.0.[12]
|
||||
- add doxygen and lclint annotations most everywhere.
|
||||
|
|
|
@ -359,6 +359,9 @@ INPUT = \
|
|||
@top_srcdir@/lib/fs.c \
|
||||
@top_srcdir@/lib/fsm.c \
|
||||
@top_srcdir@/lib/fsm.h \
|
||||
@top_srcdir@/lib/hdrinline.c \
|
||||
@top_srcdir@/lib/hdrinline.h \
|
||||
@top_srcdir@/lib/hdrproto.h \
|
||||
@top_srcdir@/lib/header.c \
|
||||
@top_srcdir@/lib/header.h \
|
||||
@top_srcdir@/lib/header_internal.c \
|
||||
|
|
|
@ -112,9 +112,9 @@ const char *getGnameS(const char *gname)
|
|||
}
|
||||
/*@=nullderef@*/
|
||||
|
||||
time_t *const getBuildTime(void)
|
||||
int_32 *const getBuildTime(void)
|
||||
{
|
||||
static time_t buildTime[1];
|
||||
static int_32 buildTime[1];
|
||||
|
||||
if (buildTime[0] == 0)
|
||||
buildTime[0] = time(NULL);
|
||||
|
|
|
@ -253,7 +253,7 @@ static int checkForValidArchitectures(Spec spec)
|
|||
* @return 0 if OK
|
||||
*/
|
||||
static int checkForRequired(Header h, const char * NVR)
|
||||
/*@*/
|
||||
/* LCL: parse error here with modifies */
|
||||
{
|
||||
int res = 0;
|
||||
rpmTag * p;
|
||||
|
|
|
@ -126,7 +126,7 @@ void freeNames(void)
|
|||
* Return build time stamp.
|
||||
* @return build time stamp
|
||||
*/
|
||||
/*@observer@*/ time_t * const getBuildTime(void) /*@*/;
|
||||
/*@observer@*/ int_32 * const getBuildTime(void) /*@*/;
|
||||
|
||||
/** \ingroup rpmbuild
|
||||
* Read next line from spec file.
|
||||
|
|
|
@ -1014,7 +1014,7 @@ mint) RPMCANONARCH=m68kmint ;;
|
|||
esac
|
||||
RPMCANONVENDOR="$build_vendor"
|
||||
case "${build_vendor}" in
|
||||
unknown|pc|redhat|pld|mandrake|conectiva)
|
||||
unknown|pc|ibm|redhat|pld|mandrake|conectiva)
|
||||
test -f /etc/redhat-release && RPMCANONVENDOR=redhat
|
||||
test -f /etc/pld-release && RPMCANONVENDOR=pld
|
||||
test -f /etc/mandrake-release && RPMCANONVENDOR=mandrake
|
||||
|
|
|
@ -0,0 +1,245 @@
|
|||
.\" This manpage has been automatically generated by docbook2man
|
||||
.\" from a DocBook document. This tool can be found at:
|
||||
.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>
|
||||
.\" Please send any bug reports, improvements, comments, patches,
|
||||
.\" etc. to Steve Cheng <steve@ggi-project.org>.
|
||||
.TH "RPMBUILD" "8" "06 June 2001" "Red Hat, Inc." "Red Hat Linux"
|
||||
.SH NAME
|
||||
rpmbuild \- Build RPM Package(s)
|
||||
.SH SYNOPSIS
|
||||
.SS "BUILDING PACKAGES:"
|
||||
.PP
|
||||
|
||||
\fBrpmbuild\fR {\fB-ba|-bb|-bp|-bc|-bi|-bl|-bs\fR} [\fBrpmbuild-options\fR] \fB\fISPECFILE\fB\fR\fI ...\fR
|
||||
|
||||
\fBrpmbuild\fR {\fB-ta|-tb|-tp|-tc|-ti|-tl|-ts\fR} [\fBrpmbuild-options\fR] \fB\fITARBALL\fB\fR\fI ...\fR
|
||||
|
||||
\fBrpmbuild\fR {\fB--rebuild|--recompile\fR} \fB\fISOURCEPKG\fB\fR\fI ...\fR
|
||||
|
||||
\fBrpmbuild\fR \fB--tarbuild\fR \fB\fITARBALL\fB\fR\fI ...\fR
|
||||
.SS "MISCELLANEOUS:"
|
||||
.PP
|
||||
|
||||
\fBrpmbuild\fR {\fB--showrc\fR}
|
||||
.SS "RPMBUILD-OPTIONS"
|
||||
.PP
|
||||
|
||||
\fB[--buildroot \fIDIRECTORY\fB] [--clean] [--nobuild] [--rmsource] [--rmspec]
|
||||
[--short-circuit] [--sign] [--target \fIPLATFORM\fB]\fR
|
||||
.SH "DESCRIPTION"
|
||||
.PP
|
||||
\fBrpmbuild\fR is used to build both binary and source software packages.
|
||||
A \fBpackage\fR consists of an archive of files and
|
||||
meta-data used to install and erase the archive files. The meta-data
|
||||
includes helper scripts, file attributes, and descriptive information
|
||||
about the package.
|
||||
\fBPackages\fR come in two varieties: binary packages,
|
||||
used to encapsulate software to be installed, and source packages,
|
||||
containing the source code and recipe necessary to produce binary
|
||||
packages.
|
||||
.PP
|
||||
One of the following basic modes must be selected:
|
||||
\fBBuild Package\fR,
|
||||
\fBBuild Package from Tarball\fR,
|
||||
\fBRecompile Package\fR,
|
||||
\fBShow Configuration\fR.
|
||||
.SS "GENERAL OPTIONS"
|
||||
.PP
|
||||
These options can be used in all the different modes.
|
||||
.TP
|
||||
\fB-?, --help\fR
|
||||
Print a longer usage message then normal.
|
||||
.TP
|
||||
\fB--version\fR
|
||||
Print a single line containing the version number of \fBrpm\fR
|
||||
being used.
|
||||
.TP
|
||||
\fB--quiet\fR
|
||||
Print as little as possible - normally only error messages will
|
||||
be displayed.
|
||||
.TP
|
||||
\fB-v\fR
|
||||
Print verbose information - normally routine progress messages will be
|
||||
displayed.
|
||||
.TP
|
||||
\fB-vv\fR
|
||||
Print lots of ugly debugging information.
|
||||
.TP
|
||||
\fB--rcfile \fIFILELIST\fB\fR
|
||||
Each of the files in the colon separated
|
||||
\fIFILELIST\fR
|
||||
is read sequentially by \fBrpm\fR for configuration
|
||||
information.
|
||||
Only the first file in the list must exist, and tildes will be
|
||||
expanded to the value of \fB$HOME\fR.
|
||||
The default \fIFILELIST\fR is
|
||||
\fI/usr/lib/rpm/rpmrc\fR:\fI/etc/rpmrc\fR:\fI~/.rpmrc\fR.
|
||||
.TP
|
||||
\fB--pipe \fICMD\fB\fR
|
||||
Pipes the output of \fBrpm\fR to the command \fICMD\fR.
|
||||
.TP
|
||||
\fB--dbpath \fIDIRECTORY\fB\fR
|
||||
Use the database in \fIDIRECTORY\fR rathen
|
||||
than the default path \fI/var/lib/rpm\fR
|
||||
.TP
|
||||
\fB--root \fIDIRECTORY\fB\fR
|
||||
Use the system rooted at \fIDIRECTORY\fR for all operations.
|
||||
Note that this means the database will be read or modified under
|
||||
\fIDIRECTORY\fR and any
|
||||
\fB%pre\fR or
|
||||
\fB%post\fR
|
||||
scriptlet(s) are run after a chroot(2) to
|
||||
\fIDIRECTORY\fR.
|
||||
.SS "BUILD OPTIONS"
|
||||
.PP
|
||||
The general form of an rpm build command is
|
||||
.PP
|
||||
\fBrpmbuild\fR {\fB-b\fISTAGE\fB|-t\fISTAGE\fB\fR} [\fBrpmbuild-options\fR] \fB\fIFILE\fB\fR\fI ...\fR
|
||||
.PP
|
||||
The argument used is \fB-b\fR if a spec file is being
|
||||
used to build the package and \fB-t\fR if \fBrpmbuild\fR
|
||||
should look inside of a (possibly compressed) tar file for
|
||||
the spec file to use. After the first argument, the next
|
||||
character (\fISTAGE\fR) specifies the stages
|
||||
of building and packaging to be done and is one of:
|
||||
.TP
|
||||
\fB-ba\fR
|
||||
Build binary and source packages (after doing the %prep, %build, and
|
||||
%install stages).
|
||||
.TP
|
||||
\fB-bb\fR
|
||||
Build a binary package (after doing the %prep, %build, and %install
|
||||
stages).
|
||||
.TP
|
||||
\fB-bp\fR
|
||||
Executes the "%prep" stage from the spec file. Normally this
|
||||
involves unpacking the sources and applying any patches.
|
||||
.TP
|
||||
\fB-bc\fR
|
||||
Do the "%build" stage from the spec file (after doing the %prep stage).
|
||||
This generally involves the equivalent of a "make".
|
||||
.TP
|
||||
\fB-bi\fR
|
||||
Do the "%install" stage from the spec file (after doing the %prep and
|
||||
%build stages). This generally involves the equivalent of a
|
||||
"make install".
|
||||
.TP
|
||||
\fB-bl\fR
|
||||
Do a "list check". The "%files" section from the spec file is
|
||||
macro expanded, and checks are made to verify that each file
|
||||
exists.
|
||||
.TP
|
||||
\fB-bs\fR
|
||||
Build just the source package.
|
||||
.PP
|
||||
The following options may also be used:
|
||||
.TP
|
||||
\fB--buildroot \fIDIRECTORY\fB\fR
|
||||
When building a package, override the BuildRoot tag with directory
|
||||
\fIDIRECTORY\fR.
|
||||
.TP
|
||||
\fB--clean\fR
|
||||
Remove the build tree after the packages are made.
|
||||
.TP
|
||||
\fB--nobuild\fR
|
||||
Do not execute any build stages. Useful for testing out spec files.
|
||||
.TP
|
||||
\fB--rmsource\fR
|
||||
Remove the sources after the build (may also be
|
||||
used standalone, e.g. "\fBrpmbuild\fR \fB--rmsource foo.spec\fR").
|
||||
.TP
|
||||
\fB--rmspec\fR
|
||||
Remove the spec file after the build (may also be
|
||||
used standalone, eg. "\fBrpmbuild\fR \fB--rmspec foo.spec\fR").
|
||||
.TP
|
||||
\fB--short-circuit\fR
|
||||
Skip straight to specified stage (i.e., skip all stages leading
|
||||
up to the specified stage). Only valid with \fB-bc\fR
|
||||
and \fB-bi\fR.
|
||||
.TP
|
||||
\fB--sign\fR
|
||||
Embed a GPG signature in the package. This signature can be used
|
||||
to verify the integrity and the origin of the package. See the
|
||||
section on GPG SIGNATURES for configuration details.
|
||||
.TP
|
||||
\fB--target \fIPLATFORM\fB\fR
|
||||
When building the package, interpret \fIPLATFORM\fR
|
||||
as \fBarch-vendor-os\fR and set the macros
|
||||
\fB%_target\fR,
|
||||
\fB%_target_arch\fR, and
|
||||
\fB%_target_os\fR
|
||||
accordingly.
|
||||
.SS "REBUILD AND RECOMPILE OPTIONS"
|
||||
.PP
|
||||
There are two other ways to invoke building with rpm:
|
||||
.PP
|
||||
\fBrpmbuild\fR {\fB--rebuild|--recompile\fR} \fB\fISOURCEPKG\fB\fR\fI ...\fR
|
||||
.PP
|
||||
When invoked this way, \fBrpmbuild\fR installs the named source
|
||||
package, and does a prep, compile and install. In addition,
|
||||
\fB--rebuild\fR builds a new binary package. When the build
|
||||
has completed, the build directory is removed (as in
|
||||
\fB--clean\fR) and the the sources and spec file for
|
||||
the package are removed.
|
||||
.SS "SHOWRC"
|
||||
.PP
|
||||
The command
|
||||
.PP
|
||||
\fBrpmbuild\fR \fB--showrc\fR
|
||||
.PP
|
||||
shows the values \fBrpmbuild\fR will use for all of the
|
||||
options are currently set in
|
||||
\fIrpmrc\fR and
|
||||
\fImacros\fR
|
||||
configuration file(s).
|
||||
.SH "FILES"
|
||||
.PP
|
||||
|
||||
\fI/usr/lib/rpm/rpmrc\fR
|
||||
|
||||
\fI/etc/rpmrc\fR
|
||||
|
||||
\fI~/.rpmrc\fR
|
||||
|
||||
\fI/usr/lib/rpm/macros\fR
|
||||
|
||||
\fI/etc/rpm/macros\fR
|
||||
|
||||
\fI~/.rpmmacros\fR
|
||||
|
||||
\fI/var/lib/rpm/Conflictname\fR
|
||||
|
||||
\fI/var/lib/rpm/Basenames\fR
|
||||
|
||||
\fI/var/lib/rpm/Group\fR
|
||||
|
||||
\fI/var/lib/rpm/Name\fR
|
||||
|
||||
\fI/var/lib/rpm/Packages\fR
|
||||
|
||||
\fI/var/lib/rpm/Providename\fR
|
||||
|
||||
\fI/var/lib/rpm/Requirename\fR
|
||||
|
||||
\fI/var/lib/rpm/Triggername\fR
|
||||
|
||||
\fI/var/tmp/rpm*\fR
|
||||
.SH "SEE ALSO"
|
||||
|
||||
\fBpopt\fR(3),
|
||||
|
||||
\fBrpm2cpio\fR(8),
|
||||
|
||||
\fBgendiff\fR(1),
|
||||
|
||||
\fBrpm\fR(8),
|
||||
|
||||
\fB http://www.rpm.org/ <URL:http://www.rpm.org/>
|
||||
\fR
|
||||
.SH "AUTHORS"
|
||||
|
||||
Marc Ewing <marc@redhat.com>
|
||||
|
||||
Jeff Johnson <jbj@redhat.com>
|
||||
|
||||
Erik Troan <ewt@redhat.com>
|
|
@ -14,7 +14,8 @@ EXTRA_DIST = getdate.y
|
|||
|
||||
pkgincdir = $(pkgincludedir)
|
||||
pkginc_HEADERS = \
|
||||
header.h misc.h rpmcli.h rpmlib.h stringbuf.h
|
||||
header.h hdrinline.h hdrproto.h \
|
||||
misc.h rpmcli.h rpmlib.h stringbuf.h
|
||||
noinst_HEADERS = \
|
||||
cpio.h depends.h fsm.h header_internal.h \
|
||||
manifest.h md5.h psm.h \
|
||||
|
@ -32,7 +33,8 @@ LIBS =
|
|||
lib_LTLIBRARIES = librpm.la
|
||||
librpm_la_SOURCES = \
|
||||
cpio.c depends.c formats.c fs.c fsm.c getdate.c \
|
||||
header.c header_internal.c manifest.c md5.c md5sum.c misc.c package.c \
|
||||
header.c hdrinline.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 rpmvercmp.c \
|
||||
signature.c stringbuf.c tagName.c tagtable.c transaction.c \
|
||||
|
|
|
@ -0,0 +1,383 @@
|
|||
/** \ingroup header
|
||||
* \file lib/hdrinline.c
|
||||
*/
|
||||
|
||||
#include "system.h"
|
||||
|
||||
#include <header_internal.h>
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
int _hdrinline_debug = 0;
|
||||
|
||||
/*@access Header @*/
|
||||
/*@access entryInfo @*/
|
||||
/*@access indexEntry @*/
|
||||
|
||||
/*@access extensionCache @*/
|
||||
/*@access sprintfTag @*/
|
||||
/*@access sprintfToken @*/
|
||||
|
||||
/**
|
||||
* Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
|
||||
* @param p memory to free
|
||||
* @return NULL always
|
||||
*/
|
||||
/*@unused@*/ static inline /*@null@*/ void *
|
||||
_free(/*@only@*/ /*@null@*/ const void * p) /*@modifies *p @*/
|
||||
{
|
||||
if (p != NULL) free((void *)p);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Header headerNew()
|
||||
{
|
||||
Header h = xcalloc(1, sizeof(*h));
|
||||
|
||||
/*@-assignexpose@*/
|
||||
h->hv = hv; /* structure assignment */
|
||||
/*@=assignexpose@*/
|
||||
h->indexAlloced = INDEX_MALLOC_SIZE;
|
||||
h->indexUsed = 0;
|
||||
h->region_allocated = 0;
|
||||
h->sorted = 1;
|
||||
h->legacy = 0;
|
||||
h->nrefs = 1;
|
||||
|
||||
h->index = (h->indexAlloced
|
||||
? xcalloc(h->indexAlloced, sizeof(*h->index))
|
||||
: NULL);
|
||||
|
||||
/*@-globstate@*/
|
||||
return h;
|
||||
/*@=globstate@*/
|
||||
}
|
||||
|
||||
Header headerLoad(void * uh)
|
||||
{
|
||||
int_32 * ei = (int_32 *) uh;
|
||||
int_32 il = ntohl(ei[0]); /* index length */
|
||||
int_32 dl = ntohl(ei[1]); /* data length */
|
||||
int pvlen = sizeof(il) + sizeof(dl) +
|
||||
(il * sizeof(struct entryInfo)) + dl;
|
||||
void * pv = uh;
|
||||
Header h = xcalloc(1, sizeof(*h));
|
||||
entryInfo pe;
|
||||
char * dataStart;
|
||||
indexEntry entry;
|
||||
int rdlen;
|
||||
int i;
|
||||
|
||||
ei = (int_32 *) pv;
|
||||
/*@-castexpose@*/
|
||||
pe = (entryInfo) &ei[2];
|
||||
/*@=castexpose@*/
|
||||
dataStart = (char *) (pe + il);
|
||||
|
||||
/*@-assignexpose@*/
|
||||
h->hv = hv; /* structure assignment */
|
||||
/*@=assignexpose@*/
|
||||
h->indexAlloced = il + 1;
|
||||
h->indexUsed = il;
|
||||
h->index = xcalloc(h->indexAlloced, sizeof(*h->index));
|
||||
h->sorted = 1;
|
||||
h->region_allocated = 0;
|
||||
h->nrefs = 1;
|
||||
|
||||
/*
|
||||
* XXX XFree86-libs, ash, and pdksh from Red Hat 5.2 have bogus
|
||||
* %verifyscript tag that needs to be diddled.
|
||||
*/
|
||||
if (ntohl(pe->tag) == 15 &&
|
||||
ntohl(pe->type) == RPM_STRING_TYPE &&
|
||||
ntohl(pe->count) == 1)
|
||||
{
|
||||
pe->tag = htonl(1079);
|
||||
}
|
||||
|
||||
entry = h->index;
|
||||
i = 0;
|
||||
if (!(htonl(pe->tag) < HEADER_I18NTABLE)) {
|
||||
h->legacy = 1;
|
||||
entry->info.type = REGION_TAG_TYPE;
|
||||
entry->info.tag = HEADER_IMAGE;
|
||||
entry->info.count = REGION_TAG_COUNT;
|
||||
entry->info.offset = ((char *)pe - dataStart); /* negative offset */
|
||||
|
||||
/*@-assignexpose@*/
|
||||
entry->data = pe;
|
||||
/*@=assignexpose@*/
|
||||
entry->length = pvlen - sizeof(il) - sizeof(dl);
|
||||
rdlen = regionSwab(entry+1, il, 0, pe, dataStart, entry->info.offset);
|
||||
if (rdlen != dl) goto errxit;
|
||||
entry->rdlen = rdlen;
|
||||
entry++;
|
||||
h->indexUsed++;
|
||||
} else {
|
||||
int nb = ntohl(pe->count);
|
||||
int_32 rdl;
|
||||
int_32 ril;
|
||||
|
||||
h->legacy = 0;
|
||||
entry->info.type = htonl(pe->type);
|
||||
if (entry->info.type < RPM_MIN_TYPE || entry->info.type > RPM_MAX_TYPE)
|
||||
goto errxit;
|
||||
entry->info.count = htonl(pe->count);
|
||||
|
||||
{ int off = ntohl(pe->offset);
|
||||
if (off) {
|
||||
int_32 * stei = memcpy(alloca(nb), dataStart + off, nb);
|
||||
rdl = -ntohl(stei[2]); /* negative offset */
|
||||
ril = rdl/sizeof(*pe);
|
||||
entry->info.tag = htonl(pe->tag);
|
||||
} else {
|
||||
ril = il;
|
||||
rdl = (ril * sizeof(struct entryInfo));
|
||||
entry->info.tag = HEADER_IMAGE;
|
||||
}
|
||||
}
|
||||
entry->info.offset = -rdl; /* negative offset */
|
||||
|
||||
/*@-assignexpose@*/
|
||||
entry->data = pe;
|
||||
/*@=assignexpose@*/
|
||||
entry->length = pvlen - sizeof(il) - sizeof(dl);
|
||||
rdlen = regionSwab(entry+1, ril-1, 0, pe+1, dataStart, entry->info.offset);
|
||||
if (rdlen < 0) goto errxit;
|
||||
entry->rdlen = rdlen;
|
||||
|
||||
if (ril < h->indexUsed) {
|
||||
indexEntry newEntry = entry + ril;
|
||||
int ne = (h->indexUsed - ril);
|
||||
int rid = entry->info.offset+1;
|
||||
int rc;
|
||||
|
||||
/* Load dribble entries from region. */
|
||||
rc = regionSwab(newEntry, ne, 0, pe+ril, dataStart, rid);
|
||||
if (rc < 0) goto errxit;
|
||||
rdlen += rc;
|
||||
|
||||
{ indexEntry firstEntry = newEntry;
|
||||
int save = h->indexUsed;
|
||||
int j;
|
||||
|
||||
/* Dribble entries replace duplicate region entries. */
|
||||
h->indexUsed -= ne;
|
||||
for (j = 0; j < ne; j++, newEntry++) {
|
||||
(void) headerRemoveEntry(h, newEntry->info.tag);
|
||||
if (newEntry->info.tag == HEADER_BASENAMES)
|
||||
(void) headerRemoveEntry(h, HEADER_OLDFILENAMES);
|
||||
}
|
||||
|
||||
/* If any duplicate entries were replaced, move new entries down. */
|
||||
if (h->indexUsed < (save - ne)) {
|
||||
memmove(h->index + h->indexUsed, firstEntry,
|
||||
(ne * sizeof(*entry)));
|
||||
}
|
||||
h->indexUsed += ne;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h->sorted = 0;
|
||||
headerSort(h);
|
||||
|
||||
/*@-globstate@*/
|
||||
return h;
|
||||
/*@=globstate@*/
|
||||
|
||||
errxit:
|
||||
/*@-usereleased@*/
|
||||
if (h) {
|
||||
h->index = _free(h->index);
|
||||
/*@-refcounttrans@*/
|
||||
h = _free(h);
|
||||
/*@=refcounttrans@*/
|
||||
}
|
||||
/*@=usereleased@*/
|
||||
/*@-refcounttrans -globstate@*/
|
||||
return h;
|
||||
/*@=refcounttrans =globstate@*/
|
||||
}
|
||||
|
||||
int headerWrite(FD_t fd, Header h, enum hMagic magicp)
|
||||
{
|
||||
ssize_t nb;
|
||||
int length;
|
||||
const void * uh;
|
||||
|
||||
if (h == NULL)
|
||||
return 1;
|
||||
uh = doHeaderUnload(h, &length);
|
||||
if (uh == NULL)
|
||||
return 1;
|
||||
switch (magicp) {
|
||||
case HEADER_MAGIC_YES:
|
||||
nb = Fwrite(header_magic, sizeof(char), sizeof(header_magic), fd);
|
||||
if (nb != sizeof(header_magic))
|
||||
goto exit;
|
||||
break;
|
||||
case HEADER_MAGIC_NO:
|
||||
break;
|
||||
}
|
||||
|
||||
nb = Fwrite(uh, sizeof(char), length, fd);
|
||||
|
||||
exit:
|
||||
uh = _free(uh);
|
||||
return (nb == length ? 0 : 1);
|
||||
}
|
||||
|
||||
Header headerCopyLoad(void * uh)
|
||||
{
|
||||
int_32 * ei = (int_32 *) uh;
|
||||
int_32 il = ntohl(ei[0]); /* index length */
|
||||
int_32 dl = ntohl(ei[1]); /* data length */
|
||||
int pvlen = sizeof(il) + sizeof(dl) +
|
||||
(il * sizeof(struct entryInfo)) + dl;
|
||||
void * nuh = memcpy(xmalloc(pvlen), uh, pvlen);
|
||||
Header h;
|
||||
|
||||
h = headerLoad(nuh);
|
||||
if (h == NULL) {
|
||||
nuh = _free(nuh);
|
||||
return h;
|
||||
}
|
||||
h->region_allocated = 1;
|
||||
return h;
|
||||
}
|
||||
|
||||
Header headerRead(FD_t fd, enum hMagic magicp)
|
||||
{
|
||||
int_32 block[4];
|
||||
int_32 reserved;
|
||||
int_32 * ei = NULL;
|
||||
int_32 il;
|
||||
int_32 dl;
|
||||
int_32 magic;
|
||||
Header h = NULL;
|
||||
int len;
|
||||
int i;
|
||||
|
||||
memset(block, 0, sizeof(block));
|
||||
i = 2;
|
||||
if (magicp == HEADER_MAGIC_YES)
|
||||
i += 2;
|
||||
|
||||
if (timedRead(fd, (char *)block, i*sizeof(*block)) != (i * sizeof(*block)))
|
||||
goto exit;
|
||||
|
||||
i = 0;
|
||||
|
||||
if (magicp == HEADER_MAGIC_YES) {
|
||||
magic = block[i++];
|
||||
if (memcmp(&magic, header_magic, sizeof(magic)))
|
||||
goto exit;
|
||||
reserved = block[i++];
|
||||
}
|
||||
|
||||
il = ntohl(block[i++]);
|
||||
dl = ntohl(block[i++]);
|
||||
|
||||
len = sizeof(il) + sizeof(dl) + (il * sizeof(struct entryInfo)) + dl;
|
||||
|
||||
/*
|
||||
* XXX Limit total size of header to 32Mb (~16 times largest known size).
|
||||
*/
|
||||
if (len > (32*1024*1024))
|
||||
goto exit;
|
||||
|
||||
ei = xmalloc(len);
|
||||
ei[0] = htonl(il);
|
||||
ei[1] = htonl(dl);
|
||||
len -= sizeof(il) + sizeof(dl);
|
||||
|
||||
if (timedRead(fd, (char *)&ei[2], len) != len)
|
||||
goto exit;
|
||||
|
||||
h = headerLoad(ei);
|
||||
|
||||
exit:
|
||||
if (h) {
|
||||
if (h->region_allocated)
|
||||
ei = _free(ei);
|
||||
h->region_allocated = 1;
|
||||
} else if (ei)
|
||||
ei = _free(ei);
|
||||
return h;
|
||||
}
|
||||
|
||||
void headerCopyTags(Header headerFrom, Header headerTo, hTAG_t tagstocopy)
|
||||
{
|
||||
int * p;
|
||||
|
||||
if (headerFrom == headerTo)
|
||||
return;
|
||||
|
||||
for (p = tagstocopy; *p != 0; p++) {
|
||||
char *s;
|
||||
int_32 type;
|
||||
int_32 count;
|
||||
if (headerIsEntry(headerTo, *p))
|
||||
continue;
|
||||
if (!headerGetEntryMinMemory(headerFrom, *p, &type,
|
||||
(hPTR_t *) &s, &count))
|
||||
continue;
|
||||
(void) headerAddEntry(headerTo, *p, type, s, count);
|
||||
s = headerFreeData(s, type);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Header tag iterator data structure.
|
||||
*/
|
||||
struct headerIteratorS {
|
||||
/*@unused@*/ Header h; /*!< Header being iterated. */
|
||||
/*@unused@*/ int next_index; /*!< Next tag index. */
|
||||
};
|
||||
|
||||
void headerFreeIterator(HeaderIterator hi)
|
||||
{
|
||||
hi->h = headerFree(hi->h);
|
||||
hi = _free(hi);
|
||||
}
|
||||
|
||||
HeaderIterator headerInitIterator(Header h)
|
||||
{
|
||||
HeaderIterator hi = xmalloc(sizeof(struct headerIteratorS));
|
||||
|
||||
headerSort(h);
|
||||
|
||||
hi->h = headerLink(h);
|
||||
hi->next_index = 0;
|
||||
return hi;
|
||||
}
|
||||
|
||||
int headerNextIterator(HeaderIterator hi,
|
||||
hTAG_t tag, hTYP_t type, hPTR_t * p, hCNT_t c)
|
||||
{
|
||||
Header h = hi->h;
|
||||
int slot = hi->next_index;
|
||||
indexEntry entry = NULL;
|
||||
int rc;
|
||||
|
||||
for (slot = hi->next_index; slot < h->indexUsed; slot++) {
|
||||
entry = h->index + slot;
|
||||
if (!ENTRY_IS_REGION(entry))
|
||||
break;
|
||||
}
|
||||
hi->next_index = slot;
|
||||
if (entry == NULL || slot >= h->indexUsed)
|
||||
return 0;
|
||||
/*@-noeffect@*/ /* LCL: no clue */
|
||||
hi->next_index++;
|
||||
/*@=noeffect@*/
|
||||
|
||||
if (tag)
|
||||
*tag = entry->info.tag;
|
||||
|
||||
rc = copyEntry(entry, type, p, c, 0);
|
||||
|
||||
/* XXX 1 on success */
|
||||
return ((rc == 1) ? 1 : 0);
|
||||
}
|
|
@ -0,0 +1,353 @@
|
|||
#ifndef H_HDRINLINE
|
||||
#define H_HDRINLINE
|
||||
|
||||
/** \ingroup header
|
||||
* \file lib/hdrinline.h
|
||||
*/
|
||||
|
||||
/*@-exportlocal@*/
|
||||
extern int _hdrinline_debug;
|
||||
/*@=exportlocal@*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/*@+voidabstract -nullpass -abstract -mustmod -compdef -shadow -predboolothers @*/
|
||||
|
||||
#define HV(_h) ((HV_t *)(_h))
|
||||
|
||||
/** \ingroup header
|
||||
* Dereference a header instance.
|
||||
* @param h header
|
||||
* @return NULL always
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
/*@null@*/ Header headerFree( /*@null@*/ /*@killref@*/ Header h)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
if (h == NULL) return NULL;
|
||||
return (HV(h)->free) (h);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Reference a header instance.
|
||||
* @param h header
|
||||
* @return referenced header instance
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
Header headerLink(Header h)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->link) (h);
|
||||
}
|
||||
|
||||
/*@-exportlocal@*/
|
||||
/** \ingroup header
|
||||
* Sort tags in header.
|
||||
* @param h header
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
void headerSort(Header h)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->sort) (h);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Restore tags in header to original ordering.
|
||||
* @param h header
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
void headerUnsort(Header h)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->unsort) (h);
|
||||
}
|
||||
/*@=exportlocal@*/
|
||||
|
||||
/** \ingroup header
|
||||
* Return size of on-disk header representation in bytes.
|
||||
* @param h header
|
||||
* @param magicp include size of 8 bytes for (magic, 0)?
|
||||
* @return size of on-disk header
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
unsigned int headerSizeof(/*@null@*/ Header h, enum hMagic magicp)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
if (h == NULL) return 0;
|
||||
return (HV(h)->size) (h, magicp);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Convert header to on-disk representation.
|
||||
* @param h header (with pointers)
|
||||
* @return on-disk header blob (i.e. with offsets)
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
/*@only@*/ /*@null@*/ void * headerUnload(Header h)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->unload) (h);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Convert header to on-disk representation, and then reload.
|
||||
* This is used to insure that all header data is in one chunk.
|
||||
* @param h header (with pointers)
|
||||
* @param tag region tag
|
||||
* @return on-disk header (with offsets)
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
/*@null@*/ Header headerReload(/*@only@*/ Header h, int tag)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->reload) (h, tag);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Duplicate a header.
|
||||
* @param h header
|
||||
* @return new header instance
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
/*@null@*/ Header headerCopy(Header h)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->copy) (h);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Check if tag is in header.
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
int headerIsEntry(/*@null@*/Header h, int_32 tag)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
if (h == NULL) return 0;
|
||||
return (HV(h)->isentry) (h, tag);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Retrieve tag value.
|
||||
* Will never return RPM_I18NSTRING_TYPE! RPM_STRING_TYPE elements with
|
||||
* RPM_I18NSTRING_TYPE equivalent entries are translated (if HEADER_I18NTABLE
|
||||
* entry is present).
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @retval type address of tag value data type (or NULL)
|
||||
* @retval p address of pointer to tag value(s) (or NULL)
|
||||
* @retval c address of number of values (or NULL)
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
int headerGetEntry(Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ void ** p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c)
|
||||
/*@modifies *type, *p, *c @*/
|
||||
{
|
||||
return (HV(h)->get) (h, tag, type, p, c);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Retrieve tag value using header internal array.
|
||||
* Get an entry using as little extra RAM as possible to return the tag value.
|
||||
* This is only an issue for RPM_STRING_ARRAY_TYPE.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @retval type address of tag value data type (or NULL)
|
||||
* @retval p address of pointer to tag value(s) (or NULL)
|
||||
* @retval c address of number of values (or NULL)
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
int headerGetEntryMinMemory(Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ hPTR_t * p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c)
|
||||
/*@modifies *type, *p, *c @*/
|
||||
{
|
||||
return (HV(h)->getmin) (h, tag, type, p, c);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Retrieve tag value with type match.
|
||||
* If *type is RPM_NULL_TYPE any type will match, otherwise only *type will
|
||||
* match.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @retval type address of tag value data type (or NULL)
|
||||
* @retval p address of pointer to tag value(s) (or NULL)
|
||||
* @retval c address of number of values (or NULL)
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@-exportlocal@*/
|
||||
/*@unused@*/ static inline
|
||||
int headerGetRawEntry(Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ hPTR_t * p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c)
|
||||
/*@modifies *type, *p, *c @*/
|
||||
{
|
||||
return (HV(h)->getraw) (h, tag, type, p, c);
|
||||
}
|
||||
/*@=exportlocal@*/
|
||||
|
||||
/** \ingroup header
|
||||
* Add tag to header.
|
||||
* Duplicate tags are okay, but only defined for iteration (with the
|
||||
* exceptions noted below). While you are allowed to add i18n string
|
||||
* arrays through this function, you probably don't mean to. See
|
||||
* headerAddI18NString() instead.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@mayexit@*/
|
||||
/*@unused@*/ static inline
|
||||
int headerAddEntry(Header h, int_32 tag, int_32 type, const void * p, int_32 c)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->add) (h, tag, type, p, c);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Append element to tag array in header.
|
||||
* Appends item p to entry w/ tag and type as passed. Won't work on
|
||||
* RPM_STRING_TYPE. Any pointers into header memory returned from
|
||||
* headerGetEntryMinMemory() for this entry are invalid after this
|
||||
* call has been made!
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
int headerAppendEntry(Header h, int_32 tag, int_32 type,
|
||||
const void * p, int_32 c)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->append) (h, tag, type, p, c);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Add or append element to tag array in header.
|
||||
* @todo Arg "p" should have const.
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
int headerAddOrAppendEntry(Header h, int_32 tag, int_32 type,
|
||||
const void * p, int_32 c)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->addorappend) (h, tag, type, p, c);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Add locale specific tag to header.
|
||||
* A NULL lang is interpreted as the C locale. Here are the rules:
|
||||
* \verbatim
|
||||
* - If the tag isn't in the header, it's added with the passed string
|
||||
* as new value.
|
||||
* - If the tag occurs multiple times in entry, which tag is affected
|
||||
* by the operation is undefined.
|
||||
* - If the tag is in the header w/ this language, the entry is
|
||||
* *replaced* (like headerModifyEntry()).
|
||||
* \endverbatim
|
||||
* This function is intended to just "do the right thing". If you need
|
||||
* more fine grained control use headerAddEntry() and headerModifyEntry().
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param string tag value
|
||||
* @param lang locale
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
int headerAddI18NString(Header h, int_32 tag, const char * string,
|
||||
const char * lang)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->addi18n) (h, tag, string, lang);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Modify tag in header.
|
||||
* If there are multiple entries with this tag, the first one gets replaced.
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
int headerModifyEntry(Header h, int_32 tag, int_32 type,
|
||||
const void * p, int_32 c)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->modify) (h, tag, type, p, c);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Delete tag in header.
|
||||
* Removes all entries of type tag from the header, returns 1 if none were
|
||||
* found.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @return 0 on success, 1 on failure (INCONSISTENT)
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
int headerRemoveEntry(Header h, int_32 tag)
|
||||
/*@modifies h @*/
|
||||
{
|
||||
return (HV(h)->remove) (h, tag);
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Return formatted output string from header tags.
|
||||
* The returned string must be free()d.
|
||||
*
|
||||
* @param h header
|
||||
* @param fmt format to use
|
||||
* @param tags array of tag name/value pairs
|
||||
* @param extensions chained table of formatting extensions.
|
||||
* @retval errmsg error message (if any)
|
||||
* @return formatted output string (malloc'ed)
|
||||
*/
|
||||
/*@unused@*/ static inline
|
||||
/*@only@*/ char * headerSprintf(Header h, const char * fmt,
|
||||
const struct headerTagTableEntry * tags,
|
||||
const struct headerSprintfExtension * extensions,
|
||||
/*@null@*/ /*@out@*/ errmsg_t * errmsg)
|
||||
/*@modifies *errmsg @*/
|
||||
{
|
||||
return (HV(h)->sprintf) (h, fmt, tags, extensions, errmsg);
|
||||
}
|
||||
/*@=voidabstract =nullpass =abstract =mustmod =compdef =shadow =predboolothers @*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* H_HDRINLINE */
|
|
@ -0,0 +1,266 @@
|
|||
#ifndef H_HDRPROTO
|
||||
#define H_HDRPROTO
|
||||
|
||||
/** \ingroup header
|
||||
* \file lib/hdrproto.h
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** \ingroup header
|
||||
* Dereference a header instance.
|
||||
* @param h header
|
||||
* @return NULL always
|
||||
*/
|
||||
/*@null@*/ Header headerFree( /*@null@*/ /*@killref@*/ Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Reference a header instance.
|
||||
* @param h header
|
||||
* @return referenced header instance
|
||||
*/
|
||||
Header headerLink(Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/*@-exportlocal@*/
|
||||
/** \ingroup header
|
||||
* Sort tags in header.
|
||||
* @param h header
|
||||
*/
|
||||
void headerSort(Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Restore tags in header to original ordering.
|
||||
* @param h header
|
||||
*/
|
||||
void headerUnsort(Header h)
|
||||
/*@modifies h @*/;
|
||||
/*@=exportlocal@*/
|
||||
|
||||
/** \ingroup header
|
||||
* Return size of on-disk header representation in bytes.
|
||||
* @param h header
|
||||
* @param magicp include size of 8 bytes for (magic, 0)?
|
||||
* @return size of on-disk header
|
||||
*/
|
||||
unsigned int headerSizeof(/*@null@*/ Header h, enum hMagic magicp)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Convert header to on-disk representation.
|
||||
* @param h header (with pointers)
|
||||
* @return on-disk header blob (i.e. with offsets)
|
||||
*/
|
||||
/*@only@*/ /*@null@*/ void * headerUnload(Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Convert header to on-disk representation, and then reload.
|
||||
* This is used to insure that all header data is in one chunk.
|
||||
* @param h header (with pointers)
|
||||
* @param tag region tag
|
||||
* @return on-disk header (with offsets)
|
||||
*/
|
||||
/*@null@*/ Header headerReload(/*@only@*/ Header h, int tag)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Duplicate a header.
|
||||
* @param h header
|
||||
* @return new header instance
|
||||
*/
|
||||
/*@null@*/ Header headerCopy(Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Check if tag is in header.
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerIsEntry(/*@null@*/Header h, int_32 tag)
|
||||
/*@*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Retrieve tag value.
|
||||
* Will never return RPM_I18NSTRING_TYPE! RPM_STRING_TYPE elements with
|
||||
* RPM_I18NSTRING_TYPE equivalent entries are translated (if HEADER_I18NTABLE
|
||||
* entry is present).
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @retval type address of tag value data type (or NULL)
|
||||
* @retval p address of pointer to tag value(s) (or NULL)
|
||||
* @retval c address of number of values (or NULL)
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerGetEntry(Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ void ** p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Retrieve tag value using header internal array.
|
||||
* Get an entry using as little extra RAM as possible to return the tag value.
|
||||
* This is only an issue for RPM_STRING_ARRAY_TYPE.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @retval type address of tag value data type (or NULL)
|
||||
* @retval p address of pointer to tag value(s) (or NULL)
|
||||
* @retval c address of number of values (or NULL)
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerGetEntryMinMemory(Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ hPTR_t * p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Retrieve tag value with type match.
|
||||
* If *type is RPM_NULL_TYPE any type will match, otherwise only *type will
|
||||
* match.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @retval type address of tag value data type (or NULL)
|
||||
* @retval p address of pointer to tag value(s) (or NULL)
|
||||
* @retval c address of number of values (or NULL)
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@-exportlocal@*/
|
||||
int headerGetRawEntry(Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ hPTR_t * p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
/*@=exportlocal@*/
|
||||
|
||||
/** \ingroup header
|
||||
* Add tag to header.
|
||||
* Duplicate tags are okay, but only defined for iteration (with the
|
||||
* exceptions noted below). While you are allowed to add i18n string
|
||||
* arrays through this function, you probably don't mean to. See
|
||||
* headerAddI18NString() instead.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@mayexit@*/
|
||||
int headerAddEntry(Header h, int_32 tag, int_32 type, const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Append element to tag array in header.
|
||||
* Appends item p to entry w/ tag and type as passed. Won't work on
|
||||
* RPM_STRING_TYPE. Any pointers into header memory returned from
|
||||
* headerGetEntryMinMemory() for this entry are invalid after this
|
||||
* call has been made!
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerAppendEntry(Header h, int_32 tag, int_32 type,
|
||||
const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Add or append element to tag array in header.
|
||||
* @todo Arg "p" should have const.
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerAddOrAppendEntry(Header h, int_32 tag, int_32 type,
|
||||
const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Add locale specific tag to header.
|
||||
* A NULL lang is interpreted as the C locale. Here are the rules:
|
||||
* \verbatim
|
||||
* - If the tag isn't in the header, it's added with the passed string
|
||||
* as new value.
|
||||
* - If the tag occurs multiple times in entry, which tag is affected
|
||||
* by the operation is undefined.
|
||||
* - If the tag is in the header w/ this language, the entry is
|
||||
* *replaced* (like headerModifyEntry()).
|
||||
* \endverbatim
|
||||
* This function is intended to just "do the right thing". If you need
|
||||
* more fine grained control use headerAddEntry() and headerModifyEntry().
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param string tag value
|
||||
* @param lang locale
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerAddI18NString(Header h, int_32 tag, const char * string,
|
||||
const char * lang)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Modify tag in header.
|
||||
* If there are multiple entries with this tag, the first one gets replaced.
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerModifyEntry(Header h, int_32 tag, int_32 type,
|
||||
const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Delete tag in header.
|
||||
* Removes all entries of type tag from the header, returns 1 if none were
|
||||
* found.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @return 0 on success, 1 on failure (INCONSISTENT)
|
||||
*/
|
||||
int headerRemoveEntry(Header h, int_32 tag)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Return formatted output string from header tags.
|
||||
* The returned string must be free()d.
|
||||
*
|
||||
* @param h header
|
||||
* @param fmt format to use
|
||||
* @param tags array of tag name/value pairs
|
||||
* @param extensions chained table of formatting extensions.
|
||||
* @retval errmsg error message (if any)
|
||||
* @return formatted output string (malloc'ed)
|
||||
*/
|
||||
/*@only@*/ char * headerSprintf(Header h, const char * fmt,
|
||||
const struct headerTagTableEntry * tags,
|
||||
const struct headerSprintfExtension * extensions,
|
||||
/*@null@*/ /*@out@*/ errmsg_t * errmsg)
|
||||
/*@modifies *errmsg @*/;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* H_HDRPROTO */
|
1241
lib/header.c
1241
lib/header.c
File diff suppressed because it is too large
Load Diff
652
lib/header.h
652
lib/header.h
|
@ -17,16 +17,16 @@
|
|||
* - Support for version 1 headers was removed in rpm-4.0.
|
||||
*
|
||||
* - version 2
|
||||
* - (Before my time, sorry.)
|
||||
* - @todo Document version2 headers.
|
||||
*
|
||||
* - version 3 (added in rpm-3.0)
|
||||
* - added RPM_I18NSTRING_TYPE as an associative array reference
|
||||
* - Added RPM_I18NSTRING_TYPE as an associative array reference
|
||||
* for i18n locale dependent single element tags (i.e Group).
|
||||
* - added an 8 byte magic string to headers in packages on-disk. The
|
||||
* - Added an 8 byte magic string to headers in packages on-disk. The
|
||||
* magic string was not added to headers in the database.
|
||||
*
|
||||
* - version 4 (added in rpm-4.0)
|
||||
* - represent file names as a (dirname/basename/dirindex) triple
|
||||
* - Represent file names as a (dirname/basename/dirindex) triple
|
||||
* rather than as an absolute path name. Legacy package headers are
|
||||
* converted when the header is read. Legacy database headers are
|
||||
* converted when the database is rebuilt.
|
||||
|
@ -35,7 +35,17 @@
|
|||
* on package provides. Legacy package headers are converted
|
||||
* when the header is read. Legacy database headers are
|
||||
* converted when the database is rebuilt.
|
||||
*
|
||||
* - (rpm-4.0.2) The original package header (and all original
|
||||
* metadata) is preserved in what's called an "immutable header region".
|
||||
* The original header can be retrieved as an RPM_BIN_TYPE, just
|
||||
* like any other tag, and the original header reconstituted using
|
||||
* headerLoad().
|
||||
* - (rpm-4.0.2) The signature tags are added (and renumbered to avoid
|
||||
* tag value collisions) to the package header during package
|
||||
* installation.
|
||||
* - (rpm-4.0.3) A SHA1 digest of the original header is appended
|
||||
* (i.e. detached digest) to the immutable header region to verify
|
||||
* changes to the original header.
|
||||
* .
|
||||
*
|
||||
* \par Development Issues
|
||||
|
@ -43,27 +53,26 @@
|
|||
* Here's a brief description of future features/incompatibilities that
|
||||
* will be added to headers.
|
||||
*
|
||||
* - Signature tags
|
||||
* - Signatures are stored in A header, but not THE header
|
||||
* of a package. That means that signatures are discarded
|
||||
* when a package is installed, preventing verification
|
||||
* of header contents after install. All signature tags
|
||||
* will be added to THE package header so that they are
|
||||
* saved in the rpm database for later retrieval and verification.
|
||||
* Adding signatures to THE header will also permit signatures to
|
||||
* be accessed by Red Hat Network, i.e. retrieval by existing
|
||||
* Python bindings.
|
||||
* - Signature tag values collide with existing rpm tags, and will
|
||||
* have to be renumbered. Part of this renumbering was accomplished
|
||||
* in rpm-4.0, but more remains to be done.
|
||||
* - Signatures, because they involve MD5 and other 1-way hashes on
|
||||
* immutable data, will cause the header to be reconstituted as a
|
||||
* immutable section and a mutable section.
|
||||
* - Private header methods.
|
||||
* - Private methods (e.g. headerLoad(), headerUnload(), etc.) to
|
||||
* permit header data to be manipulated opaquely. Initially
|
||||
* the transaction element file info TFI_t will be used as
|
||||
* proof-of-concept, binary XML will probably be implemented
|
||||
* soon thereafter.
|
||||
* - DSA signature for header metadata.
|
||||
* - The manner in which rpm packages are signed is going to change.
|
||||
* The SHA1 digest in the header will be signed, equivalent to a DSA
|
||||
* digital signature on the original header metadata. As the original
|
||||
* header will contain "trusted" (i.e. because the header is signed
|
||||
* with DSA) file MD5 digests, there will be little or no reason
|
||||
* to sign the payload, but that may happen as well. Note that cpio
|
||||
* headers in the payload are not used to install package metadata,
|
||||
* only the name field in the cpio header is used to associate an
|
||||
* archive file member with the corresponding entry for the file
|
||||
* in header metadata.
|
||||
*/
|
||||
|
||||
/* RPM - Copyright (C) 1995-2000 Red Hat Software */
|
||||
|
||||
/* WARNING: 1 means success, 0 means failure (yes, this is backwards) */
|
||||
/* RPM - Copyright (C) 1995-2001 Red Hat Software */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <rpmio.h>
|
||||
|
@ -94,17 +103,30 @@ typedef unsigned int uint_32;
|
|||
typedef unsigned short uint_16;
|
||||
#endif
|
||||
|
||||
/*@-redef@*/ /* LCL: no clue */
|
||||
/** \ingroup header
|
||||
*/
|
||||
typedef /*@abstract@*/ /*@refcounted@*/ struct headerToken *Header;
|
||||
typedef const char * errmsg_t;
|
||||
|
||||
/** \ingroup header
|
||||
*/
|
||||
typedef /*@abstract@*/ struct headerIteratorS *HeaderIterator;
|
||||
typedef int_32 * hTAG_t;
|
||||
typedef int_32 * hTYP_t;
|
||||
typedef const void * hPTR_t;
|
||||
typedef int_32 * hCNT_t;
|
||||
|
||||
/** \ingroup header
|
||||
*/
|
||||
typedef /*@abstract@*/ /*@refcounted@*/ struct headerToken * Header;
|
||||
|
||||
/** \ingroup header
|
||||
*/
|
||||
typedef /*@abstract@*/ struct headerIteratorS * HeaderIterator;
|
||||
|
||||
/** \ingroup header
|
||||
* Associate tag names with numeric values.
|
||||
*/
|
||||
typedef /*@abstract@*/ struct headerTagTableEntry * headerTagTableEntry;
|
||||
struct headerTagTableEntry {
|
||||
/*@observer@*/ /*@null@*/ const char * name; /*!< Tag name. */
|
||||
int val; /*!< Tag numeric value. */
|
||||
|
@ -146,14 +168,15 @@ typedef /*only@*/ char * (*headerTagFormatFunction)(int_32 type,
|
|||
* @return 0 on success
|
||||
*/
|
||||
typedef int (*headerTagTagFunction) (Header h,
|
||||
/*@null@*/ /*@out@*/ int_32 * type,
|
||||
/*@null@*/ /*@out@*/ const void ** data,
|
||||
/*@null@*/ /*@out@*/ int_32 * count,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ hPTR_t * data,
|
||||
/*@null@*/ /*@out@*/ hCNT_t count,
|
||||
/*@null@*/ /*@out@*/ int * freeData);
|
||||
|
||||
/** \ingroup header
|
||||
* Define header tag output formats.
|
||||
*/
|
||||
typedef /*@abstract@*/ struct headerSprintfExtension * headerSprintfExtension;
|
||||
struct headerSprintfExtension {
|
||||
enum headerSprintfExtenstionType type; /*!< Type of extension. */
|
||||
/*@observer@*/ /*@null@*/ const char * name; /*!< Name of extension. */
|
||||
|
@ -180,341 +203,145 @@ enum hMagic {
|
|||
HEADER_MAGIC_YES = 1
|
||||
};
|
||||
|
||||
/** \ingroup header
|
||||
* Read (and load) header from file handle.
|
||||
* @param fd file handle
|
||||
* @param magicp read (and verify) 8 bytes of (magic, 0)?
|
||||
* @return header (or NULL on error)
|
||||
/**
|
||||
*/
|
||||
/*@null@*/ Header headerRead(FD_t fd, enum hMagic magicp)
|
||||
/*@modifies fd, fileSystem @*/;
|
||||
/*@-typeuse -fielduse@*/
|
||||
typedef union hRET_s {
|
||||
const void * ptr;
|
||||
const char ** argv;
|
||||
const char * str;
|
||||
uint_32 * ui32p;
|
||||
uint_16 * ui16p;
|
||||
int_32 * i32p;
|
||||
int_16 * i16p;
|
||||
int_8 * i8p;
|
||||
} * hRET_t;
|
||||
/*@=typeuse =fielduse@*/
|
||||
|
||||
/** \ingroup header
|
||||
* Write (with unload) header to file handle.
|
||||
* @param fd file handle
|
||||
* @param h header
|
||||
* @param magicp prefix write with 8 bytes of (magic, 0)?
|
||||
* @return 0 on success, 1 on error
|
||||
/**
|
||||
*/
|
||||
int headerWrite(FD_t fd, /*@null@*/ Header h, enum hMagic magicp)
|
||||
/*@modifies fd, h, fileSystem @*/;
|
||||
/*@-typeuse -fielduse@*/
|
||||
typedef struct HE_s {
|
||||
int_32 tag;
|
||||
/*@null@*/ hTYP_t typ;
|
||||
union {
|
||||
/*@null@*/ hPTR_t * ptr;
|
||||
/*@null@*/ hRET_t * ret;
|
||||
} u;
|
||||
/*@null@*/ hCNT_t cnt;
|
||||
} * HE_t;
|
||||
/*@=typeuse =fielduse@*/
|
||||
|
||||
/** \ingroup header
|
||||
* Return size of on-disk header representation in bytes.
|
||||
* @param h header
|
||||
* @param magicp include size of 8 bytes for (magic, 0)?
|
||||
* @return size of on-disk header
|
||||
*/
|
||||
unsigned int headerSizeof(/*@null@*/ Header h, enum hMagic magicp)
|
||||
/*@modifies h @*/;
|
||||
typedef
|
||||
/*@null@*/ Header (*HVfree) (/*@null@*/ /*@killref@*/ Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Convert header to in-memory representation.
|
||||
* @param uh on-disk header blob (i.e. with offsets)
|
||||
* @return header
|
||||
*/
|
||||
/*@-exportlocal@*/
|
||||
/*@null@*/ Header headerLoad(/*@kept@*/ void * uh)
|
||||
/*@modifies uh @*/;
|
||||
/*@=exportlocal@*/
|
||||
typedef
|
||||
Header (*HVlink) (Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Make a copy and convert header to in-memory representation.
|
||||
* @param uh on-disk header blob (i.e. with offsets)
|
||||
* @return header
|
||||
*/
|
||||
/*@null@*/ Header headerCopyLoad(void * uh)
|
||||
/*@modifies uh @*/;
|
||||
typedef
|
||||
void (*HVsort) (Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Convert header to on-disk representation.
|
||||
* @param h header (with pointers)
|
||||
* @return on-disk header blob (i.e. with offsets)
|
||||
*/
|
||||
/*@only@*/ /*@null@*/ void * headerUnload(Header h)
|
||||
/*@modifies h @*/;
|
||||
typedef
|
||||
void (*HVunsort) (Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Convert header to on-disk representation, and then reload.
|
||||
* This is used to insure that all header data is in one chunk.
|
||||
* @param h header (with pointers)
|
||||
* @param tag region tag
|
||||
* @return on-disk header (with offsets)
|
||||
*/
|
||||
/*@null@*/ Header headerReload(/*@only@*/ Header h, int tag)
|
||||
/*@modifies h @*/;
|
||||
typedef
|
||||
unsigned int (*HVsize) (/*@null@*/ Header h, enum hMagic magicp)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Create new (empty) header instance.
|
||||
* @return header
|
||||
*/
|
||||
Header headerNew(void) /*@*/;
|
||||
typedef
|
||||
/*@only@*/ /*@null@*/ void * (*HVunload) (Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Reference a header instance.
|
||||
* @param h header
|
||||
* @return referenced header instance
|
||||
*/
|
||||
Header headerLink(Header h)
|
||||
/*@modifies h @*/;
|
||||
typedef
|
||||
/*@null@*/ Header (*HVreload) (/*@only@*/ Header h, int tag)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Dereference a header instance.
|
||||
* @param h header
|
||||
* @return NULL always
|
||||
*/
|
||||
/*@null@*/ Header headerFree( /*@null@*/ /*@killref@*/ Header h)
|
||||
/*@modifies h @*/;
|
||||
typedef
|
||||
Header (*HVcopy) (Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/*@-redef@*/ /* LCL: no clue */
|
||||
typedef const char * errmsg_t;
|
||||
/*@=redef@*/
|
||||
typedef
|
||||
int (*HVisentry) (/*@null@*/Header h, int_32 tag)
|
||||
/*@*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Return formatted output string from header tags.
|
||||
* The returned string must be free()d.
|
||||
*
|
||||
* @param h header
|
||||
* @param fmt format to use
|
||||
* @param tags array of tag name/value pairs
|
||||
* @param extensions chained table of formatting extensions.
|
||||
* @retval errmsg error message (if any)
|
||||
* @return formatted output string (malloc'ed)
|
||||
*/
|
||||
/*@only@*/ char * headerSprintf(Header h, const char * fmt,
|
||||
typedef
|
||||
int (*HVget) (Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ void ** p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
|
||||
typedef
|
||||
int (*HVgetmin) (Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ hPTR_t * p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
|
||||
typedef
|
||||
int (*HVgetraw) (Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ hPTR_t * p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
|
||||
typedef
|
||||
int (*HVadd) (Header h, int_32 tag, int_32 type, const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
typedef
|
||||
int (*HVappend) (Header h, int_32 tag, int_32 type, const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
typedef
|
||||
int (*HVaddorappend) (Header h, int_32 tag, int_32 type, const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
typedef
|
||||
int (*HVaddi18n) (Header h, int_32 tag, const char * string,
|
||||
const char * lang)
|
||||
/*@modifies h @*/;
|
||||
|
||||
typedef
|
||||
int (*HVmodify) (Header h, int_32 tag, int_32 type, const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
typedef
|
||||
int (*HVremove) (Header h, int_32 tag)
|
||||
/*@modifies h @*/;
|
||||
|
||||
typedef
|
||||
/*@only@*/ char * (*HVsprintf) (Header h, const char * fmt,
|
||||
const struct headerTagTableEntry * tags,
|
||||
const struct headerSprintfExtension * extensions,
|
||||
/*@null@*/ /*@out@*/ errmsg_t * errmsg)
|
||||
/*@modifies *errmsg @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Add tag to header.
|
||||
* Duplicate tags are okay, but only defined for iteration (with the
|
||||
* exceptions noted below). While you are allowed to add i18n string
|
||||
* arrays through this function, you probably don't mean to. See
|
||||
* headerAddI18NString() instead.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@mayexit@*/
|
||||
int headerAddEntry(Header h, int_32 tag, int_32 type, const void *p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Modify tag in header.
|
||||
* If there are multiple entries with this tag, the first one gets replaced.
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerModifyEntry(Header h, int_32 tag, int_32 type,
|
||||
const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Add locale specific tag to header.
|
||||
* A NULL lang is interpreted as the C locale. Here are the rules:
|
||||
* \verbatim
|
||||
* - If the tag isn't in the header, it's added with the passed string
|
||||
* as new value.
|
||||
* - If the tag occurs multiple times in entry, which tag is affected
|
||||
* by the operation is undefined.
|
||||
* - If the tag is in the header w/ this language, the entry is
|
||||
* *replaced* (like headerModifyEntry()).
|
||||
* \endverbatim
|
||||
* This function is intended to just "do the right thing". If you need
|
||||
* more fine grained control use headerAddEntry() and headerModifyEntry().
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param string tag value
|
||||
* @param lang locale
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerAddI18NString(Header h, int_32 tag, const char * string,
|
||||
const char * lang)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Append element to tag array in header.
|
||||
* Appends item p to entry w/ tag and type as passed. Won't work on
|
||||
* RPM_STRING_TYPE. Any pointers into header memory returned from
|
||||
* headerGetEntryMinMemory() for this entry are invalid after this
|
||||
* call has been made!
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerAppendEntry(Header h, int_32 tag, int_32 type,
|
||||
const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Add or append element to tag array in header.
|
||||
* @todo Arg "p" should have const.
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @param type tag value data type
|
||||
* @param p pointer to tag value(s)
|
||||
* @param c number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerAddOrAppendEntry(Header h, int_32 tag, int_32 type,
|
||||
const void * p, int_32 c)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Retrieve tag value.
|
||||
* Will never return RPM_I18NSTRING_TYPE! RPM_STRING_TYPE elements with
|
||||
* RPM_I18NSTRING_TYPE equivalent entries are translated (if HEADER_I18NTABLE
|
||||
* entry is present).
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @retval type address of tag value data type (or NULL)
|
||||
* @retval p address of pointer to tag value(s) (or NULL)
|
||||
* @retval c address of number of values (or NULL)
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerGetEntry(Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ int_32 * type,
|
||||
/*@null@*/ /*@out@*/ void ** p,
|
||||
/*@null@*/ /*@out@*/int_32 *c)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Retrieve tag value using header internal array.
|
||||
* Get an entry using as little extra RAM as possible to return the tag value.
|
||||
* This is only an issue for RPM_STRING_ARRAY_TYPE.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @retval type address of tag value data type (or NULL)
|
||||
* @retval p address of pointer to tag value(s) (or NULL)
|
||||
* @retval c address of number of values (or NULL)
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerGetEntryMinMemory(Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ int_32 * type,
|
||||
/*@null@*/ /*@out@*/ const void ** p,
|
||||
/*@null@*/ /*@out@*/ int_32 * c)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Retrieve tag value with type match.
|
||||
* If *type is RPM_NULL_TYPE any type will match, otherwise only *type will
|
||||
* match.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @retval type address of tag value data type (or NULL)
|
||||
* @retval p address of pointer to tag value(s) (or NULL)
|
||||
* @retval c address of number of values (or NULL)
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
/*@-exportlocal@*/
|
||||
int headerGetRawEntry(Header h, int_32 tag,
|
||||
/*@null@*/ /*@out@*/ int_32 * type,
|
||||
/*@null@*/ /*@out@*/ const void ** p,
|
||||
/*@null@*/ /*@out@*/ int_32 * c)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
/*@=exportlocal@*/
|
||||
|
||||
/** \ingroup header
|
||||
* Check if tag is in header.
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerIsEntry(/*@null@*/Header h, int_32 tag) /*@*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Delete tag in header.
|
||||
* Removes all entries of type tag from the header, returns 1 if none were
|
||||
* found.
|
||||
*
|
||||
* @param h header
|
||||
* @param tag tag
|
||||
* @return 0 on success, 1 on failure (INCONSISTENT)
|
||||
*/
|
||||
int headerRemoveEntry(Header h, int_32 tag)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Create header tag iterator.
|
||||
* @param h header
|
||||
* @return header tag iterator
|
||||
*/
|
||||
HeaderIterator headerInitIterator(Header h)
|
||||
/*@modifies h */;
|
||||
|
||||
/** \ingroup header
|
||||
* Return next tag from header.
|
||||
* @param hi header tag iterator
|
||||
* @retval tag address of tag
|
||||
* @retval type address of tag value data type
|
||||
* @retval p address of pointer to tag value(s)
|
||||
* @retval c address of number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerNextIterator(HeaderIterator hi,
|
||||
/*@null@*/ /*@out@*/ int_32 * tag,
|
||||
/*@null@*/ /*@out@*/ int_32 * type,
|
||||
/*@null@*/ /*@out@*/ const void ** p,
|
||||
/*@null@*/ /*@out@*/ int_32 * c)
|
||||
/*@modifies hi, *tag, *type, *p, *c @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Destroy header tag iterator.
|
||||
* @param hi header tag iterator
|
||||
*/
|
||||
void headerFreeIterator(/*@only@*/ HeaderIterator hi)
|
||||
/*@modifies hi @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Duplicate a header.
|
||||
* @param h header
|
||||
* @return new header instance
|
||||
*/
|
||||
/*@null@*/ Header headerCopy(Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Sort tags in header.
|
||||
* @param h header
|
||||
*/
|
||||
/*@-exportlocal@*/
|
||||
void headerSort(Header h)
|
||||
/*@modifies h @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Restore tags in header to original ordering.
|
||||
* @param h header
|
||||
*/
|
||||
void headerUnsort(Header h)
|
||||
/*@modifies h @*/;
|
||||
/*@=exportlocal@*/
|
||||
|
||||
/** \ingroup header
|
||||
* Duplicate tag values from one header into another.
|
||||
* @param headerFrom source header
|
||||
* @param headerTo destination header
|
||||
* @param tagstocopy array of tags that are copied
|
||||
*/
|
||||
void headerCopyTags(Header headerFrom, Header headerTo, int_32 * tagstocopy)
|
||||
/*@modifies headerFrom, headerTo @*/;
|
||||
typedef struct HV_s {
|
||||
HVfree free;
|
||||
HVlink link;
|
||||
HVsort sort;
|
||||
HVunsort unsort;
|
||||
HVsize size;
|
||||
HVunload unload;
|
||||
HVreload reload;
|
||||
HVcopy copy;
|
||||
HVisentry isentry;
|
||||
HVget get;
|
||||
HVgetmin getmin;
|
||||
HVgetraw getraw;
|
||||
HVadd add;
|
||||
HVappend append;
|
||||
HVaddorappend addorappend;
|
||||
HVaddi18n addi18n;
|
||||
HVmodify modify;
|
||||
HVremove remove;
|
||||
HVsprintf sprintf;
|
||||
} HV_t;
|
||||
|
||||
/** \ingroup header
|
||||
* The basic types of data in tags from headers.
|
||||
|
@ -534,28 +361,6 @@ typedef enum rpmTagType_e {
|
|||
#define RPM_MAX_TYPE 9
|
||||
} rpmTagType;
|
||||
|
||||
/** \ingroup header
|
||||
* Free data allocated when retrieved from header.
|
||||
* @param data address of data (or NULL)
|
||||
* @param type type of data (or -1 to force free)
|
||||
* @return NULL always
|
||||
*/
|
||||
/*@unused@*/ static inline /*@null@*/
|
||||
void * headerFreeData( /*@only@*/ /*@null@*/ const void * data, rpmTagType type)
|
||||
/*@modifies data @*/
|
||||
{
|
||||
if (data) {
|
||||
/*@-branchstate@*/
|
||||
if (type == -1 ||
|
||||
type == RPM_STRING_ARRAY_TYPE ||
|
||||
type == RPM_I18NSTRING_TYPE ||
|
||||
type == RPM_BIN_TYPE)
|
||||
free((void *)data);
|
||||
/*@=branchstate@*/
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* New rpm data types under consideration/development.
|
||||
* These data types may (or may not) be added to rpm at some point. In order
|
||||
|
@ -588,6 +393,117 @@ typedef enum rpmSubTagType_e {
|
|||
#define HEADER_SIGBASE 256
|
||||
#define HEADER_TAGBASE 1000
|
||||
|
||||
/** \ingroup header
|
||||
* Free data allocated when retrieved from header.
|
||||
* @param data address of data (or NULL)
|
||||
* @param type type of data (or -1 to force free)
|
||||
* @return NULL always
|
||||
*/
|
||||
/*@unused@*/ static inline /*@null@*/
|
||||
void * headerFreeData( /*@only@*/ /*@null@*/ const void * data, rpmTagType type)
|
||||
/*@modifies data @*/
|
||||
{
|
||||
if (data) {
|
||||
/*@-branchstate@*/
|
||||
if (type == -1 ||
|
||||
type == RPM_STRING_ARRAY_TYPE ||
|
||||
type == RPM_I18NSTRING_TYPE ||
|
||||
type == RPM_BIN_TYPE)
|
||||
free((void *)data);
|
||||
/*@=branchstate@*/
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Create new (empty) header instance.
|
||||
* @return header
|
||||
*/
|
||||
Header headerNew(void) /*@*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Convert header to in-memory representation.
|
||||
* @param uh on-disk header blob (i.e. with offsets)
|
||||
* @return header
|
||||
*/
|
||||
/*@-exportlocal@*/
|
||||
/*@null@*/ Header headerLoad(/*@kept@*/ void * uh)
|
||||
/*@modifies uh @*/;
|
||||
/*@=exportlocal@*/
|
||||
|
||||
/** \ingroup header
|
||||
* Write (with unload) header to file handle.
|
||||
* @param fd file handle
|
||||
* @param h header
|
||||
* @param magicp prefix write with 8 bytes of (magic, 0)?
|
||||
* @return 0 on success, 1 on error
|
||||
*/
|
||||
int headerWrite(FD_t fd, /*@null@*/ Header h, enum hMagic magicp)
|
||||
/*@modifies fd, h, fileSystem @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Make a copy and convert header to in-memory representation.
|
||||
* @param uh on-disk header blob (i.e. with offsets)
|
||||
* @return header
|
||||
*/
|
||||
/*@null@*/ Header headerCopyLoad(void * uh)
|
||||
/*@modifies uh @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Read (and load) header from file handle.
|
||||
* @param fd file handle
|
||||
* @param magicp read (and verify) 8 bytes of (magic, 0)?
|
||||
* @return header (or NULL on error)
|
||||
*/
|
||||
/*@null@*/ Header headerRead(FD_t fd, enum hMagic magicp)
|
||||
/*@modifies fd, fileSystem @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Duplicate tag values from one header into another.
|
||||
* @param headerFrom source header
|
||||
* @param headerTo destination header
|
||||
* @param tagstocopy array of tags that are copied
|
||||
*/
|
||||
void headerCopyTags(Header headerFrom, Header headerTo, hTAG_t tagstocopy)
|
||||
/*@modifies headerFrom, headerTo @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Destroy header tag iterator.
|
||||
* @param hi header tag iterator
|
||||
*/
|
||||
void headerFreeIterator(/*@only@*/ HeaderIterator hi)
|
||||
/*@modifies hi @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Create header tag iterator.
|
||||
* @param h header
|
||||
* @return header tag iterator
|
||||
*/
|
||||
HeaderIterator headerInitIterator(Header h)
|
||||
/*@modifies h */;
|
||||
|
||||
/** \ingroup header
|
||||
* Return next tag from header.
|
||||
* @param hi header tag iterator
|
||||
* @retval tag address of tag
|
||||
* @retval type address of tag value data type
|
||||
* @retval p address of pointer to tag value(s)
|
||||
* @retval c address of number of values
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
int headerNextIterator(HeaderIterator hi,
|
||||
/*@null@*/ /*@out@*/ hTAG_t tag,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ hPTR_t * p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c)
|
||||
/*@modifies hi, *tag, *type, *p, *c @*/;
|
||||
|
||||
#if defined(__HEADER_PROTOTYPES__)
|
||||
#include <hdrproto.h>
|
||||
#else
|
||||
#include <hdrinline.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -8,14 +8,33 @@
|
|||
|
||||
#include "debug.h"
|
||||
|
||||
void headerDump(Header h, FILE *f, int flags,
|
||||
const struct headerTagTableEntry * tags)
|
||||
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? */
|
||||
}
|
||||
|
||||
void headerDump(Header h, FILE *f, int flags,
|
||||
const struct headerTagTableEntry * tags)
|
||||
{
|
||||
int i;
|
||||
struct indexEntry *p;
|
||||
indexEntry p;
|
||||
const struct headerTagTableEntry * tage;
|
||||
const char *tag;
|
||||
char *type;
|
||||
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);
|
||||
|
|
|
@ -11,10 +11,18 @@
|
|||
#include <netinet/in.h>
|
||||
#endif /* __LCLINT__ */
|
||||
|
||||
#define INDEX_MALLOC_SIZE 8
|
||||
|
||||
/**
|
||||
/*
|
||||
* Teach header.c about legacy tags.
|
||||
*/
|
||||
#define HEADER_OLDFILENAMES 1027
|
||||
#define HEADER_BASENAMES 1117
|
||||
|
||||
/** \ingroup header
|
||||
* Description of tag data.
|
||||
*/
|
||||
typedef /*@abstract@*/ struct entryInfo * entryInfo;
|
||||
struct entryInfo {
|
||||
int_32 tag; /*!< Tag identifier. */
|
||||
int_32 type; /*!< Tag data type. */
|
||||
|
@ -28,9 +36,10 @@ struct entryInfo {
|
|||
#define ENTRY_IS_REGION(_e) ((_e)->info.tag < HEADER_I18NTABLE)
|
||||
#define ENTRY_IN_REGION(_e) ((_e)->info.offset < 0)
|
||||
|
||||
/**
|
||||
/** \ingroup header
|
||||
* A single tag from a Header.
|
||||
*/
|
||||
typedef /*@abstract@*/ struct indexEntry * indexEntry;
|
||||
struct indexEntry {
|
||||
struct entryInfo info; /*!< Description of tag data. */
|
||||
/*@owned@*/ void * data; /*!< Location of tag data. */
|
||||
|
@ -38,11 +47,12 @@ struct indexEntry {
|
|||
int rdlen; /*!< No. bytes of data in region. */
|
||||
};
|
||||
|
||||
/**
|
||||
/** \ingroup header
|
||||
* The Header data structure.
|
||||
*/
|
||||
struct headerToken {
|
||||
/*@owned@*/ struct indexEntry * index; /*!< Array of tags. */
|
||||
/*@unused@*/ HV_t hv; /*!< Header public methods. */
|
||||
/*@owned@*/ 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? */
|
||||
|
@ -51,8 +61,9 @@ struct headerToken {
|
|||
/*@refs@*/ int nrefs; /*!< Reference count. */
|
||||
};
|
||||
|
||||
/**
|
||||
/** \ingroup header
|
||||
*/
|
||||
typedef /*@abstract@*/ struct sprintfTag * sprintfTag;
|
||||
struct sprintfTag {
|
||||
/*@null@*/ headerTagTagFunction ext; /*!< if NULL tag element is invalid */
|
||||
int extNum;
|
||||
|
@ -64,8 +75,9 @@ struct sprintfTag {
|
|||
int pad;
|
||||
};
|
||||
|
||||
/**
|
||||
/** \ingroup header
|
||||
*/
|
||||
typedef /*@abstract@*/ struct extensionCache * extensionCache;
|
||||
struct extensionCache {
|
||||
int_32 type;
|
||||
int_32 count;
|
||||
|
@ -74,8 +86,10 @@ struct extensionCache {
|
|||
/*@owned@*/ const void * data;
|
||||
};
|
||||
|
||||
/**
|
||||
/** \ingroup header
|
||||
*/
|
||||
/*@-fielduse@*/
|
||||
typedef /*@abstract@*/ struct sprintfToken * sprintfToken;
|
||||
struct sprintfToken {
|
||||
enum {
|
||||
PTOK_NONE = 0,
|
||||
|
@ -86,28 +100,106 @@ struct sprintfToken {
|
|||
} type;
|
||||
union {
|
||||
struct {
|
||||
/*@only@*/ struct sprintfToken * format;
|
||||
/*@only@*/ sprintfToken format;
|
||||
int numTokens;
|
||||
} array;
|
||||
struct sprintfTag tag;
|
||||
struct {
|
||||
/*@dependent@*/ char * string;
|
||||
/*@dependent@*/ char * string;
|
||||
int len;
|
||||
} string;
|
||||
struct {
|
||||
/*@only@*/ /*@null@*/ struct sprintfToken * ifFormat;
|
||||
/*@only@*/ /*@null@*/ sprintfToken ifFormat;
|
||||
int numIfTokens;
|
||||
/*@only@*/ /*@null@*/ struct sprintfToken * elseFormat;
|
||||
/*@only@*/ /*@null@*/ sprintfToken elseFormat;
|
||||
int numElseTokens;
|
||||
struct sprintfTag tag;
|
||||
} cond;
|
||||
} u;
|
||||
};
|
||||
/*@=fielduse@*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** \ingroup header
|
||||
*/
|
||||
extern unsigned char header_magic[8];
|
||||
|
||||
/** \ingroup header
|
||||
*/
|
||||
extern HV_t hv;
|
||||
|
||||
/** \ingroup header
|
||||
* Swap int_32 and int_16 arrays within header region.
|
||||
*
|
||||
* This code is way more twisty than I would like.
|
||||
*
|
||||
* A bug with RPM_I18NSTRING_TYPE in rpm-2.5.x (fixed in August 1998)
|
||||
* causes the offset and length of elements in a header region to disagree
|
||||
* regarding the total length of the region data.
|
||||
*
|
||||
* The "fix" is to compute the size using both offset and length and
|
||||
* return the larger of the two numbers as the size of the region.
|
||||
* Kinda like computing left and right Riemann sums of the data elements
|
||||
* to determine the size of a data structure, go figger :-).
|
||||
*
|
||||
* There's one other twist if a header region tag is in the set to be swabbed,
|
||||
* as the data for a header region is located after all other tag data.
|
||||
*
|
||||
* @param entry header entry
|
||||
* @param il no. of entries
|
||||
* @param dl start no. bytes of data
|
||||
* @param pe header physical entry pointer (swapped)
|
||||
* @param dataStart header data
|
||||
* @param regionid region offset
|
||||
* @return no. bytes of data in region, -1 on error
|
||||
*/
|
||||
int regionSwab(/*@null@*/ indexEntry entry, int il, int dl,
|
||||
entryInfo pe, char * dataStart, int regionid)
|
||||
/*@modifies entry, *dataStart @*/;
|
||||
|
||||
/** \ingroup header
|
||||
*/
|
||||
/*@only@*/ /*@null@*/ void * doHeaderUnload(Header h, /*@out@*/ int * lengthPtr)
|
||||
/*@modifies h, *lengthPtr @*/;
|
||||
|
||||
/** \ingroup header
|
||||
* Retrieve data from header entry.
|
||||
* @todo Permit retrieval of regions other than HEADER_IMUTABLE.
|
||||
* @param entry header entry
|
||||
* @retval type address of type (or NULL)
|
||||
* @retval p address of data (or NULL)
|
||||
* @retval c address of count (or NULL)
|
||||
* @param minMem string pointers refer to header memory?
|
||||
* @return 1 on success, otherwise error.
|
||||
*/
|
||||
int copyEntry(const indexEntry entry,
|
||||
/*@null@*/ /*@out@*/ hTYP_t type,
|
||||
/*@null@*/ /*@out@*/ hPTR_t * p,
|
||||
/*@null@*/ /*@out@*/ hCNT_t c,
|
||||
int minMem)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
|
||||
/** \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
|
||||
* Return header reference count.
|
||||
* @param h header
|
||||
* @return no. of references
|
||||
*/
|
||||
/*@unused@*/ static inline int headerUsageCount(Header h) /*@*/ {
|
||||
return h->nrefs;
|
||||
}
|
||||
|
||||
/** \ingroup header
|
||||
* Dump a header in human readable format (for debugging).
|
||||
|
@ -117,7 +209,8 @@ extern "C" {
|
|||
*/
|
||||
/*@unused@*/
|
||||
void headerDump(Header h, FILE *f, int flags,
|
||||
const struct headerTagTableEntry * tags);
|
||||
const struct headerTagTableEntry * tags)
|
||||
/*@modifies f, fileSystem @*/;
|
||||
#define HEADER_DUMP_INLINE 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -154,7 +154,7 @@ int rpmHeaderGetEntry(Header h, int_32 tag, /*@out@*/ int_32 *type,
|
|||
/*@unused@*/
|
||||
int rpmPackageGetEntry(void *leadp, Header sigs, Header h,
|
||||
int_32 tag, int_32 *type, void **p, int_32 *c)
|
||||
/*@modifies *type, *p, *c @*/;
|
||||
/*@modifies h, *type, *p, *c @*/;
|
||||
|
||||
/**
|
||||
* Automatically generated table of tag name/value pairs.
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
#include "system.h"
|
||||
|
||||
#include <rpmio.h>
|
||||
#include <rpmlib.h>
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ lib/depends.c
|
|||
lib/formats.c
|
||||
lib/fs.c
|
||||
lib/fsm.c
|
||||
lib/hdrinline.c
|
||||
lib/header.c
|
||||
lib/header_internal.c
|
||||
lib/manifest.c
|
||||
|
|
2596
po/rpm.pot
2596
po/rpm.pot
File diff suppressed because it is too large
Load Diff
|
@ -6,99 +6,111 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2001-02-22 17:41-0500\n"
|
||||
"POT-Creation-Date: 2001-06-19 07:33-0400\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: ENCODING\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: popt.c:29
|
||||
msgid "unknown errno"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:758
|
||||
#: popt.c:888
|
||||
#, c-format
|
||||
msgid "option type (%d) not implemented in popt\n"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:893
|
||||
#: popt.c:1053
|
||||
msgid "missing argument"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:895
|
||||
#: popt.c:1055
|
||||
msgid "unknown option"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:897
|
||||
#: popt.c:1057
|
||||
msgid "mutually exclusive logical operations requested"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:899
|
||||
#: popt.c:1059
|
||||
msgid "opt->arg should not be NULL"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:1061
|
||||
msgid "aliases nested too deeply"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:901
|
||||
#: popt.c:1063
|
||||
msgid "error in parameter quoting"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:903
|
||||
#: popt.c:1065
|
||||
msgid "invalid numeric value"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:905
|
||||
#: popt.c:1067
|
||||
msgid "number too large or too small"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:909
|
||||
#: popt.c:1069
|
||||
msgid "memory allocation failed"
|
||||
msgstr ""
|
||||
|
||||
#: popt.c:1073
|
||||
msgid "unknown error"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:28
|
||||
#: popthelp.c:32
|
||||
msgid "Show this help message"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:29
|
||||
#: popthelp.c:33
|
||||
msgid "Display brief usage message"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:60
|
||||
#: popthelp.c:36
|
||||
msgid "Display option defaults in message"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:71
|
||||
msgid "NONE"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:61
|
||||
#: popthelp.c:72
|
||||
msgid "VAL"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:62
|
||||
#: popthelp.c:73
|
||||
msgid "INT"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:63
|
||||
#: popthelp.c:74
|
||||
msgid "LONG"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:64
|
||||
#: popthelp.c:75
|
||||
msgid "STRING"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:65
|
||||
#: popthelp.c:76
|
||||
msgid "FLOAT"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:66
|
||||
#: popthelp.c:77
|
||||
msgid "DOUBLE"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:67
|
||||
#: popthelp.c:78
|
||||
msgid "ARG"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:241
|
||||
#: popthelp.c:354
|
||||
msgid "Usage:"
|
||||
msgstr ""
|
||||
|
||||
#: popthelp.c:260
|
||||
#: popthelp.c:376
|
||||
msgid "[OPTION...]"
|
||||
msgstr ""
|
||||
|
|
193
rpm.spec
193
rpm.spec
|
@ -31,8 +31,6 @@ BuildRequires: db3-devel
|
|||
# XXX linked binaries like /bin/rpm.
|
||||
%ifnarch ia64
|
||||
Requires: glibc >= 2.1.92
|
||||
# XXX needed to avoid libdb.so.2 satisfied by compat/libc5 provides.
|
||||
Requires: db1 = 1.85
|
||||
%endif
|
||||
%endif
|
||||
|
||||
|
@ -131,11 +129,30 @@ rm -rf $RPM_BUILD_ROOT
|
|||
|
||||
make DESTDIR="$RPM_BUILD_ROOT" install
|
||||
|
||||
%ifos linux
|
||||
|
||||
# Save list of packages through cron
|
||||
mkdir -p ${RPM_BUILD_ROOT}/etc/cron.daily
|
||||
install -m 755 scripts/rpm.daily ${RPM_BUILD_ROOT}/etc/cron.daily/rpm
|
||||
|
||||
mkdir -p ${RPM_BUILD_ROOT}/etc/logrotate.d
|
||||
install -m 755 scripts/rpm.log ${RPM_BUILD_ROOT}/etc/logrotate.d/rpm
|
||||
|
||||
mkdir -p $RPM_BUILD_ROOT/etc/rpm
|
||||
cat << E_O_F > $RPM_BUILD_ROOT/etc/rpm/macros.db1
|
||||
%%_dbapi 1
|
||||
E_O_F
|
||||
|
||||
mkdir -p $RPM_BUILD_ROOT/var/lib/rpm
|
||||
for dbi in \
|
||||
Basenames Conflictname Dirnames Group Installtid Name Providename \
|
||||
Provideversion Removetid Requirename Requireversion Triggername
|
||||
do
|
||||
touch $RPM_BUILD_ROOT/var/lib/rpm/$dbi
|
||||
done
|
||||
|
||||
%endif
|
||||
|
||||
%if %{with_apidocs}
|
||||
gzip -9n apidocs/man/man*/* || :
|
||||
%endif
|
||||
|
@ -151,34 +168,46 @@ gzip -9n apidocs/man/man*/* || :
|
|||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%pre
|
||||
%ifos linux
|
||||
if [ -f /var/lib/rpm/Packages -a -f /var/lib/rpm/packages.rpm ]; then
|
||||
# echo "
|
||||
#You have both
|
||||
# /var/lib/rpm/packages.rpm db1 format installed package headers
|
||||
# /var/lib/rpm/Packages db3 format installed package headers
|
||||
#Please remove (or at least rename) one of those files, and re-install.
|
||||
#"
|
||||
echo "
|
||||
You have both
|
||||
/var/lib/rpm/packages.rpm db1 format installed package headers
|
||||
/var/lib/rpm/Packages db3 format installed package headers
|
||||
Please remove (or at least rename) one of those files, and re-install.
|
||||
"
|
||||
exit 1
|
||||
fi
|
||||
/usr/sbin/groupadd -g 37 rpm > /dev/null 2>&1
|
||||
/usr/sbin/useradd -d /var/lib/rpm -u 37 -g 37 rpm > /dev/null 2>&1
|
||||
%endif
|
||||
exit 0
|
||||
|
||||
%post
|
||||
%ifos linux
|
||||
/sbin/ldconfig
|
||||
%endif
|
||||
if [ -f /var/lib/rpm/packages.rpm ]; then
|
||||
: # do nothing
|
||||
/bin/chown rpm.rpm /var/lib/rpm/*.rpm
|
||||
elif [ -f /var/lib/rpm/Packages ]; then
|
||||
# undo db1 configuration
|
||||
rm -f /etc/rpm/macros.db1
|
||||
/bin/chown rpm.rpm /var/lib/rpm/[A-Z]*
|
||||
else
|
||||
# initialize db3 database
|
||||
rm -f /etc/rpm/macros.db1
|
||||
/bin/rpm --initdb
|
||||
fi
|
||||
%endif
|
||||
exit 0
|
||||
|
||||
%ifos linux
|
||||
%postun -p /sbin/ldconfig
|
||||
%postun
|
||||
/sbin/ldconfig
|
||||
if [ $1 == 0 ]; then
|
||||
/usr/sbin/userdel rpm
|
||||
/usr/sbin/groupdel rpm
|
||||
fi
|
||||
|
||||
|
||||
%post devel -p /sbin/ldconfig
|
||||
%postun devel -p /sbin/ldconfig
|
||||
|
@ -192,50 +221,79 @@ fi
|
|||
%postun python -p /sbin/ldconfig
|
||||
%endif
|
||||
|
||||
%define rpmattr %attr(0755, rpm, rpm)
|
||||
%define rpmdbattr %rpmattr %verify(not md5 size mtime) %ghost
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%doc RPM-PGP-KEY RPM-GPG-KEY CHANGES GROUPS doc/manual/[a-z]*
|
||||
/bin/rpm
|
||||
%dir /etc/rpm
|
||||
%config(missingok) /etc/rpm/macros.db1
|
||||
%{__prefix}/bin/rpm2cpio
|
||||
%{__prefix}/bin/gendiff
|
||||
%{__prefix}/bin/rpmdb
|
||||
%{__prefix}/bin/rpm[eiukqv]
|
||||
%{__prefix}/bin/rpmsign
|
||||
%{__prefix}/bin/rpmquery
|
||||
%{__prefix}/bin/rpmverify
|
||||
%attr(0755, rpm, rpm) /bin/rpm
|
||||
|
||||
%ifos linux
|
||||
%config(noreplace,missingok) /etc/cron.daily/rpm
|
||||
%config(noreplace,missingok) /etc/logrotate.d/rpm
|
||||
%dir /etc/rpm
|
||||
%config(noreplace,missingok) /etc/rpm/macros.db1
|
||||
%attr(0755, rpm, rpm) %dir /var/lib/rpm
|
||||
%rpmdbattr /var/lib/rpm/Basenames
|
||||
%rpmdbattr /var/lib/rpm/Conflictname
|
||||
#%rpmdbattr /var/lib/rpm/__db.001
|
||||
%rpmdbattr /var/lib/rpm/Dirnames
|
||||
%rpmdbattr /var/lib/rpm/Group
|
||||
%rpmdbattr /var/lib/rpm/Installtid
|
||||
%rpmdbattr /var/lib/rpm/Name
|
||||
#%rpmdbattr /var/lib/rpm/Packages
|
||||
%rpmdbattr /var/lib/rpm/Providename
|
||||
%rpmdbattr /var/lib/rpm/Provideversion
|
||||
%rpmdbattr /var/lib/rpm/Removetid
|
||||
%rpmdbattr /var/lib/rpm/Requirename
|
||||
%rpmdbattr /var/lib/rpm/Requireversion
|
||||
%rpmdbattr /var/lib/rpm/Triggername
|
||||
%endif
|
||||
|
||||
%rpmattr %{__prefix}/bin/rpm2cpio
|
||||
%rpmattr %{__prefix}/bin/gendiff
|
||||
%rpmattr %{__prefix}/bin/rpmdb
|
||||
%rpmattr %{__prefix}/bin/rpm[eiukqv]
|
||||
%rpmattr %{__prefix}/bin/rpmsign
|
||||
%rpmattr %{__prefix}/bin/rpmquery
|
||||
%rpmattr %{__prefix}/bin/rpmverify
|
||||
|
||||
%{__prefix}/lib/librpm.so.*
|
||||
%{__prefix}/lib/librpmdb.so.*
|
||||
%{__prefix}/lib/librpmio.so.*
|
||||
%{__prefix}/lib/librpmbuild.so.*
|
||||
|
||||
%{__prefix}/lib/rpm/config.guess
|
||||
%{__prefix}/lib/rpm/config.sub
|
||||
%{__prefix}/lib/rpm/convertrpmrc.sh
|
||||
%{__prefix}/lib/rpm/macros
|
||||
%{__prefix}/lib/rpm/mkinstalldirs
|
||||
%{__prefix}/lib/rpm/rpmdb
|
||||
%{__prefix}/lib/rpm/rpm[eiukqv]
|
||||
%{__prefix}/lib/rpm/rpmpopt*
|
||||
%{__prefix}/lib/rpm/rpmrc
|
||||
%rpmattr %{__prefix}/lib/rpm/config.guess
|
||||
%rpmattr %{__prefix}/lib/rpm/config.sub
|
||||
%rpmattr %{__prefix}/lib/rpm/convertrpmrc.sh
|
||||
%attr(0644, rpm, rpm) %{__prefix}/lib/rpm/macros
|
||||
%rpmattr %{__prefix}/lib/rpm/mkinstalldirs
|
||||
%rpmattr %{__prefix}/lib/rpm/rpm.*
|
||||
%rpmattr %{__prefix}/lib/rpm/rpm[deiukqv]
|
||||
%attr(0644, rpm, rpm) %{__prefix}/lib/rpm/rpmpopt*
|
||||
%attr(0644, rpm, rpm) %{__prefix}/lib/rpm/rpmrc
|
||||
|
||||
%ifarch i386 i486 i586 i686
|
||||
%{__prefix}/lib/rpm/i[3456]86*
|
||||
%ifarch i386 i486 i586 i686 athlon
|
||||
%attr(-, rpm, rpm) %{__prefix}/lib/rpm/i[3456]86*
|
||||
%endif
|
||||
%ifarch alpha
|
||||
%{__prefix}/lib/rpm/alpha*
|
||||
%attr(-, rpm, rpm) %{__prefix}/lib/rpm/alpha*
|
||||
%endif
|
||||
%ifarch sparc sparc64
|
||||
%{__prefix}/lib/rpm/sparc*
|
||||
%attr(-, rpm, rpm) %{__prefix}/lib/rpm/sparc*
|
||||
%endif
|
||||
%ifarch ia64
|
||||
%{__prefix}/lib/rpm/ia64*
|
||||
%attr(-, rpm, rpm) %{__prefix}/lib/rpm/ia64*
|
||||
%endif
|
||||
%ifarch powerpc ppc
|
||||
%{__prefix}/lib/rpm/ppc*
|
||||
%attr(-, rpm, rpm) %{__prefix}/lib/rpm/ppc*
|
||||
%endif
|
||||
%ifarch s390 s390x
|
||||
%attr(-, rpm, rpm) %{__prefix}/lib/rpm/s390*
|
||||
%endif
|
||||
%ifarch armv3l armv4l
|
||||
%{__prefix}/lib/rpm/armv[34][lb]*
|
||||
%attr(-, rpm, rpm) %{__prefix}/lib/rpm/armv[34][lb]*
|
||||
%endif
|
||||
|
||||
%lang(cs) %{__prefix}/*/locale/cs/LC_MESSAGES/rpm.mo
|
||||
|
@ -257,7 +315,9 @@ fi
|
|||
%lang(sv) %{__prefix}/*/locale/sv/LC_MESSAGES/rpm.mo
|
||||
%lang(tr) %{__prefix}/*/locale/tr/LC_MESSAGES/rpm.mo
|
||||
|
||||
%{__prefix}%{__share}/man/man[18]/*.[18]*
|
||||
%{__prefix}%{__share}/man/man1/gendiff.1*
|
||||
%{__prefix}%{__share}/man/man8/rpm.8*
|
||||
%{__prefix}%{__share}/man/man8/rpm2cpio.8*
|
||||
%lang(pl) %{__prefix}%{__share}/man/pl/man[18]/*.[18]*
|
||||
%lang(ru) %{__prefix}%{__share}/man/ru/man[18]/*.[18]*
|
||||
%lang(sk) %{__prefix}%{__share}/man/sk/man[18]/*.[18]*
|
||||
|
@ -271,31 +331,35 @@ fi
|
|||
%dir %{__prefix}/src/redhat/SRPMS
|
||||
%dir %{__prefix}/src/redhat/RPMS
|
||||
%{__prefix}/src/redhat/RPMS/*
|
||||
%{__prefix}/bin/rpmbuild
|
||||
%{__prefix}/lib/rpm/brp-*
|
||||
%{__prefix}/lib/rpm/check-prereqs
|
||||
%{__prefix}/lib/rpm/cpanflute
|
||||
%{__prefix}/lib/rpm/find-lang.sh
|
||||
%{__prefix}/lib/rpm/find-prov.pl
|
||||
%{__prefix}/lib/rpm/find-provides
|
||||
%{__prefix}/lib/rpm/find-provides.perl
|
||||
%{__prefix}/lib/rpm/find-req.pl
|
||||
%{__prefix}/lib/rpm/find-requires
|
||||
%{__prefix}/lib/rpm/find-requires.perl
|
||||
%{__prefix}/lib/rpm/get_magic.pl
|
||||
%{__prefix}/lib/rpm/getpo.sh
|
||||
%{__prefix}/lib/rpm/http.req
|
||||
%{__prefix}/lib/rpm/javadeps
|
||||
%{__prefix}/lib/rpm/magic.prov
|
||||
%{__prefix}/lib/rpm/magic.req
|
||||
%{__prefix}/lib/rpm/perl.prov
|
||||
%{__prefix}/lib/rpm/perl.req
|
||||
%{__prefix}/lib/rpm/rpm[bt]
|
||||
%{__prefix}/lib/rpm/rpmdiff
|
||||
%{__prefix}/lib/rpm/rpmdiff.cgi
|
||||
%{__prefix}/lib/rpm/u_pkg.sh
|
||||
%{__prefix}/lib/rpm/vpkg-provides.sh
|
||||
%{__prefix}/lib/rpm/vpkg-provides2.sh
|
||||
%rpmattr %{__prefix}/bin/rpmbuild
|
||||
%rpmattr %{__prefix}/lib/rpm/brp-*
|
||||
%rpmattr %{__prefix}/lib/rpm/check-prereqs
|
||||
%rpmattr %{__prefix}/lib/rpm/config.site
|
||||
%rpmattr %{__prefix}/lib/rpm/cpanflute
|
||||
%rpmattr %{__prefix}/lib/rpm/cross-build
|
||||
%rpmattr %{__prefix}/lib/rpm/find-lang.sh
|
||||
%rpmattr %{__prefix}/lib/rpm/find-prov.pl
|
||||
%rpmattr %{__prefix}/lib/rpm/find-provides
|
||||
%rpmattr %{__prefix}/lib/rpm/find-provides.perl
|
||||
%rpmattr %{__prefix}/lib/rpm/find-req.pl
|
||||
%rpmattr %{__prefix}/lib/rpm/find-requires
|
||||
%rpmattr %{__prefix}/lib/rpm/find-requires.perl
|
||||
%rpmattr %{__prefix}/lib/rpm/get_magic.pl
|
||||
%rpmattr %{__prefix}/lib/rpm/getpo.sh
|
||||
%rpmattr %{__prefix}/lib/rpm/http.req
|
||||
%rpmattr %{__prefix}/lib/rpm/javadeps
|
||||
%rpmattr %{__prefix}/lib/rpm/magic.prov
|
||||
%rpmattr %{__prefix}/lib/rpm/magic.req
|
||||
%rpmattr %{__prefix}/lib/rpm/perl.prov
|
||||
%rpmattr %{__prefix}/lib/rpm/perl.req
|
||||
%rpmattr %{__prefix}/lib/rpm/rpm[bt]
|
||||
%rpmattr %{__prefix}/lib/rpm/rpmdiff
|
||||
%rpmattr %{__prefix}/lib/rpm/rpmdiff.cgi
|
||||
%rpmattr %{__prefix}/lib/rpm/u_pkg.sh
|
||||
%rpmattr %{__prefix}/lib/rpm/vpkg-provides.sh
|
||||
%rpmattr %{__prefix}/lib/rpm/vpkg-provides2.sh
|
||||
|
||||
%{__prefix}%{__share}/man/man8/rpmbuild.8*
|
||||
|
||||
%if %{with_python_subpackage}
|
||||
%files python
|
||||
|
@ -312,6 +376,9 @@ fi
|
|||
%{__prefix}/lib/librpm.a
|
||||
%{__prefix}/lib/librpm.la
|
||||
%{__prefix}/lib/librpm.so
|
||||
%{__prefix}/lib/librpmdb.a
|
||||
%{__prefix}/lib/librpmdb.la
|
||||
%{__prefix}/lib/librpmdb.so
|
||||
%{__prefix}/lib/librpmio.a
|
||||
%{__prefix}/lib/librpmio.la
|
||||
%{__prefix}/lib/librpmio.so
|
||||
|
|
|
@ -388,7 +388,7 @@ static int fadSanity(FD_t fd, int offset, const struct faHeader * fh, int printi
|
|||
int rc = 0;
|
||||
|
||||
/* Check size range and alignment. */
|
||||
if (!(fh->size > 0 || fh->size <= 0x00200000 && (fh->size & 0x3f) == 0))
|
||||
if (!(fh->size > 0 && fh->size <= 0x00200000 && (fh->size & 0x3f) == 0))
|
||||
rc |= 0x1;
|
||||
|
||||
/* Check forward link range, alignment and offset. */
|
||||
|
|
13
rpmrc.in
13
rpmrc.in
|
@ -1,7 +1,7 @@
|
|||
#/*! \page config_rpmrc Default configuration: /usr/lib/rpm/rpmrc
|
||||
# \verbatim
|
||||
#
|
||||
# $Id: rpmrc.in,v 2.37 2001/05/16 19:19:15 jbj Exp $
|
||||
# $Id: rpmrc.in,v 2.38 2001/06/19 11:38:51 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
|
||||
|
@ -50,6 +50,8 @@ optflags: falcon -O2 -fomit-frame-pointer
|
|||
optflags: atariclone -O2 -fomit-frame-pointer
|
||||
optflags: milan -O2 -fomit-frame-pointer
|
||||
optflags: hades -O2 -fomit-frame-pointer
|
||||
optflags: s390 -O2
|
||||
optflags: s390x -O2
|
||||
|
||||
#############################################################
|
||||
# Canonical arch names and numbers
|
||||
|
@ -97,6 +99,7 @@ arch_canon: milan: m68kmint 13
|
|||
arch_canon: hades: m68kmint 13
|
||||
arch_canon: s390: s390 14
|
||||
arch_canon: i370: i370 14
|
||||
arch_canon: s390x: s390x 15
|
||||
|
||||
#############################################################
|
||||
# Canonical OS names and numbers
|
||||
|
@ -168,6 +171,9 @@ buildarchtranslate: atariclone: m68kmint
|
|||
buildarchtranslate: milan: m68kmint
|
||||
buildarchtranslate: hades: m68kmint
|
||||
|
||||
buildarchtranslate: s390: s390
|
||||
buildarchtranslate: s390x: s390x
|
||||
|
||||
#############################################################
|
||||
# Architecture compatibility
|
||||
|
||||
|
@ -224,8 +230,9 @@ arch_compat: atariclone: m68kmint noarch
|
|||
arch_compat: milan: m68kmint noarch
|
||||
arch_compat: hades: m68kmint noarch
|
||||
|
||||
arch_compat: s390: i370
|
||||
arch_compat: i370: noarch
|
||||
arch_compat: s390: noarch
|
||||
arch_compat: s390x: noarch
|
||||
|
||||
arch_compat: ia64: i686 noarch
|
||||
|
||||
|
@ -299,7 +306,9 @@ buildarch_compat: milan: m68kmint noarch
|
|||
buildarch_compat: hades: m68kmint noarch
|
||||
|
||||
buildarch_compat: ia64: noarch
|
||||
|
||||
buildarch_compat: s390: noarch
|
||||
buildarch_compat: s390x: noarch
|
||||
|
||||
macrofiles: @RPMCONFIGDIR@/macros:@RPMCONFIGDIR@/%{_target}/macros:@SYSCONFIGDIR@/macros.specspo:@SYSCONFIGDIR@/macros.db1:@SYSCONFIGDIR@/macros:@SYSCONFIGDIR@/%{_target}/macros:~/.rpmmacros
|
||||
|
||||
|
|
Loading…
Reference in New Issue