add configure scaffolding to support rpm-4.0 packages.
CVS patchset: 3136 CVS date: 1999/07/08 22:10:33
This commit is contained in:
parent
7f9aeb867a
commit
25e6b06959
1
CHANGES
1
CHANGES
|
@ -1,5 +1,6 @@
|
|||
3.0.2 -> 3.0.3
|
||||
- add --eval to find result of macro expansion.
|
||||
- add configure scaffolding to support rpm-4.0 packages.
|
||||
|
||||
3.0.1 -> 3.0.2
|
||||
- eliminate armv4 entries from rpmrc (Andrew E. Mileski).
|
||||
|
|
|
@ -129,6 +129,12 @@
|
|||
/* define if the statfs() call takes 4 arguments */
|
||||
#undef STAT_STATFS4
|
||||
|
||||
/* define if support rpm-1.0 packages is desired */
|
||||
#undef ENABLE_V1_PACKAGES
|
||||
|
||||
/* define if experimental support rpm-4.0 packages is desired */
|
||||
#undef ENABLE_V4_PACKAGES
|
||||
|
||||
^L
|
||||
/* Leave that blank line there!! Autoheader needs it.
|
||||
If you're adding to this file, keep in mind:
|
||||
|
|
22
configure.in
22
configure.in
|
@ -235,6 +235,28 @@ else
|
|||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl Check for features
|
||||
dnl
|
||||
|
||||
### use option --disable-v1-packages to turn off support for rpm-1.x packages
|
||||
AC_MSG_CHECKING(if you want support for rpm-1.0 packages)
|
||||
AC_ARG_ENABLE(v1-packages,,
|
||||
[ --disable-v1-packages disable support for rpm-1.x packages],
|
||||
[with_v1_packages=$enableval],
|
||||
[with_v1_packages=yes])
|
||||
AC_MSG_RESULT($with_v1_packages)
|
||||
test "$with_v1_packages" = yes && AC_DEFINE(ENABLE_V1_PACKAGES)
|
||||
|
||||
### use option --enable-v4-packages to turn on support for rpm-4.x packages
|
||||
AC_MSG_CHECKING(if you want experimental rpm-4.0 packages)
|
||||
AC_ARG_ENABLE(v4-packages,
|
||||
[ --enable-v4-packages compile with support for rpm-4.x packages],
|
||||
[with_v4_packages=$enableval],
|
||||
[with_v4_packages=no])
|
||||
AC_MSG_RESULT($with_v4_packages)
|
||||
test "$with_v4_packages" = yes && AC_DEFINE(ENABLE_V4_PACKAGES)
|
||||
|
||||
dnl Checks for libraries.
|
||||
|
||||
AC_CHECK_FUNC(strcasecmp, [], [
|
||||
|
|
|
@ -94,10 +94,12 @@ int rpmInstallSourcePackage(const char * rootdir, FD_t fd,
|
|||
return 2;
|
||||
}
|
||||
|
||||
#if defined(ENABLE_V1_PACKAGES)
|
||||
if (major == 1) {
|
||||
notify = NULL;
|
||||
h = NULL;
|
||||
}
|
||||
#endif /* ENABLE_V1_PACKAGES */
|
||||
|
||||
if (cookie) {
|
||||
*cookie = NULL;
|
||||
|
|
260
lib/package.c
260
lib/package.c
|
@ -9,134 +9,9 @@
|
|||
#include "rpmlead.h"
|
||||
#include "signature.h"
|
||||
|
||||
#if defined(ENABLE_V1_PACKAGES)
|
||||
/* 0 = success */
|
||||
/* !0 = error */
|
||||
static int readOldHeader(FD_t fd, Header * hdr, int * isSource);
|
||||
|
||||
/* 0 = success */
|
||||
/* 1 = bad magic */
|
||||
/* 2 = error */
|
||||
static int readPackageHeaders(FD_t fd, struct rpmlead * leadPtr,
|
||||
Header * sigs, Header * hdrPtr) {
|
||||
Header hdrBlock;
|
||||
struct rpmlead leadBlock;
|
||||
Header * hdr;
|
||||
struct rpmlead * lead;
|
||||
struct oldrpmlead * oldLead;
|
||||
int_8 arch;
|
||||
int isSource;
|
||||
char * defaultPrefix;
|
||||
struct stat sb;
|
||||
int_32 true = 1;
|
||||
|
||||
hdr = hdrPtr ? hdrPtr : &hdrBlock;
|
||||
lead = leadPtr ? leadPtr : &leadBlock;
|
||||
|
||||
oldLead = (struct oldrpmlead *) lead;
|
||||
|
||||
fstat(fdFileno(fd), &sb);
|
||||
/* if fd points to a socket, pipe, etc, sb.st_size is *always* zero */
|
||||
if (S_ISREG(sb.st_mode) && sb.st_size < sizeof(*lead)) return 1;
|
||||
|
||||
if (readLead(fd, lead)) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (lead->magic[0] != RPMLEAD_MAGIC0 || lead->magic[1] != RPMLEAD_MAGIC1 ||
|
||||
lead->magic[2] != RPMLEAD_MAGIC2 || lead->magic[3] != RPMLEAD_MAGIC3) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (lead->major == 1) {
|
||||
rpmMessage(RPMMESS_DEBUG, _("package is a version one package!\n"));
|
||||
|
||||
if (lead->type == RPMLEAD_SOURCE) {
|
||||
rpmMessage(RPMMESS_DEBUG, _("old style source package -- "
|
||||
"I'll do my best\n"));
|
||||
oldLead->archiveOffset = ntohl(oldLead->archiveOffset);
|
||||
rpmMessage(RPMMESS_DEBUG, _("archive offset is %d\n"),
|
||||
oldLead->archiveOffset);
|
||||
(void)fdLseek(fd, oldLead->archiveOffset, SEEK_SET);
|
||||
|
||||
/* we can't put togeher a header for old format source packages,
|
||||
there just isn't enough information there. We'll return
|
||||
NULL <gulp> */
|
||||
|
||||
*hdr = NULL;
|
||||
} else {
|
||||
rpmMessage(RPMMESS_DEBUG, _("old style binary package\n"));
|
||||
readOldHeader(fd, hdr, &isSource);
|
||||
arch = lead->archnum;
|
||||
headerAddEntry(*hdr, RPMTAG_ARCH, RPM_INT8_TYPE, &arch, 1);
|
||||
arch = 1; /* old versions of RPM only supported Linux */
|
||||
headerAddEntry(*hdr, RPMTAG_OS, RPM_INT8_TYPE, &arch, 1);
|
||||
}
|
||||
} else if (lead->major == 2 || lead->major == 3) {
|
||||
if (rpmReadSignature(fd, sigs, lead->signature_type)) {
|
||||
return 2;
|
||||
}
|
||||
*hdr = headerRead(fd, (lead->major >= 3) ?
|
||||
HEADER_MAGIC_YES : HEADER_MAGIC_NO);
|
||||
if (*hdr == NULL) {
|
||||
if (sigs != NULL) headerFree(*sigs);
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* We switched the way we do relocateable packages. We fix some of
|
||||
it up here, though the install code still has to be a bit
|
||||
careful. This fixup makes queries give the new values though,
|
||||
which is quite handy. */
|
||||
if (headerGetEntry(*hdr, RPMTAG_DEFAULTPREFIX, NULL,
|
||||
(void **) &defaultPrefix, NULL)) {
|
||||
defaultPrefix = strcpy(alloca(strlen(defaultPrefix) + 1),
|
||||
defaultPrefix);
|
||||
stripTrailingSlashes(defaultPrefix);
|
||||
headerAddEntry(*hdr, RPMTAG_PREFIXES, RPM_STRING_ARRAY_TYPE,
|
||||
&defaultPrefix, 1);
|
||||
}
|
||||
|
||||
/* XXX binary rpms always have RPMTAG_SOURCERPM, source rpms do not */
|
||||
if (lead->type == RPMLEAD_SOURCE) {
|
||||
if (!headerIsEntry(*hdr, RPMTAG_SOURCEPACKAGE))
|
||||
headerAddEntry(*hdr, RPMTAG_SOURCEPACKAGE, RPM_INT32_TYPE,
|
||||
&true, 1);
|
||||
}
|
||||
} else {
|
||||
rpmError(RPMERR_NEWPACKAGE, _("only packages with major numbers <= 3 "
|
||||
"are supported by this version of RPM"));
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (hdrPtr == NULL) headerFree(*hdr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 0 = success */
|
||||
/* 1 = bad magic */
|
||||
/* 2 = error */
|
||||
int rpmReadPackageInfo(FD_t fd, Header * signatures, Header * hdr) {
|
||||
return readPackageHeaders(fd, NULL, signatures, hdr);
|
||||
}
|
||||
|
||||
/* 0 = success */
|
||||
/* 1 = bad magic */
|
||||
/* 2 = error */
|
||||
int rpmReadPackageHeader(FD_t fd, Header * hdr, int * isSource, int * major,
|
||||
int * minor) {
|
||||
int rc;
|
||||
struct rpmlead lead;
|
||||
|
||||
rc = readPackageHeaders(fd, &lead, NULL, hdr);
|
||||
if (rc) return rc;
|
||||
|
||||
if (isSource) *isSource = lead.type == RPMLEAD_SOURCE;
|
||||
if (major) *major = lead.major;
|
||||
if (minor) *minor = lead.minor;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int readOldHeader(FD_t fd, Header * hdr, int * isSource) {
|
||||
struct oldrpmHeader oldheader;
|
||||
struct oldrpmHeaderSpec spec;
|
||||
|
@ -312,3 +187,136 @@ static int readOldHeader(FD_t fd, Header * hdr, int * isSource) {
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif /* ENABLE_V1_PACKAGES */
|
||||
|
||||
/* 0 = success */
|
||||
/* 1 = bad magic */
|
||||
/* 2 = error */
|
||||
static int readPackageHeaders(FD_t fd, struct rpmlead * leadPtr,
|
||||
Header * sigs, Header * hdrPtr) {
|
||||
Header hdrBlock;
|
||||
struct rpmlead leadBlock;
|
||||
Header * hdr;
|
||||
struct rpmlead * lead;
|
||||
int_8 arch;
|
||||
int isSource;
|
||||
char * defaultPrefix;
|
||||
struct stat sb;
|
||||
int_32 true = 1;
|
||||
|
||||
hdr = hdrPtr ? hdrPtr : &hdrBlock;
|
||||
lead = leadPtr ? leadPtr : &leadBlock;
|
||||
|
||||
fstat(fdFileno(fd), &sb);
|
||||
/* if fd points to a socket, pipe, etc, sb.st_size is *always* zero */
|
||||
if (S_ISREG(sb.st_mode) && sb.st_size < sizeof(*lead)) return 1;
|
||||
|
||||
if (readLead(fd, lead)) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (lead->magic[0] != RPMLEAD_MAGIC0 || lead->magic[1] != RPMLEAD_MAGIC1 ||
|
||||
lead->magic[2] != RPMLEAD_MAGIC2 || lead->magic[3] != RPMLEAD_MAGIC3) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
switch(lead->major) {
|
||||
#if defined(ENABLE_V1_PACKAGES)
|
||||
case 1:
|
||||
rpmMessage(RPMMESS_DEBUG, _("package is a version one package!\n"));
|
||||
|
||||
if (lead->type == RPMLEAD_SOURCE) {
|
||||
struct oldrpmlead * oldLead = (struct oldrpmlead *) lead;
|
||||
|
||||
rpmMessage(RPMMESS_DEBUG, _("old style source package -- "
|
||||
"I'll do my best\n"));
|
||||
oldLead->archiveOffset = ntohl(oldLead->archiveOffset);
|
||||
rpmMessage(RPMMESS_DEBUG, _("archive offset is %d\n"),
|
||||
oldLead->archiveOffset);
|
||||
(void)fdLseek(fd, oldLead->archiveOffset, SEEK_SET);
|
||||
|
||||
/* we can't put togeher a header for old format source packages,
|
||||
there just isn't enough information there. We'll return
|
||||
NULL <gulp> */
|
||||
|
||||
*hdr = NULL;
|
||||
} else {
|
||||
rpmMessage(RPMMESS_DEBUG, _("old style binary package\n"));
|
||||
readOldHeader(fd, hdr, &isSource);
|
||||
arch = lead->archnum;
|
||||
headerAddEntry(*hdr, RPMTAG_ARCH, RPM_INT8_TYPE, &arch, 1);
|
||||
arch = 1; /* old versions of RPM only supported Linux */
|
||||
headerAddEntry(*hdr, RPMTAG_OS, RPM_INT8_TYPE, &arch, 1);
|
||||
}
|
||||
break;
|
||||
#endif /* ENABLE_V1_PACKAGES */
|
||||
|
||||
case 2:
|
||||
case 3:
|
||||
if (rpmReadSignature(fd, sigs, lead->signature_type)) {
|
||||
return 2;
|
||||
}
|
||||
*hdr = headerRead(fd, (lead->major >= 3) ?
|
||||
HEADER_MAGIC_YES : HEADER_MAGIC_NO);
|
||||
if (*hdr == NULL) {
|
||||
if (sigs != NULL) headerFree(*sigs);
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* We switched the way we do relocateable packages. We fix some of
|
||||
it up here, though the install code still has to be a bit
|
||||
careful. This fixup makes queries give the new values though,
|
||||
which is quite handy. */
|
||||
if (headerGetEntry(*hdr, RPMTAG_DEFAULTPREFIX, NULL,
|
||||
(void **) &defaultPrefix, NULL)) {
|
||||
defaultPrefix = strcpy(alloca(strlen(defaultPrefix) + 1),
|
||||
defaultPrefix);
|
||||
stripTrailingSlashes(defaultPrefix);
|
||||
headerAddEntry(*hdr, RPMTAG_PREFIXES, RPM_STRING_ARRAY_TYPE,
|
||||
&defaultPrefix, 1);
|
||||
}
|
||||
|
||||
/* XXX binary rpms always have RPMTAG_SOURCERPM, source rpms do not */
|
||||
if (lead->type == RPMLEAD_SOURCE) {
|
||||
if (!headerIsEntry(*hdr, RPMTAG_SOURCEPACKAGE))
|
||||
headerAddEntry(*hdr, RPMTAG_SOURCEPACKAGE, RPM_INT32_TYPE,
|
||||
&true, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
rpmError(RPMERR_NEWPACKAGE, _("only packages with major numbers <= 3 "
|
||||
"are supported by this version of RPM"));
|
||||
return 2;
|
||||
break;
|
||||
}
|
||||
|
||||
if (hdrPtr == NULL) headerFree(*hdr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 0 = success */
|
||||
/* 1 = bad magic */
|
||||
/* 2 = error */
|
||||
int rpmReadPackageInfo(FD_t fd, Header * signatures, Header * hdr) {
|
||||
return readPackageHeaders(fd, NULL, signatures, hdr);
|
||||
}
|
||||
|
||||
/* 0 = success */
|
||||
/* 1 = bad magic */
|
||||
/* 2 = error */
|
||||
int rpmReadPackageHeader(FD_t fd, Header * hdr, int * isSource, int * major,
|
||||
int * minor) {
|
||||
int rc;
|
||||
struct rpmlead lead;
|
||||
|
||||
rc = readPackageHeaders(fd, &lead, NULL, hdr);
|
||||
if (rc) return rc;
|
||||
|
||||
if (isSource) *isSource = lead.type == RPMLEAD_SOURCE;
|
||||
if (major) *major = lead.major;
|
||||
if (minor) *minor = lead.minor;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
562
po/rpm.pot
562
po/rpm.pot
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue