From 1b87bd9ef75810794edede55d94c25c5d1e94d41 Mon Sep 17 00:00:00 2001 From: jbj Date: Tue, 12 Jun 2001 04:10:21 +0000 Subject: [PATCH] - remove dead code frpm popt table reorg. - more CLI typedefs/prototypes moved from rpmlib.h to rpmcli.h. - rpm --verify skips files in non-installed states. - rpm --verify skips content checks for %ghost files. - rpm --verify displays config/doc/gnost/license/readme atrrs for files. - rpm --verify checks immutable header region digest if available. - rpmbuild adds header region digest (SHA1 as string). - use rpmTag* typedefs in new hge/hae/hme/hre header vectors. CVS patchset: 4854 CVS date: 2001/06/12 04:10:21 --- CHANGES | 8 + build/files.c | 14 +- build/pack.c | 79 ++++--- build/parsePreamble.c | 56 +++-- build/reqprov.c | 12 +- lib/depends.c | 23 +- lib/formats.c | 24 +- lib/header.c | 46 ++-- lib/header.h | 49 ++-- lib/misc.c | 36 +-- lib/misc.h | 13 +- lib/package.c | 23 +- lib/psm.c | 64 ++++-- lib/psm.h | 3 + lib/query.c | 17 +- lib/rpmcli.h | 208 +++++++++++++++-- lib/rpmlib.h | 302 +++++++++---------------- lib/transaction.c | 24 +- lib/verify.c | 235 +++++++++++++------ python/rpmmodule.c | 2 +- rpm.c | 2 +- rpmdb/fprint.c | 2 +- rpmdb/rpmdb.c | 10 +- rpmio/rpmerr.h | 27 ++- rpmqv.c | 614 +------------------------------------------------- 25 files changed, 802 insertions(+), 1091 deletions(-) diff --git a/CHANGES b/CHANGES index d35d7e1..403ddb9 100644 --- a/CHANGES +++ b/CHANGES @@ -87,6 +87,14 @@ - autogen.sh checks for latest libtool-1.4 and automake-1.4-p2. - rpm --verify reports failure(s) if corresponding tag is not in header. - rpm --verify honors %config(missingok), add -v for legacy behavior. + - remove dead code frpm popt table reorg. + - more CLI typedefs/prototypes moved from rpmlib.h to rpmcli.h. + - rpm --verify skips files in non-installed states. + - rpm --verify skips content checks for %ghost files. + - rpm --verify displays config/doc/gnost/license/readme atrrs for files. + - rpm --verify checks immutable header region digest if available. + - rpmbuild adds header region digest (SHA1 as string). + - use rpmTag* typedefs in new hge/hae/hme/hre header vectors. 4.0 -> 4.0.[12] - add doxygen and lclint annotations most everywhere. diff --git a/build/files.c b/build/files.c index 4663591..a5cea7f 100644 --- a/build/files.c +++ b/build/files.c @@ -249,9 +249,9 @@ static void timeCheck(int tc, Header h) /*@modifies internalState @*/ { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; - int *mtime; + int * mtime; const char ** files; - int fnt; + rpmTagType fnt; int count, x; time_t currentTime = time(NULL); @@ -2119,9 +2119,9 @@ top: typedef struct { /*@observer@*/ /*@null@*/ const char * msg; /*@observer@*/ const char * argv[4]; - int ntag; - int vtag; - int ftag; + rpmTag ntag; + rpmTag vtag; + rpmTag ftag; int mask; int xor; } DepMsg_t; @@ -2339,9 +2339,9 @@ static void printDeps(Header h) HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; const char ** names = NULL; - int dnt = -1; + rpmTagType dnt = -1; const char ** versions = NULL; - int dvt = -1; + rpmTagType dvt = -1; int * flags = NULL; DepMsg_t * dm; int count; diff --git a/build/pack.c b/build/pack.c index b15f9d6..cb14e39 100644 --- a/build/pack.c +++ b/build/pack.c @@ -255,14 +255,18 @@ static int processScriptFiles(Spec spec, Package pkg) return 0; } -int readRPM(const char *fileName, Spec *specp, struct rpmlead *lead, Header *sigs, - CSA_t csa) +int readRPM(const char *fileName, Spec *specp, struct rpmlead *lead, + Header *sigs, CSA_t csa) { FD_t fdi; Spec spec; rpmRC rc; + int ec; + + fdi = (fileName != NULL) + ? Fopen(fileName, "r.ufdio") + : fdDup(STDIN_FILENO); - fdi = (fileName != NULL) ? Fopen(fileName, "r.ufdio") : fdDup(STDIN_FILENO); if (fdi == NULL || Ferror(fdi)) { rpmError(RPMERR_BADMAGIC, _("readRPM: open %s: %s\n"), (fileName ? fileName : ""), @@ -279,7 +283,12 @@ int readRPM(const char *fileName, Spec *specp, struct rpmlead *lead, Header *sig return RPMERR_BADMAGIC; } - (void)Fseek(fdi, 0, SEEK_SET); /* XXX FIXME: EPIPE */ + /* XXX FIXME: EPIPE on */ + if (Fseek(fdi, 0, SEEK_SET) == -1) { + rpmError(RPMERR_FSEEK, _("%s: Fseek failed: %s\n"), + (fileName ? fileName : ""), Fstrerror(fdi)); + return RPMERR_FSEEK; + } /* Reallocate build data structures */ spec = newSpec(); @@ -288,7 +297,7 @@ int readRPM(const char *fileName, Spec *specp, struct rpmlead *lead, Header *sig /* XXX the header just allocated will be allocated again */ spec->packages->header = headerFree(spec->packages->header); - /* Read the rpm lead and header */ + /* Read the rpm lead, signatures, and header */ rc = rpmReadPackageInfo(fdi, sigs, &spec->packages->header); switch (rc) { case RPMRC_BADMAGIC: @@ -320,19 +329,28 @@ int readRPM(const char *fileName, Spec *specp, struct rpmlead *lead, Header *sig return 0; } +static unsigned char header_magic[8] = { + 0x8e, 0xad, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00 +}; + int writeRPM(Header *hdrp, const char *fileName, int type, CSA_t csa, char *passPhrase, const char **cookie) { FD_t fd = NULL; FD_t ifd = NULL; int rc, count, sigtype; - const char *sigtarget; + const char * sigtarget; const char * rpmio_flags = NULL; + const char * sha1 = NULL; char *s; char buf[BUFSIZ]; - Header h = *hdrp; + Header h; Header sig = NULL; + /* Transfer header reference form *hdrp to h. */ + h = headerLink(*hdrp); + *hdrp = headerFree(*hdrp); + if (Fileno(csa->cpioFdIn) < 0) { csa->cpioArchiveSize = 0; /* Add a bogus archive size to the Header */ @@ -340,18 +358,6 @@ int writeRPM(Header *hdrp, const char *fileName, int type, &csa->cpioArchiveSize, 1); } -#ifdef DYING - /* Choose how filenames are represented. */ - if (_noDirTokens) - expandFilelist(h); - else { - compressFilelist(h); - /* Binary packages with dirNames cannot be installed by legacy rpm. */ - if (type == RPMLEAD_BINARY) - rpmlibNeedsFeature(h, "CompressedFileNames", "3.0.4-1"); - } -#endif - /* Binary packages now have explicit Provides: name = version-release. */ if (type == RPMLEAD_BINARY) providePackageNVR(h); @@ -394,21 +400,21 @@ int writeRPM(Header *hdrp, const char *fileName, int type, } /* Reallocate the header into one contiguous region. */ - /*@-refcounttrans -usereleased@*/ - *hdrp = h = headerReload(h, RPMTAG_HEADERIMMUTABLE); + h = headerReload(h, RPMTAG_HEADERIMMUTABLE); if (h == NULL) { /* XXX can't happen */ rc = RPMERR_RELOAD; goto exit; } - /*@=refcounttrans =usereleased@*/ + /* Re-reference reallocated header. */ + *hdrp = headerLink(h); /* * Write the header+archive into a temp file so that the size of * archive (after compression) can be added to the header. */ if (makeTempFile(NULL, &sigtarget, &fd)) { - rpmError(RPMERR_CREATE, _("Unable to open temp file.\n")); rc = RPMERR_CREATE; + rpmError(RPMERR_CREATE, _("Unable to open temp file.\n")); goto exit; } @@ -434,8 +440,10 @@ int writeRPM(Header *hdrp, const char *fileName, int type, * This used to be done using headerModifyEntry(), but now that headers * have regions, the value is scribbled directly into the header data * area. Some new scheme for adding the final archive size will have - * to be devised if headerGetEntry() ever changes to return a pointer - * to memory not in the region. + * to be devised if headerGetEntryMinMemory() ever changes to return + * a pointer to memory not in the region, probably by appending + * the archive size to the header region rather than including the + * archive size within the header region. */ if (Fileno(csa->cpioFdIn) < 0) { HGE_t hge = (HGE_t)headerGetEntryMinMemory; @@ -444,10 +452,18 @@ int writeRPM(Header *hdrp, const char *fileName, int type, *archiveSize = csa->cpioArchiveSize; } - (void)Fseek(fd, 0, SEEK_SET); + (void) Fflush(fd); + if (Fseek(fd, sizeof(header_magic), SEEK_SET) == -1) { + rc = RPMERR_FSEEK; + rpmError(RPMERR_FSEEK, _("%s: Fseek failed: %s\n"), + sigtarget, Fstrerror(fd)); + } - if (headerWrite(fd, h, HEADER_MAGIC_YES)) + fdInitSHA1(fd); + if (headerWrite(fd, h, HEADER_MAGIC_NO)) rc = RPMERR_NOSPACE; + (void) Fflush(fd); + fdFiniSHA1(fd, (void **)&sha1, NULL, 1); (void) Fclose(fd); fd = NULL; @@ -465,6 +481,11 @@ int writeRPM(Header *hdrp, const char *fileName, int type, rpmMessage(RPMMESS_NORMAL, _("Generating signature: %d\n"), sigtype); (void) rpmAddSignature(sig, sigtarget, sigtype, passPhrase); } + + if (sha1) { + (void) headerAddEntry(sig, RPMTAG_SHA1HEADER, RPM_STRING_TYPE, sha1, 1); + sha1 = _free(sha1); + } /* Reallocate the signature into one contiguous region. */ sig = headerReload(sig, RPMTAG_HEADERSIGNATURES); @@ -577,6 +598,8 @@ int writeRPM(Header *hdrp, const char *fileName, int type, rc = 0; exit: + sha1 = _free(sha1); + h = headerFree(h); sig = rpmFreeSignature(sig); if (ifd) { (void) Fclose(ifd); @@ -596,9 +619,7 @@ exit: else (void) Unlink(fileName); - /*@-nullstate@*/ /* FIX: *hdrp may be NULL */ return rc; - /*@=nullstate@*/ } static int_32 copyTags[] = { diff --git a/build/parsePreamble.c b/build/parsePreamble.c index a11e5ce..efb5a4f 100644 --- a/build/parsePreamble.c +++ b/build/parsePreamble.c @@ -13,7 +13,7 @@ /** */ -/*@observer@*/ static int_32 copyTagsDuringParse[] = { +/*@observer@*/ static rpmTag copyTagsDuringParse[] = { RPMTAG_EPOCH, RPMTAG_VERSION, RPMTAG_RELEASE, @@ -33,7 +33,7 @@ /** */ -/*@observer@*/ static int requiredTags[] = { +/*@observer@*/ static rpmTag requiredTags[] = { RPMTAG_NAME, RPMTAG_VERSION, RPMTAG_RELEASE, @@ -187,13 +187,14 @@ static inline char * findLastChar(char * s) /** */ -static int isMemberInEntry(Header h, const char *name, int tag) +static int isMemberInEntry(Header h, const char *name, rpmTag tag) /*@*/ { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; const char ** names; - int type, count; + rpmTagType type; + int count; if (!hge(h, tag, &type, (void **)&names, &count)) return -1; @@ -246,18 +247,22 @@ static int checkForValidArchitectures(Spec spec) } /** + * Check that required tags are present in header. + * @param h header + * @param NVR package name-version-release + * @return 0 if OK */ -static int checkForRequired(Header h, const char *name) +static int checkForRequired(Header h, const char * NVR) /*@*/ { int res = 0; - int *p; + rpmTag * p; for (p = requiredTags; *p != 0; p++) { if (!headerIsEntry(h, *p)) { rpmError(RPMERR_BADSPEC, _("%s field must be present in package: %s\n"), - tagName(*p), name); + tagName(*p), NVR); res = 1; } } @@ -266,8 +271,12 @@ static int checkForRequired(Header h, const char *name) } /** + * Check that no duplicate tags are present in header. + * @param h header + * @param NVR package name-version-release + * @return 0 if OK */ -static int checkForDuplicates(Header h, const char *name) +static int checkForDuplicates(Header h, const char * NVR) /*@modifies h @*/ { int res = 0; @@ -281,7 +290,7 @@ static int checkForDuplicates(Header h, const char *name) if (tag != lastTag) continue; rpmError(RPMERR_BADSPEC, _("Duplicate %s entries in package: %s\n"), - tagName(tag), name); + tagName(tag), NVR); res = 1; } headerFreeIterator(hi); @@ -292,7 +301,7 @@ static int checkForDuplicates(Header h, const char *name) /** */ static struct optionalTag { - int ot_tag; + rpmTag ot_tag; /*@observer@*/ /*@null@*/ const char * ot_mac; } optionalTags[] = { { RPMTAG_VENDOR, "%{vendor}" }, @@ -432,12 +441,12 @@ static int handlePreambleTag(Spec spec, Package pkg, int tag, const char *macro, { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; - char *field = spec->line; - char *end; - char **array; + char * field = spec->line; + char * end; + char ** array; int multiToken = 0; rpmsenseFlags tagflags; - int type; + rpmTagType type; int len; int num; int rc; @@ -680,7 +689,7 @@ static int handlePreambleTag(Spec spec, Package pkg, int tag, const char *macro, /** */ typedef struct PreambleRec_s { - int tag; + rpmTag tag; int len; int multiLang; /*@observer@*/ /*@null@*/ const char * token; @@ -806,10 +815,10 @@ int parsePreamble(Spec spec, int initialPackage) char *name, *linep; int flag; Package pkg; - char fullName[BUFSIZ]; + char NVR[BUFSIZ]; char lang[BUFSIZ]; - strcpy(fullName, "(main package)"); + strcpy(NVR, "(main package)"); pkg = newPackage(spec); @@ -831,10 +840,10 @@ int parsePreamble(Spec spec, int initialPackage) if (flag == PART_SUBNAME) { const char * mainName; (void) headerNVR(spec->packages->header, &mainName, NULL, NULL); - sprintf(fullName, "%s-%s", mainName, name); + sprintf(NVR, "%s-%s", mainName, name); } else - strcpy(fullName, name); - (void) headerAddEntry(pkg->header, RPMTAG_NAME, RPM_STRING_TYPE, fullName, 1); + strcpy(NVR, name); + (void) headerAddEntry(pkg->header, RPMTAG_NAME, RPM_STRING_TYPE, NVR, 1); } if ((rc = readLine(spec, STRIP_TRAILINGSPACE | STRIP_COMMENTS)) > 0) { @@ -882,13 +891,14 @@ int parsePreamble(Spec spec, int initialPackage) if (pkg == spec->packages) fillOutMainPackage(pkg->header); - if (checkForDuplicates(pkg->header, fullName)) + if (checkForDuplicates(pkg->header, NVR)) return RPMERR_BADSPEC; if (pkg != spec->packages) - headerCopyTags(spec->packages->header, pkg->header, copyTagsDuringParse); + headerCopyTags(spec->packages->header, pkg->header, + (int_32 *)copyTagsDuringParse); - if (checkForRequired(pkg->header, fullName)) + if (checkForRequired(pkg->header, NVR)) return RPMERR_BADSPEC; return nextPart; diff --git a/build/reqprov.c b/build/reqprov.c index efba0b3..98df9bd 100644 --- a/build/reqprov.c +++ b/build/reqprov.c @@ -15,11 +15,11 @@ int addReqProv(/*@unused@*/ Spec spec, Header h, HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; const char ** names; - int dnt; - int nametag = 0; - int versiontag = 0; - int flagtag = 0; - int indextag = 0; + rpmTagType dnt; + rpmTag nametag = 0; + rpmTag versiontag = 0; + rpmTag flagtag = 0; + rpmTag indextag = 0; int len; rpmsenseFlags extra = RPMSENSE_ANY; @@ -62,7 +62,7 @@ int addReqProv(/*@unused@*/ Spec spec, Header h, /* Check for duplicate dependencies. */ if (hge(h, nametag, &dnt, (void **) &names, &len)) { const char ** versions = NULL; - int dvt = RPM_STRING_ARRAY_TYPE; + rpmTagType dvt = RPM_STRING_ARRAY_TYPE; int *flags = NULL; int *indexes = NULL; int duplicate = 0; diff --git a/lib/depends.c b/lib/depends.c index 79002de..b03e9f1 100644 --- a/lib/depends.c +++ b/lib/depends.c @@ -27,7 +27,9 @@ int headerNVR(Header h, const char **np, const char **vp, const char **rp) { - int type, count; + int type; + int count; + if (np) { if (!(headerGetEntry(h, RPMTAG_NAME, &type, (void **) np, &count) && type == RPM_STRING_TYPE && count == 1)) @@ -58,7 +60,7 @@ static /*@only@*/ char * printDepend(const char * depend, const char * key, const char * keyEVR, int keyFlags) /*@*/ { - char *tbuf, *t; + char * tbuf, * t; size_t nb; nb = 0; @@ -240,7 +242,7 @@ alAddPackage(availableList al, { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; - int dnt, bnt; + rpmTagType dnt, bnt; struct availablePackage * p; rpmRelocation * r; int i; @@ -605,7 +607,7 @@ static int rangeMatchesDepFlags (Header h, { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; - int pnt, pvt; + rpmTagType pnt, pvt; const char ** provides; const char ** providesEVR; int_32 * provideFlags; @@ -789,7 +791,7 @@ int rpmtransAddPackage(rpmTransactionSet ts, Header h, FD_t fd, { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; - int ont, ovt; + rpmTagType ont, ovt; /* this is an install followed by uninstalls */ const char * name; int count; @@ -1361,8 +1363,8 @@ static int checkPackageDeps(rpmTransactionSet ts, problemsSet psp, { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; - int rnt, rvt; - int cnt, cvt; + rpmTagType rnt, rvt; + rpmTagType cnt, cvt; const char * name, * version, * release; const char ** requires; const char ** requiresEVR = NULL; @@ -1372,7 +1374,7 @@ static int checkPackageDeps(rpmTransactionSet ts, problemsSet psp, const char ** conflictsEVR = NULL; int_32 * conflictFlags = NULL; int conflictsCount = 0; - int type; + rpmTagType type; int i, rc; int ourrc = 0; struct availablePackage ** suggestion; @@ -2211,7 +2213,7 @@ int rpmdepCheck(rpmTransactionSet ts, { const char ** provides; int providesCount; - int pnt; + rpmTagType pnt; if (hge(h, RPMTAG_PROVIDENAME, &pnt, (void **) &provides, &providesCount)) @@ -2231,7 +2233,8 @@ int rpmdepCheck(rpmTransactionSet ts, } { const char ** baseNames, ** dirNames; - int_32 * dirIndexes, dnt, bnt; + int_32 * dirIndexes; + rpmTagType dnt, bnt; int fileCount; char * fileName = NULL; int fileAlloced = 0; diff --git a/lib/formats.c b/lib/formats.c index d48be37..1a9bef8 100644 --- a/lib/formats.c +++ b/lib/formats.c @@ -175,7 +175,7 @@ static int fsnamesTag( /*@unused@*/ Header h, /*@out@*/ int_32 * type, * @retval freedata address of data-was-malloc'ed indicator * @return 0 on success */ -static int instprefixTag(Header h, /*@null@*/ /*@out@*/ int_32 * type, +static int instprefixTag(Header h, /*@null@*/ /*@out@*/ rpmTagType * type, /*@null@*/ /*@out@*/ const void ** data, /*@null@*/ /*@out@*/ int_32 * count, /*@null@*/ /*@out@*/ int * freeData) @@ -183,7 +183,7 @@ static int instprefixTag(Header h, /*@null@*/ /*@out@*/ int_32 * type, { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; - int ipt; + rpmTagType ipt; char ** array; if (hge(h, RPMTAG_INSTALLPREFIX, type, (void **)data, count)) { @@ -208,7 +208,7 @@ static int instprefixTag(Header h, /*@null@*/ /*@out@*/ int_32 * type, * @retval freedata address of data-was-malloc'ed indicator * @return 0 on success */ -static int fssizesTag(Header h, /*@out@*/ int_32 * type, +static int fssizesTag(Header h, /*@out@*/ rpmTagType * type, /*@out@*/ const void ** data, /*@out@*/ int_32 * count, /*@out@*/ int * freeData) /*@modifies *type, *data, *count, *freeData @*/ @@ -259,14 +259,14 @@ static int fssizesTag(Header h, /*@out@*/ int_32 * type, * @retval freedata address of data-was-malloc'ed indicator * @return 0 on success */ -static int triggercondsTag(Header h, /*@out@*/ int_32 * type, +static int triggercondsTag(Header h, /*@out@*/ rpmTagType * type, /*@out@*/ const void ** data, /*@out@*/ int_32 * count, /*@out@*/ int * freeData) /*@modifies *type, *data, *count, *freeData @*/ { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; - int tnt, tvt, tst; + rpmTagType tnt, tvt, tst; int_32 * indices, * flags; char ** names, ** versions; int numNames, numScripts; @@ -330,14 +330,14 @@ static int triggercondsTag(Header h, /*@out@*/ int_32 * type, * @retval freedata address of data-was-malloc'ed indicator * @return 0 on success */ -static int triggertypeTag(Header h, /*@out@*/ int_32 * type, +static int triggertypeTag(Header h, /*@out@*/ rpmTagType * type, /*@out@*/ const void ** data, /*@out@*/ int_32 * count, /*@out@*/ int * freeData) /*@modifies *type, *data, *count, *freeData @*/ { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; - int tst; + rpmTagType tst; int_32 * indices, * flags; const char ** conds; const char ** s; @@ -382,7 +382,7 @@ static int triggertypeTag(Header h, /*@out@*/ int_32 * type, * @retval freedata address of data-was-malloc'ed indicator * @return 0 on success */ -static int filenamesTag(Header h, /*@out@*/ int_32 * type, +static int filenamesTag(Header h, /*@out@*/ rpmTagType * type, /*@out@*/ const void ** data, /*@out@*/ int_32 * count, /*@out@*/ int * freeData) /*@modifies *type, *data, *count, *freeData @*/ @@ -416,7 +416,7 @@ int _nl_msg_cat_cntr; /* XXX GNU gettext voodoo */ * @retval freedata address of data-was-malloc'ed indicator * @return 0 on success */ -static int i18nTag(Header h, int_32 tag, /*@out@*/ int_32 * type, +static int i18nTag(Header h, int_32 tag, /*@out@*/ rpmTagType * type, /*@out@*/ const void ** data, /*@out@*/ int_32 * count, /*@out@*/ int * freeData) /*@modifies *type, *data, *count, *freeData @*/ @@ -500,7 +500,7 @@ static int i18nTag(Header h, int_32 tag, /*@out@*/ int_32 * type, * @retval freedata address of data-was-malloc'ed indicator * @return 0 on success */ -static int summaryTag(Header h, /*@out@*/ int_32 * type, +static int summaryTag(Header h, /*@out@*/ rpmTagType * type, /*@out@*/ const void ** data, /*@out@*/ int_32 * count, /*@out@*/ int * freeData) /*@modifies *type, *data, *count, *freeData @*/ @@ -516,7 +516,7 @@ static int summaryTag(Header h, /*@out@*/ int_32 * type, * @retval freedata address of data-was-malloc'ed indicator * @return 0 on success */ -static int descriptionTag(Header h, /*@out@*/ int_32 * type, +static int descriptionTag(Header h, /*@out@*/ rpmTagType * type, /*@out@*/ const void ** data, /*@out@*/ int_32 * count, /*@out@*/ int * freeData) /*@modifies *type, *data, *count, *freeData @*/ @@ -532,7 +532,7 @@ static int descriptionTag(Header h, /*@out@*/ int_32 * type, * @retval freedata address of data-was-malloc'ed indicator * @return 0 on success */ -static int groupTag(Header h, /*@out@*/ int_32 * type, +static int groupTag(Header h, /*@out@*/ rpmTagType * type, /*@out@*/ const void ** data, /*@out@*/ int_32 * count, /*@out@*/ int * freeData) /*@modifies *type, *data, *count, *freeData @*/ diff --git a/lib/header.c b/lib/header.c index 5513282..c6dd176 100644 --- a/lib/header.c +++ b/lib/header.c @@ -955,10 +955,10 @@ Header headerReload(Header h, int tag) /*@-onlytrans@*/ void * uh = doHeaderUnload(h, &length); - if (uh == NULL) - return NULL; h = headerFree(h); /*@=onlytrans@*/ + if (uh == NULL) + return NULL; nh = headerLoad(uh); if (nh == NULL) { uh = _free(uh); @@ -1080,16 +1080,16 @@ void headerDump(Header h, FILE *f, int flags, " OFSET COUNT\n"); for (i = 0; i < h->indexUsed; i++) { switch (p->info.type) { - case RPM_NULL_TYPE: type = "NULL_TYPE"; break; - case RPM_CHAR_TYPE: type = "CHAR_TYPE"; break; - case RPM_BIN_TYPE: type = "BIN_TYPE"; break; - case RPM_INT8_TYPE: type = "INT8_TYPE"; break; - case RPM_INT16_TYPE: type = "INT16_TYPE"; break; - case RPM_INT32_TYPE: type = "INT32_TYPE"; break; - /*case RPM_INT64_TYPE: type = "INT64_TYPE"; break;*/ - case RPM_STRING_TYPE: type = "STRING_TYPE"; break; - case RPM_STRING_ARRAY_TYPE: type = "STRING_ARRAY_TYPE"; break; - case RPM_I18NSTRING_TYPE: type = "I18N_STRING_TYPE"; break; + case RPM_NULL_TYPE: type = "NULL"; break; + case RPM_CHAR_TYPE: type = "CHAR"; break; + case RPM_BIN_TYPE: type = "BIN"; break; + case RPM_INT8_TYPE: type = "INT8"; break; + case RPM_INT16_TYPE: type = "INT16"; break; + case RPM_INT32_TYPE: type = "INT32"; break; + /*case RPM_INT64_TYPE: type = "INT64"; break;*/ + case RPM_STRING_TYPE: type = "STRING"; break; + case RPM_STRING_ARRAY_TYPE: type = "STRING_ARRAY"; break; + case RPM_I18NSTRING_TYPE: type = "I18N_STRING"; break; default: type = "(unknown)"; break; } @@ -1101,9 +1101,9 @@ void headerDump(Header h, FILE *f, int flags, else tag = tage->name; - fprintf(f, "Entry : %.3d (%d)%-14s %-18s 0x%.8x %.8d\n", i, - p->info.tag, tag, type, (unsigned) p->info.offset, (int) - p->info.count); + fprintf(f, "Entry : %3.3d (%d)%-14s %-18s 0x%.8x %.8d\n", i, + p->info.tag, tag, type, (unsigned) p->info.offset, + (int) p->info.count); if (flags & HEADER_DUMP_INLINE) { char *dp = p->data; @@ -1802,8 +1802,8 @@ int headerAddI18NString(Header h, int_32 tag, const char * string, const char * return 0; } -/* if there are multiple entries with this tag, the first one gets replaced */ -int headerModifyEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c) +int headerModifyEntry(Header h, int_32 tag, int_32 type, + const void * p, int_32 c) { struct indexEntry *entry; void * oldData; @@ -1834,14 +1834,15 @@ int headerModifyEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c) } int headerAddOrAppendEntry(Header h, int_32 tag, int_32 type, - void * p, int_32 c) + const void * p, int_32 c) { return (findEntry(h, tag, type) ? headerAppendEntry(h, tag, type, p, c) : headerAddEntry(h, tag, type, p, c)); } -int headerAppendEntry(Header h, int_32 tag, int_32 type, void * p, int_32 c) +int headerAppendEntry(Header h, int_32 tag, int_32 type, + const void * p, int_32 c) { struct indexEntry *entry; int length; @@ -2892,16 +2893,17 @@ const struct headerSprintfExtension headerDefaultFormats[] = { { HEADER_EXT_LAST, NULL, { NULL } } }; -void headerCopyTags(Header headerFrom, Header headerTo, int *tagstocopy) +void headerCopyTags(Header headerFrom, Header headerTo, int_32 * tagstocopy) { - int *p; + int * p; if (headerFrom == headerTo) return; for (p = tagstocopy; *p != 0; p++) { char *s; - int type, count; + int_32 type; + int_32 count; if (headerIsEntry(headerTo, *p)) continue; if (!headerGetEntryMinMemory(headerFrom, *p, &type, diff --git a/lib/header.h b/lib/header.h index deb15e3..0412507 100644 --- a/lib/header.h +++ b/lib/header.h @@ -334,7 +334,8 @@ int headerAddEntry(Header h, int_32 tag, int_32 type, const void *p, int_32 c) * @param c number of values * @return 1 on success, 0 on failure */ -int headerModifyEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c) +int headerModifyEntry(Header h, int_32 tag, int_32 type, + const void * p, int_32 c) /*@modifies h @*/; /** \ingroup header @@ -367,8 +368,8 @@ int headerModifyEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c) * @return 1 on success, 0 on failure */ int headerAddI18NString(Header h, int_32 tag, const char * string, - const char * lang) - /*@modifies h @*/; + const char * lang) + /*@modifies h @*/; /** \ingroup header * Append element to tag array in header. @@ -384,7 +385,8 @@ int headerAddI18NString(Header h, int_32 tag, const char * string, * @param c number of values * @return 1 on success, 0 on failure */ -int headerAppendEntry(Header h, int_32 tag, int_32 type, void * p, int_32 c) +int headerAppendEntry(Header h, int_32 tag, int_32 type, + const void * p, int_32 c) /*@modifies h @*/; /** \ingroup header @@ -397,8 +399,9 @@ int headerAppendEntry(Header h, int_32 tag, int_32 type, void * p, int_32 c) * @param c number of values * @return 1 on success, 0 on failure */ -int headerAddOrAppendEntry(Header h, int_32 tag, int_32 type, void * p, int_32 c) - /*@modifies h @*/; +int headerAddOrAppendEntry(Header h, int_32 tag, int_32 type, + const void * p, int_32 c) + /*@modifies h @*/; /** \ingroup header * Retrieve tag value. @@ -414,10 +417,10 @@ int headerAddOrAppendEntry(Header h, int_32 tag, int_32 type, void * p, int_32 c * @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 @*/; + /*@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. @@ -432,10 +435,10 @@ int headerGetEntry(Header h, int_32 tag, * @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 @*/; + /*@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. @@ -451,10 +454,10 @@ int headerGetEntryMinMemory(Header h, int_32 tag, */ /*@-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 @*/; + /*@null@*/ /*@out@*/ int_32 * type, + /*@null@*/ /*@out@*/ const void ** p, + /*@null@*/ /*@out@*/ int_32 * c) + /*@modifies *type, *p, *c @*/; /*@=exportlocal@*/ /** \ingroup header @@ -495,9 +498,11 @@ HeaderIterator headerInitIterator(Header h) * @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 @*/; + /*@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. @@ -536,7 +541,7 @@ void headerUnsort(Header h) * @param headerTo destination header * @param tagstocopy array of tags that are copied */ -void headerCopyTags(Header headerFrom, Header headerTo, int_32 *tagstocopy) +void headerCopyTags(Header headerFrom, Header headerTo, int_32 * tagstocopy) /*@modifies headerFrom, headerTo @*/; /** \ingroup header diff --git a/lib/misc.c b/lib/misc.c index e9693e6..08d14ae 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -393,11 +393,14 @@ static int dncmp(const void * a, const void * b) void compressFilelist(Header h) { HGE_t hge = (HGE_t)headerGetEntryMinMemory; + HAE_t hae = (HAE_t)headerAddEntry; + HRE_t hre = (HRE_t)headerRemoveEntry; + HFD_t hfd = headerFreeData; char ** fileNames; const char ** dirNames; const char ** baseNames; int_32 * dirIndexes; - int fnt; + rpmTagType fnt; int count; int i; int dirIndex = -1; @@ -409,7 +412,7 @@ void compressFilelist(Header h) */ if (headerIsEntry(h, RPMTAG_DIRNAMES)) { - (void) headerRemoveEntry(h, RPMTAG_OLDFILENAMES); + (void) hre(h, RPMTAG_OLDFILENAMES); return; /* Already converted. */ } @@ -462,17 +465,16 @@ void compressFilelist(Header h) exit: if (count > 0) { - (void) headerAddEntry(h, RPMTAG_DIRINDEXES, RPM_INT32_TYPE, - dirIndexes, count); - (void) headerAddEntry(h, RPMTAG_BASENAMES, RPM_STRING_ARRAY_TYPE, + (void) hae(h, RPMTAG_DIRINDEXES, RPM_INT32_TYPE, dirIndexes, count); + (void) hae(h, RPMTAG_BASENAMES, RPM_STRING_ARRAY_TYPE, baseNames, count); - (void) headerAddEntry(h, RPMTAG_DIRNAMES, RPM_STRING_ARRAY_TYPE, + (void) hae(h, RPMTAG_DIRNAMES, RPM_STRING_ARRAY_TYPE, dirNames, dirIndex + 1); } - fileNames = headerFreeData(fileNames, fnt); + fileNames = hfd(fileNames, fnt); - (void) headerRemoveEntry(h, RPMTAG_OLDFILENAMES); + (void) hre(h, RPMTAG_OLDFILENAMES); } /* @@ -480,8 +482,8 @@ exit: * is getting all of this into a single xmalloc'd block. */ static void doBuildFileList(Header h, /*@out@*/ const char *** fileListPtr, - /*@out@*/ int * fileCountPtr, int baseNameTag, - int dirNameTag, int dirIndexesTag) + /*@out@*/ int * fileCountPtr, rpmTag baseNameTag, + rpmTag dirNameTag, rpmTag dirIndexesTag) { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; @@ -491,7 +493,7 @@ static void doBuildFileList(Header h, /*@out@*/ const char *** fileListPtr, int count; const char ** fileNames; int size; - int bnt, dnt; + rpmTagType bnt, dnt; char * data; int i; @@ -527,6 +529,8 @@ static void doBuildFileList(Header h, /*@out@*/ const char *** fileListPtr, void expandFilelist(Header h) { + HAE_t hae = (HAE_t)headerAddEntry; + HRE_t hre = (HRE_t)headerRemoveEntry; const char ** fileNames = NULL; int count = 0; @@ -535,14 +539,14 @@ void expandFilelist(Header h) RPMTAG_DIRNAMES, RPMTAG_DIRINDEXES); if (fileNames == NULL || count <= 0) return; - (void) headerAddEntry(h, RPMTAG_OLDFILENAMES, RPM_STRING_ARRAY_TYPE, + (void) hae(h, RPMTAG_OLDFILENAMES, RPM_STRING_ARRAY_TYPE, fileNames, count); fileNames = _free(fileNames); } - (void) headerRemoveEntry(h, RPMTAG_DIRNAMES); - (void) headerRemoveEntry(h, RPMTAG_BASENAMES); - (void) headerRemoveEntry(h, RPMTAG_DIRINDEXES); + (void) hre(h, RPMTAG_DIRNAMES); + (void) hre(h, RPMTAG_BASENAMES); + (void) hre(h, RPMTAG_DIRINDEXES); } @@ -802,7 +806,7 @@ void providePackageNVR(Header h) int_32 pFlags = RPMSENSE_EQUAL; const char ** provides = NULL; const char ** providesEVR = NULL; - int pnt, pvt; + rpmTagType pnt, pvt; int_32 * provideFlags = NULL; int providesCount; int i; diff --git a/lib/misc.h b/lib/misc.h index 2e909dd..ea275c8 100644 --- a/lib/misc.h +++ b/lib/misc.h @@ -68,8 +68,19 @@ int doputenv(const char * str) /*@modifies fileSystem @*/; /** + * Return file handle for a temporaray file. + * A unique temporaray file path will be generated using + * rpmGenPath(prefix, "%{_tmppath}/", "rpm-tmp.XXXXX") + * where "XXXXXX" is filled in using rand(3). The file is opened, and + * the link count and (dev,ino) location are * verified after opening. + * The file name and the open file handle are returned. + * + * @param prefix leading part of temp file path + * @retval fnptr temp file name (or NULL) + * @retval fdptr temp file handle + * @return 0 on success */ -int makeTempFile(const char * prefix, +int makeTempFile(/*@null@*/ const char * prefix, /*@null@*/ /*@out@*/ const char ** fnptr, /*@out@*/ FD_t * fdptr) /*@modifies *fnptr, *fdptr, fileSystem @*/; diff --git a/lib/package.c b/lib/package.c index b737d9f..1958321 100644 --- a/lib/package.c +++ b/lib/package.c @@ -22,13 +22,15 @@ /*@-mods@*/ void headerMergeLegacySigs(Header h, const Header sig) { + HFD_t hfd = (HFD_t) headerFreeData; + HAE_t hae = (HAE_t) headerAddEntry; HeaderIterator hi; int_32 tag, type, count; const void * ptr; for (hi = headerInitIterator(sig); headerNextIterator(hi, &tag, &type, &ptr, &count); - ptr = headerFreeData(ptr, type)) + ptr = hfd(ptr, type)) { switch (tag) { case RPMSIGTAG_SIZE: tag = RPMTAG_SIGSIZE; break; @@ -39,18 +41,20 @@ void headerMergeLegacySigs(Header h, const Header sig) case RPMSIGTAG_GPG: tag = RPMTAG_SIGGPG; break; case RPMSIGTAG_PGP5: tag = RPMTAG_SIGPGP5; break; default: - continue; - /*@notreached@*/ break; + if (!(tag >= HEADER_SIGBASE && tag < HEADER_TAGBASE)) + continue; + break; } if (ptr == NULL) continue; /* XXX can't happen */ if (!headerIsEntry(h, tag)) - (void) headerAddEntry(h, tag, type, ptr, count); + (void) hae(h, tag, type, ptr, count); } headerFreeIterator(hi); } Header headerRegenSigHeader(const Header h) { + HFD_t hfd = (HFD_t) headerFreeData; Header sig = rpmNewSignature(); HeaderIterator hi; int_32 tag, stag, type, count; @@ -58,7 +62,7 @@ Header headerRegenSigHeader(const Header h) for (hi = headerInitIterator(h); headerNextIterator(hi, &tag, &type, &ptr, &count); - ptr = headerFreeData(ptr, type)) + ptr = hfd(ptr, type)) { switch (tag) { case RPMTAG_SIGSIZE: stag = RPMSIGTAG_SIZE; break; @@ -69,8 +73,10 @@ Header headerRegenSigHeader(const Header h) case RPMTAG_SIGGPG: stag = RPMSIGTAG_GPG; break; case RPMTAG_SIGPGP5: stag = RPMSIGTAG_PGP5; break; default: - continue; - /*@notreached@*/ break; + if (!(tag >= HEADER_SIGBASE && tag < HEADER_TAGBASE)) + continue; + stag = tag; + break; } if (ptr == NULL) continue; /* XXX can't happen */ if (!headerIsEntry(sig, stag)) @@ -156,7 +162,8 @@ static rpmRC readPackageHeaders(FD_t fd, * which is quite handy. */ if (headerGetEntry(*hdr, RPMTAG_DEFAULTPREFIX, NULL, - (void **) &defaultPrefix, NULL)) { + (void **) &defaultPrefix, NULL)) + { defaultPrefix = stripTrailingChar(alloca_strdup(defaultPrefix), '/'); (void) headerAddEntry(*hdr, RPMTAG_PREFIXES, RPM_STRING_ARRAY_TYPE, diff --git a/lib/psm.c b/lib/psm.c index d3c8328..60f2bb7 100644 --- a/lib/psm.c +++ b/lib/psm.c @@ -79,7 +79,9 @@ void loadFi(Header h, TFI_t fi) hge = (fi->type == TR_ADDED) ? (HGE_t) headerGetEntryMinMemory : (HGE_t) headerGetEntry; fi->hge = hge; - + fi->hae = (HAE_t) headerAddEntry; + fi->hme = (HME_t) headerModifyEntry; + fi->hre = (HRE_t) headerRemoveEntry; fi->hfd = hfd = headerFreeData; if (h && fi->h == NULL) fi->h = headerLink(h); @@ -236,33 +238,34 @@ void freeFi(TFI_t fi) */ static struct tagMacro { /*@observer@*/ /*@null@*/ const char * macroname; /*!< Macro name to define. */ - int tag; /*!< Header tag to use for value. */ + rpmTag tag; /*!< Header tag to use for value. */ } tagMacros[] = { { "name", RPMTAG_NAME }, { "version", RPMTAG_VERSION }, { "release", RPMTAG_RELEASE }, -#if 0 { "epoch", RPMTAG_EPOCH }, -#endif { NULL, 0 } }; /** * Define per-header macros. + * @param fi transaction element file info * @param h header * @return 0 always */ static int rpmInstallLoadMacros(TFI_t fi, Header h) /*@modifies internalState @*/ { - HGE_t hge = (HGE_t)fi->hge; - struct tagMacro *tagm; + HGE_t hge = (HGE_t) fi->hge; + struct tagMacro * tagm; union { - const char * ptr; +/*@unused@*/ void * ptr; +/*@unused@*/ const char ** argv; + const char * str; int_32 * i32p; } body; char numbuf[32]; - int_32 type; + rpmTagType type; for (tagm = tagMacros; tagm->macroname != NULL; tagm++) { if (!hge(h, tagm->tag, &type, (void **) &body, NULL)) @@ -273,7 +276,16 @@ static int rpmInstallLoadMacros(TFI_t fi, Header h) addMacro(NULL, tagm->macroname, NULL, numbuf, -1); break; case RPM_STRING_TYPE: - addMacro(NULL, tagm->macroname, NULL, body.ptr, -1); + addMacro(NULL, tagm->macroname, NULL, body.str, -1); + break; + case RPM_NULL_TYPE: + case RPM_CHAR_TYPE: + case RPM_INT8_TYPE: + case RPM_INT16_TYPE: + case RPM_BIN_TYPE: + case RPM_STRING_ARRAY_TYPE: + case RPM_I18NSTRING_TYPE: + default: break; } } @@ -291,10 +303,11 @@ static int mergeFiles(TFI_t fi, Header h, Header newH) /*@modifies h @*/ { HGE_t hge = (HGE_t)fi->hge; + HME_t hme = (HME_t)fi->hme; HFD_t hfd = (fi->hfd ? fi->hfd : headerFreeData); fileAction * actions = fi->actions; int i, j, k, fc; - int_32 type = 0; + rpmTagType type = 0; int_32 count = 0; int_32 dirNamesCount, dirCount; void * data, * newdata; @@ -302,7 +315,7 @@ static int mergeFiles(TFI_t fi, Header h, Header newH) uint_32 * fileSizes, fileSize; const char ** dirNames; const char ** newDirNames; - static int_32 mergeTags[] = { + static rpmTag mergeTags[] = { RPMTAG_FILESIZES, RPMTAG_FILESTATES, RPMTAG_FILEMODES, @@ -320,7 +333,7 @@ static int mergeFiles(TFI_t fi, Header h, Header newH) RPMTAG_BASENAMES, 0, }; - static int_32 requireTags[] = { + static rpmTag requireTags[] = { RPMTAG_REQUIRENAME, RPMTAG_REQUIREVERSION, RPMTAG_REQUIREFLAGS, RPMTAG_PROVIDENAME, RPMTAG_PROVIDEVERSION, RPMTAG_PROVIDEFLAGS, RPMTAG_CONFLICTNAME, RPMTAG_CONFLICTVERSION, RPMTAG_CONFLICTFLAGS @@ -334,7 +347,7 @@ static int mergeFiles(TFI_t fi, Header h, Header newH) fc++; fileSize += fileSizes[i]; } - (void) headerModifyEntry(h, RPMTAG_SIZE, RPM_INT32_TYPE, &fileSize, 1); + (void) hme(h, RPMTAG_SIZE, RPM_INT32_TYPE, &fileSize, 1); for (i = 0; mergeTags[i]; i++) { if (!hge(newH, mergeTags[i], &type, (void **) &data, &count)) @@ -413,7 +426,7 @@ static int mergeFiles(TFI_t fi, Header h, Header newH) for (i = 0; i < 9; i += 3) { const char **Names, **EVR, **newNames, **newEVR; - int nnt, nvt, rnt; + rpmTagType nnt, nvt, rnt; uint_32 *Flags, *newFlags; int Count = 0, newCount = 0; @@ -540,6 +553,11 @@ static int markReplacedFiles(PSM_t psm) } /** + * Create directory if it does not exist, make sure path is writable. + * @note This will only create last component of directory path. + * @param dpath directory path + * @param dname directory use + * @return rpmRC return code */ static rpmRC chkdir (const char * dpath, const char * dname) /*@modifies fileSystem @*/ @@ -557,20 +575,19 @@ static rpmRC chkdir (const char * dpath, const char * dname) /*@fallthrough@*/ case URL_IS_FTP: case URL_IS_HTTP: - /* XXX this will only create last component of directory path */ rc = Mkdir(dpath, 0755); break; case URL_IS_DASH: break; } if (rc < 0) { - rpmError(RPMERR_CREATE, _("cannot create %s %s\n"), + rpmError(RPMERR_CREATE, _("cannot create %%%s %s\n"), dname, dpath); return RPMRC_FAIL; } } if ((rc = Access(dpath, W_OK))) { - rpmError(RPMERR_CREATE, _("cannot write to %s\n"), dpath); + rpmError(RPMERR_CREATE, _("cannot write to %%%s %s\n"), dname, dpath); return RPMRC_FAIL; } return RPMRC_OK; @@ -804,7 +821,7 @@ static int runScript(PSM_t psm, Header h, int argc = 0; const char ** prefixes = NULL; int numPrefixes; - int_32 ipt; + rpmTagType ipt; const char * oldPrefix; int maxPrefixLength; int len; @@ -1010,7 +1027,7 @@ static rpmRC runInstScript(PSM_t psm) void ** programArgv; int programArgc; const char ** argv; - int_32 ptt, stt; + rpmTagType ptt, stt; const char * script; rpmRC rc = RPMRC_OK; @@ -1058,7 +1075,7 @@ static int handleOneTrigger(PSM_t psm, Header sourceH, Header triggeredH, const char ** triggerProgs; int_32 * triggerFlags; int_32 * triggerIndices; - int_32 tnt, tvt, tft; + rpmTagType tnt, tvt, tft; const char * triggerPackageName; const char * sourceName; int numTriggers; @@ -1078,7 +1095,7 @@ static int handleOneTrigger(PSM_t psm, Header sourceH, Header triggeredH, (void) headerNVR(sourceH, &sourceName, NULL, NULL); for (i = 0; i < numTriggers; i++) { - int_32 tit, tst, tpt; + rpmTagType tit, tst, tpt; if (!(triggerFlags[i] & psm->sense)) continue; if (strcmp(triggerNames[i], sourceName)) continue; @@ -1200,7 +1217,7 @@ static int runImmedTriggers(PSM_t psm) const char ** triggerNames; int numTriggers; int_32 * triggerIndices; - int_32 tnt, tit; + rpmTagType tnt, tit; int numTriggerIndices; unsigned char * triggersRun; rpmRC rc = RPMRC_OK; @@ -1286,6 +1303,7 @@ int psmStage(PSM_t psm, pkgStage stage) const rpmTransactionSet ts = psm->ts; TFI_t fi = psm->fi; HGE_t hge = fi->hge; + HME_t hme = fi->hme; HFD_t hfd = (fi->hfd ? fi->hfd : headerFreeData); rpmRC rc = psm->rc; int saveerrno; @@ -1653,7 +1671,7 @@ assert(psm->mi == NULL); { multiLib = *p; multiLib |= *newMultiLib; - (void) headerModifyEntry(psm->oh, RPMTAG_MULTILIBS, RPM_INT32_TYPE, + (void) hme(psm->oh, RPMTAG_MULTILIBS, RPM_INT32_TYPE, &multiLib, 1); } rc = mergeFiles(fi, psm->oh, fi->h); diff --git a/lib/psm.h b/lib/psm.h index 629f038..f936137 100644 --- a/lib/psm.h +++ b/lib/psm.h @@ -28,6 +28,9 @@ struct transactionFileInfo_s { /*@owned@*/ fileAction * actions; /*!< File disposition(s) */ /*@owned@*/ struct fingerPrint_s * fps; /*!< File fingerprint(s) */ HGE_t hge; /*!< Vector to headerGetEntry() */ + HAE_t hae; /*!< Vector to headerAddEntry() */ + HME_t hme; /*!< Vector to headerModifyEntry() */ + HRE_t hre; /*!< Vector to headerRemoveEntry() */ HFD_t hfd; /*!< Vector to headerFreeData() */ Header h; /*!< Package header */ /*@owned@*/ const char * name; diff --git a/lib/query.c b/lib/query.c index 783f237..327f6a9 100644 --- a/lib/query.c +++ b/lib/query.c @@ -142,20 +142,19 @@ int showQueryPackage(QVA_t qva, /*@unused@*/rpmdb rpmdb, Header h) HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; char * t, * te; - rpmQueryFlags queryFlags = qva->qva_flags; const char * queryFormat = qva->qva_queryFormat; - - int_32 count, type; + rpmTagType type; + int_32 count; char * prefix = NULL; const char ** dirNames = NULL; const char ** baseNames = NULL; - int bnt, dnt; + rpmTagType bnt, dnt; const char ** fileMD5List = NULL; const char ** fileOwnerList = NULL; const char ** fileGroupList = NULL; const char ** fileLinktoList = NULL; - int m5t, fot, fgt, ltt; + rpmTagType m5t, fot, fgt, ltt; const char * fileStatesList; int_32 * fileFlagsList, * fileMTimeList, * fileSizeList; int_32 * fileUIDList = NULL; @@ -237,10 +236,12 @@ int showQueryPackage(QVA_t qva, /*@unused@*/rpmdb rpmdb, Header h) fileGroupList = NULL; for (i = 0; i < count; i++) { + /* If querying only docs, skip non-doc files. */ if ((queryFlags & QUERY_FOR_DOCS) && !(fileFlagsList[i] & RPMFILE_DOC)) continue; + /* If querying only configs, skip non-config files. */ if ((queryFlags & QUERY_FOR_CONFIG) && !(fileFlagsList[i] & RPMFILE_CONFIG)) @@ -251,7 +252,8 @@ int showQueryPackage(QVA_t qva, /*@unused@*/rpmdb rpmdb, Header h) if (queryFlags & QUERY_FOR_STATE) { if (fileStatesList) { - switch (fileStatesList[i]) { + rpmfileState fstate = fileStatesList[i]; + switch (fstate) { case RPMFILE_STATE_NORMAL: te = stpcpy(te, _("normal ")); break; case RPMFILE_STATE_REPLACED: @@ -496,7 +498,7 @@ int rpmQueryVerify(QVA_t qva, rpmQVSources source, const char * arg, int rc; int isSource; int retcode = 0; - char *end = NULL; + char * end = NULL; switch (source) { case RPMQV_RPM: @@ -605,7 +607,6 @@ restart: rc = parseSpecVec(&spec, arg, "/", buildRoot, recursing, passPhrase, cookie, anyarch, force); if (rc || spec == NULL) { - rpmError(RPMERR_QUERY, _("query of specfile %s failed, can't parse\n"), arg); spec = freeSpecVec(spec); diff --git a/lib/rpmcli.h b/lib/rpmcli.h index 9a00a06..a966c4e 100644 --- a/lib/rpmcli.h +++ b/lib/rpmcli.h @@ -59,35 +59,132 @@ extern struct poptOption rpmBuildPoptTable[]; /** \ingroup rpmcli * Bit(s) to control rpmQuery() operation, stored in qva_flags. */ -/*@-typeuse@*/ typedef enum rpmQueryFlags_e { - QUERY_FOR_LIST = (1 << 1), /*!< from --list */ - QUERY_FOR_STATE = (1 << 2), /*!< from --state */ - QUERY_FOR_DOCS = (1 << 3), /*!< from --docfiles */ - QUERY_FOR_CONFIG = (1 << 4), /*!< from --configfiles */ - QUERY_FOR_DUMPFILES = (1 << 8) /*!< from --dump */ + QUERY_FOR_DEFAULT = 0, + QUERY_FOR_LIST = (1 << 1), /*!< query: from --list */ + QUERY_FOR_STATE = (1 << 2), /*!< query: from --state */ + QUERY_FOR_DOCS = (1 << 3), /*!< query: from --docfiles */ + QUERY_FOR_CONFIG = (1 << 4), /*!< query: from --configfiles */ + QUERY_FOR_DUMPFILES = (1 << 8), /*!< query: from --dump */ +/*@-enummemuse@*/ + QUERY_FILES = (1 << 9), /*!< verify: from --nofiles */ + QUERY_DEPS = (1 << 10), /*!< verify: from --nodeps */ + QUERY_SCRIPT = (1 << 11), /*!< verify: from --noscripts */ + QUERY_MD5 = (1 << 12), /*!< verify: from --nomd5 */ + QUERY_DIGEST = (1 << 13) /*!< verify: from --nodigest */ +/*@=enummemuse@*/ } rpmQueryFlags; -/*@=typeuse@*/ /** \ingroup rpmcli * Bit(s) to control rpmVerify() operation, stored in qva_flags. */ /*@-typeuse@*/ typedef enum rpmVerifyFlags_e { - VERIFY_FILES = (1 << 9), /*!< from --nofiles */ - VERIFY_DEPS = (1 << 10), /*!< from --nodeps */ - VERIFY_SCRIPT = (1 << 11), /*!< from --noscripts */ - VERIFY_MD5 = (1 << 12) /*!< from --nomd5 */ +/*@-enummemuse@*/ + VERIFY_FOR_DEFAULT = 0, + VERIFY_FOR_LIST = (1 << 1), /*!< query: from --list */ + VERIFY_FOR_STATE = (1 << 2), /*!< query: from --state */ + VERIFY_FOR_DOCS = (1 << 3), /*!< query: from --docfiles */ + VERIFY_FOR_CONFIG = (1 << 4), /*!< query: from --configfiles */ + VERIFY_FOR_DUMPFILES= (1 << 8), /*!< query: from --dump */ +/*@=enummemuse@*/ + VERIFY_FILES = (1 << 9), /*!< verify: from --nofiles */ + VERIFY_DEPS = (1 << 10), /*!< verify: from --nodeps */ + VERIFY_SCRIPT = (1 << 11), /*!< verify: from --noscripts */ + VERIFY_MD5 = (1 << 12), /*!< verify: from --nomd5 */ + VERIFY_DIGEST = (1 << 13) /*!< verify: from --nodigest */ } rpmVerifyFlags; +#define VERIFY_ALL \ + (VERIFY_FILES|VERIFY_DEPS|VERIFY_SCRIPT|VERIFY_MD5|VERIFY_DIGEST) /*@=typeuse@*/ /** \ingroup rpmcli + * @param qva parsed query/verify options + * @param db rpm database + * @param h header to use for query/verify + */ +typedef int (*QVF_t) (QVA_t qva, rpmdb db, Header h) + /*@modifies db, fileSystem @*/; + +/** \ingroup rpmcli + * Display query/verify information for each header in iterator. + * @param qva parsed query/verify options + * @param mi rpm database iterator + * @param showPackage query/verify display routine + * @return result of last non-zero showPackage() return + */ +int showMatches(QVA_t qva, /*@only@*/ /*@null@*/ rpmdbMatchIterator mi, + QVF_t showPackage) + /*@modifies mi @*/; + +/** \ingroup rpmcli + * Display list of tags that can be used in --queryformat. + * @param fp file handle to use for display + */ +void rpmDisplayQueryTags(FILE * fp) + /*@modifies *fp, fileSystem @*/; + +/** \ingroup rpmcli + * Common query/verify source interface, called once for each CLI arg. + * @param qva parsed query/verify options + * @param source type of source to query/verify + * @param arg name of source to query/verify + * @param db rpm database + * @param showPackage query/verify specific display routine + * @return showPackage() result, 1 if rpmdbInitIterator() is NULL + */ +int rpmQueryVerify(QVA_t qva, rpmQVSources source, const char * arg, + rpmdb db, QVF_t showPackage) + /*@modifies db, fileSystem @*/; + +/** \ingroup rpmcli + * Display results of package query. + * @todo Devise a meaningful return code. + * @param qva parsed query/verify options + * @param db rpm database (unused for queries) + * @param h header to use for query + * @return 0 always + */ +int showQueryPackage(QVA_t qva, rpmdb db, Header h) + /*@modifies db, fileSystem @*/; + +/** \ingroup rpmcli + * Display package information. + * @param qva parsed query/verify options + * @param source type of source to query + * @param arg name of source to query + * @return rpmQueryVerify() result, or 1 on rpmdbOpen() failure + */ +int rpmQuery(QVA_t qva, rpmQVSources source, const char * arg) + /*@modifies fileSystem @*/; + +/** \ingroup rpmcli + * Display results of package verify. + * @param qva parsed query/verify options + * @param db rpm database + * @param h header to use for verify + * @return result of last non-zero verify return + */ +int showVerifyPackage(QVA_t qva, /*@only@*/ rpmdb db, Header h) + /*@modifies db, h, fileSystem @*/; + +/** \ingroup rpmcli + * Verify package install. + * @param qva parsed query/verify options + * @param source type of source to verify + * @param arg name of source to verify + * @return rpmQueryVerify() result, or 1 on rpmdbOpen() failure + */ +int rpmVerify(QVA_t qva, rpmQVSources source, const char *arg) + /*@modifies fileSystem @*/; + +/** \ingroup rpmcli * Describe query/verify command line request. */ struct rpmQVArguments_s { rpmQVSources qva_source; /*!< Identify CLI arg type. */ int qva_sourceCount;/*!< Exclusive check (>1 is error). */ - int qva_flags; /*!< Bit(s) to control operation. */ + rpmQueryFlags qva_flags; /*!< Bit(s) to control operation. */ /*@unused@*/ int qva_verbose; /*!< (unused) */ /*@only@*/ /*@null@*/ const char * qva_queryFormat; /*!< Format for headerSprintf(). */ /*@observer@*/ /*@null@*/ const char * qva_prefix; /*!< Path to top of install tree. */ @@ -122,6 +219,50 @@ extern struct poptOption rpmVerifyPoptTable[]; /* --- install/upgrade/erase modes */ /** \ingroup rpmcli + * Install/upgrade/freshen binary rpm package. + * @param rootdir path to top of install tree + * @param fileArgv array of package file names (NULL terminated) + * @param transFlags bits to control rpmRunTransactions() + * @param interfaceFlags bits to control rpmInstall() + * @param probFilter bits to filter problem types + * @param relocations package file relocations + * @return 0 on success + */ +int rpmInstall(/*@null@*/ const char * rootdir, + /*@null@*/ const char ** fileArgv, + rpmtransFlags transFlags, + rpmInstallInterfaceFlags interfaceFlags, + rpmprobFilterFlags probFilter, + /*@null@*/ rpmRelocation * relocations) + /*@modifies *relocations, fileSystem @*/; + +/** \ingroup rpmcli + * Install source rpm package. + * @param rootdir path to top of install tree + * @param arg source rpm file name + * @retval specFile address of (installed) spec file name + * @retval cookie + * @return 0 on success + */ +int rpmInstallSource(const char * rootdir, const char * arg, + /*@null@*/ /*@out@*/ const char ** specFile, + /*@null@*/ /*@out@*/ char ** cookie) + /*@modifies *specFile, *cookie, fileSystem @*/; + +/** \ingroup rpmcli + * Erase binary rpm package. + * @param rootdir path to top of install tree + * @param argv array of package file names (NULL terminated) + * @param transFlags bits to control rpmRunTransactions() + * @param interfaceFlags bits to control rpmInstall() + * @return 0 on success + */ +int rpmErase(/*@null@*/ const char * rootdir, /*@null@*/ const char ** argv, + rpmtransFlags transFlags, + rpmEraseInterfaceFlags interfaceFlags) + /*@modifies fileSystem @*/; + +/** \ingroup rpmcli * Describe database command line requests. */ struct rpmInstallArguments_s { @@ -132,7 +273,6 @@ struct rpmInstallArguments_s { /*@only@*/ rpmRelocation * relocations; int numRelocations; int noDeps; - int force; int incldocs; const char * prefix; }; @@ -174,6 +314,48 @@ extern struct poptOption rpmDatabasePoptTable[]; /*@{*/ /** \ingroup rpmcli + * Bit(s) to control rpmCheckSig() operation. + */ +typedef enum rpmCheckSigFlags_e { +/*@-enummemuse@*/ + CHECKSIG_NONE = 0, /*!< Don't check any signatures. */ +/*@=enummemuse@*/ + CHECKSIG_PGP = (1 << 0), /*!< if not --nopgp */ + CHECKSIG_MD5 = (1 << 1), /*!< if not --nomd5 */ + CHECKSIG_GPG = (1 << 2) /*!< if not --nogpg */ +} rpmCheckSigFlags; +#define CHECKSIG_ALL (CHECKSIG_PGP|CHECKSIG_MD5|CHECKSIG_GPG) + +/** \ingroup rpmcli + * Check elements in signature header. + * @param flags bit(s) to enable signature checks + * @param argv array of package file names (NULL terminated) + * @return 0 on success + */ +int rpmCheckSig(rpmCheckSigFlags flags, /*@null@*/ const char ** argv) + /*@modifies fileSystem @*/; + +/** \ingroup rpmcli + * Bit(s) to control rpmReSign() operation. + */ +typedef enum rpmResignFlags_e { + RESIGN_CHK_SIGNATURE = 0, /*!< from --checksig */ + RESIGN_NEW_SIGNATURE, /*!< from --resign */ + RESIGN_ADD_SIGNATURE /*!< from --addsign */ +} rpmResignFlags; + +/** \ingroup rpmcli + * Create/modify elements in signature header. + * @param add type of signature operation + * @param passPhrase + * @param argv array of package file names (NULL terminated) + * @return 0 on success + */ +int rpmReSign(rpmResignFlags add, char * passPhrase, + /*@null@*/ const char ** argv) + /*@modifies fileSystem @*/; + +/** \ingroup rpmcli * Describe signature command line request. */ struct rpmSignArguments_s { diff --git a/lib/rpmlib.h b/lib/rpmlib.h index 8ebccff..a28dfeb 100644 --- a/lib/rpmlib.h +++ b/lib/rpmlib.h @@ -156,21 +156,25 @@ int rpmPackageGetEntry(void *leadp, Header sigs, Header h, int_32 tag, int_32 *type, void **p, int_32 *c) /*@modifies *type, *p, *c @*/; -/*@-redecl@*/ /** * Automatically generated table of tag name/value pairs. */ +/*@-redecl@*/ extern const struct headerTagTableEntry rpmTagTable[]; +/*@=redecl@*/ /** * Number of entries in rpmTagTable. */ +/*@-redecl@*/ extern const int rpmTagTableSize; +/*@=redecl@*/ /** * Table of query format extensions. * @note Chains to headerDefaultFormats[]. */ +/*@-redecl@*/ extern const struct headerSprintfExtension rpmHeaderFormats[]; /*@=redecl@*/ @@ -188,15 +192,16 @@ extern const struct headerSprintfExtension rpmHeaderFormats[]; * Tags identify data in package headers. * @note tags should not have value 0! */ -/*@-enummemuse -typeuse@*/ typedef enum rpmTag_e { RPMTAG_HEADERIMAGE = HEADER_IMAGE, /*!< Current image. */ RPMTAG_HEADERSIGNATURES = HEADER_SIGNATURES, /*!< Signatures. */ RPMTAG_HEADERIMMUTABLE = HEADER_IMMUTABLE, /*!< Original image. */ +/*@-enummemuse@*/ RPMTAG_HEADERREGIONS = HEADER_REGIONS, /*!< Regions. */ RPMTAG_HEADERI18NTABLE = HEADER_I18NTABLE, /*!< I18N string locales. */ +/*@=enummemuse@*/ /* Retrofit (and uniqify) signature tags for use by tagName() and rpmQuery. */ /* the md5 sum was broken *twice* on big endian machines */ @@ -210,6 +215,8 @@ typedef enum rpmTag_e { RPMTAG_SIGGPG = RPMTAG_SIG_BASE+6, RPMTAG_SIGPGP5 = RPMTAG_SIG_BASE+7, /*!< internal */ + RPMTAG_SHA1HEADER = RPMTAG_SIG_BASE+8, + RPMTAG_NAME = 1000, RPMTAG_VERSION = 1001, RPMTAG_RELEASE = 1002, @@ -229,7 +236,9 @@ typedef enum rpmTag_e { #define RPMTAG_COPYRIGHT RPMTAG_LICENSE /* backward comaptibility */ RPMTAG_PACKAGER = 1015, RPMTAG_GROUP = 1016, +/*@-enummemuse@*/ RPMTAG_CHANGELOG = 1017, /*!< internal */ +/*@=enummemuse@*/ RPMTAG_SOURCE = 1018, RPMTAG_PATCH = 1019, RPMTAG_URL = 1020, @@ -250,11 +259,15 @@ typedef enum rpmTag_e { RPMTAG_FILEMD5S = 1035, RPMTAG_FILELINKTOS = 1036, RPMTAG_FILEFLAGS = 1037, - RPMTAG_ROOT = 1038, /*!< obsolete */ +/*@-enummemuse@*/ + RPMTAG_ROOT = 1038, /*!< internal - obsolete */ +/*@=enummemuse@*/ RPMTAG_FILEUSERNAME = 1039, RPMTAG_FILEGROUPNAME = 1040, - RPMTAG_EXCLUDE = 1041, /*!< internal - deprecated */ - RPMTAG_EXCLUSIVE = 1042, /*!< internal - deprecated */ +/*@-enummemuse@*/ + RPMTAG_EXCLUDE = 1041, /*!< internal - obsolete */ + RPMTAG_EXCLUSIVE = 1042, /*!< internal - obsolete */ +/*@=enummemuse@*/ RPMTAG_ICON = 1043, RPMTAG_SOURCERPM = 1044, RPMTAG_FILEVERIFYFLAGS = 1045, @@ -310,13 +323,19 @@ typedef enum rpmTag_e { RPMTAG_TRIGGERPOSTUN = 1102, /*!< internal */ RPMTAG_AUTOREQ = 1103, /*!< internal */ RPMTAG_AUTOPROV = 1104, /*!< internal */ +/*@-enummemuse@*/ RPMTAG_CAPABILITY = 1105, /*!< internal obsolete */ +/*@=enummemuse@*/ RPMTAG_SOURCEPACKAGE = 1106, /*!< internal */ - RPMTAG_OLDORIGFILENAMES = 1107, /*!< obsolete */ +/*@-enummemuse@*/ + RPMTAG_OLDORIGFILENAMES = 1107, /*!< internal - obsolete */ +/*@=enummemuse@*/ RPMTAG_BUILDPREREQ = 1108, /*!< internal */ RPMTAG_BUILDREQUIRES = 1109, /*!< internal */ RPMTAG_BUILDCONFLICTS = 1110, /*!< internal */ - RPMTAG_BUILDMACROS = 1111, +/*@-enummemuse@*/ + RPMTAG_BUILDMACROS = 1111, /*!< internal */ +/*@=enummemuse@*/ RPMTAG_PROVIDEFLAGS = 1112, RPMTAG_PROVIDEVERSION = 1113, RPMTAG_OBSOLETEFLAGS = 1114, @@ -335,29 +354,30 @@ typedef enum rpmTag_e { RPMTAG_MULTILIBS = 1127, RPMTAG_INSTALLTID = 1128, RPMTAG_REMOVETID = 1129, +/*@-enummemuse@*/ RPMTAG_FIRSTFREE_TAG /*!< internal */ +/*@=enummemuse@*/ } rpmTag; -/*@=enummemuse =typeuse@*/ #define RPMTAG_EXTERNAL_TAG 1000000 /** * File States (when installed). */ -/*@-typeuse@*/ -typedef enum rpmfileStates_e { +typedef enum rpmfileState_e { RPMFILE_STATE_NORMAL = 0, RPMFILE_STATE_REPLACED = 1, RPMFILE_STATE_NOTINSTALLED = 2, RPMFILE_STATE_NETSHARED = 3 -} rpmfileStates; -/*@=typeuse@*/ +} rpmfileState; /** * File Attributes. */ -/*@-typeuse@*/ typedef enum rpmfileAttrs_e { +/*@-enummemuse@*/ + RPMFILE_NONE = 0, +/*@=enummemuse@*/ RPMFILE_CONFIG = (1 << 0), /*!< from %%config */ RPMFILE_DOC = (1 << 1), /*!< from %%doc */ /*@-enummemuse@*/ @@ -371,7 +391,6 @@ typedef enum rpmfileAttrs_e { RPMFILE_README = (1 << 8), /*!< from %%readme */ RPMFILE_EXCLUDE = (1 << 9) /*!< from %%exclude */ } rpmfileAttrs; -/*@=typeuse@*/ #define RPMFILE_MULTILIB_SHIFT 9 #define RPMFILE_MULTILIB(N) ((N) << RPMFILE_MULTILIB_SHIFT) #define RPMFILE_MULTILIB_MASK RPMFILE_MULTILIB(7) @@ -921,8 +940,9 @@ void printDepProblems(FILE * fp, const rpmDependencyConflict conflicts, * @param prob rpm problem * @return formatted string */ -/*@-redecl@*/ -/*@only@*/ extern const char * rpmProblemString(const rpmProblem prob) /*@*/; +/*@-redecl@*/ /* LCL: is confused. */ +/*@only@*/ extern const char * rpmProblemString(const rpmProblem prob) + /*@*/; /*@=redecl@*/ /** @@ -955,6 +975,9 @@ void rpmProblemSetFree( /*@only@*/ rpmProblemSet probs) /*@{*/ /** * Prototype for headerFreeData() vector. + * @param data address of data (or NULL) + * @param type type of data (or -1 to force free) + * @return NULL always */ typedef /*@null@*/ void * (*HFD_t) (/*@only@*/ /*@null@*/ const void * data, rpmTagType type) @@ -962,14 +985,69 @@ typedef /*@null@*/ /** * Prototype for headerGetEntry() vector. + * 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 */ -typedef int (*HGE_t) (Header h, int_32 tag, - /*@null@*/ /*@out@*/ int_32 * type, +typedef int (*HGE_t) (Header h, rpmTag tag, + /*@null@*/ /*@out@*/ rpmTagType * type, /*@null@*/ /*@out@*/ void ** p, /*@null@*/ /*@out@*/ int_32 * c) /*@modifies *type, *p, *c @*/; /** + * Prototype for headerAddEntry() vector. + * 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 + */ +typedef int (*HAE_t) (Header h, rpmTag tag, rpmTagType type, + const void * p, int_32 c) + /*@modifies h @*/; + +/** + * Prototype for headerModifyEntry() vector. + * 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 + */ +typedef int (*HME_t) (Header h, rpmTag tag, rpmTagType type, + const void * p, int_32 c) + /*@modifies h @*/; + +/** + * Prototype for headerRemoveEntry() vector. + * 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) + */ +typedef int (*HRE_t) (Header h, int_32 tag) + /*@modifies h @*/; + +/** * We pass these around as an array with a sentinel. */ typedef struct rpmRelocation_s { @@ -1422,6 +1500,7 @@ typedef struct rpmQVArguments_s * QVA_t; /** \ingroup rpmcli * The command line argument will be used to retrieve header(s) ... + * @todo Move to rpmcli.h */ typedef enum rpmQVSources_e { RPMQV_PACKAGE = 0, /*!< ... from package name db search. */ @@ -1438,6 +1517,7 @@ typedef enum rpmQVSources_e { /** \ingroup rpmcli * Bit(s) for rpmVerifyFile() attributes and result. + * @todo Move to rpmcli.h. */ typedef enum rpmVerifyAttrs_e { RPMVERIFY_NONE = 0, /*!< */ @@ -1456,108 +1536,29 @@ typedef enum rpmVerifyAttrs_e { #define RPMVERIFY_ALL ~(RPMVERIFY_NONE) /** \ingroup rpmcli - * Verify file attributes and MD5 sum. + * Verify file attributes (including MD5 sum). * @todo gnorpm and python bindings prevent this from being static. - * @todo add rpmVerifyAttrs to prototype. * @param root path to top of install tree * @param h header * @param filenum index of file in header file info arrays - * @retval result address of failure flags + * @retval result address of bit(s) returned to indicate failure * @param omitMask bit(s) to disable verify checks * @return 0 on success (or not installed), 1 on error */ int rpmVerifyFile(const char * root, Header h, int filenum, - /*@out@*/ int * result, int omitMask); + /*@out@*/ rpmVerifyAttrs * result, rpmVerifyAttrs omitMask) + /*@modifies h, *result, fileSystem @*/; /** - * Return exit code from running verify script in header. + * Return exit code from running verify script from header. * @todo gnorpm/kpackage prevents static, should be using VERIFY_SCRIPT flag. * @param rootDir path to top of install tree * @param h header * @param scriptFd file handle to use for stderr (or NULL) * @return 0 on success */ -int rpmVerifyScript(const char * rootDir, Header h, /*@null@*/ FD_t scriptFd); - -/** \ingroup rpmcli - * @param qva parsed query/verify options - * @param db rpm database - * @param h header to use for query/verify - */ -typedef int (*QVF_t) (QVA_t qva, rpmdb db, Header h) - /*@modifies db, fileSystem @*/; - -/** \ingroup rpmcli - * Display query/verify information for each header in iterator. - * @param qva parsed query/verify options - * @param mi rpm database iterator - * @param showPackage query/verify display routine - * @return result of last non-zero showPackage() return - */ -int showMatches(QVA_t qva, /*@only@*/ /*@null@*/ rpmdbMatchIterator mi, - QVF_t showPackage) - /*@modifies mi @*/; - -/** \ingroup rpmcli - * Display list of tags that can be used in --queryformat. - * @param fp file handle to use for display - */ -void rpmDisplayQueryTags(FILE * fp) - /*@modifies *fp, fileSystem @*/; - -/** \ingroup rpmcli - * Common query/verify source interface, called once for each CLI arg. - * @param qva parsed query/verify options - * @param source type of source to query/verify - * @param arg name of source to query/verify - * @param db rpm database - * @param showPackage query/verify specific display routine - * @return showPackage() result, 1 if rpmdbInitIterator() is NULL - */ -int rpmQueryVerify(QVA_t qva, rpmQVSources source, const char * arg, - rpmdb db, QVF_t showPackage) - /*@modifies db, fileSystem @*/; - -/** \ingroup rpmcli - * Display results of package query. - * @todo Devise a meaningful return code. - * @param qva parsed query/verify options - * @param db rpm database (unused for queries) - * @param h header to use for query - * @return 0 always - */ -int showQueryPackage(QVA_t qva, rpmdb db, Header h) - /*@modifies db, fileSystem @*/; - -/** \ingroup rpmcli - * Display package information. - * @param qva parsed query/verify options - * @param source type of source to query - * @param arg name of source to query - * @return rpmQueryVerify() result, or 1 on rpmdbOpen() failure - */ -int rpmQuery(QVA_t qva, rpmQVSources source, const char * arg) - /*@modifies fileSystem @*/; - -/** \ingroup rpmcli - * Display results of package verify. - * @param qva parsed query/verify options - * @param db rpm database - * @param h header to use for verify - * @return result of last non-zero verify return - */ -int showVerifyPackage(QVA_t qva, /*@only@*/ rpmdb db, Header h) - /*@modifies db, h, fileSystem @*/; - -/** \ingroup rpmcli - * Verify package install. - * @param qva parsed query/verify options - * @param source type of source to verify - * @param arg name of source to verify - * @return rpmQueryVerify() result, or 1 on rpmdbOpen() failure - */ -int rpmVerify(QVA_t qva, rpmQVSources source, const char *arg) - /*@modifies fileSystem @*/; +int rpmVerifyScript(const char * rootDir, Header h, /*@null@*/ FD_t scriptFd) + /*@modifies h, scriptFd, fileSystem @*/; /*@}*/ /* ==================================================================== */ @@ -1567,6 +1568,7 @@ int rpmVerify(QVA_t qva, rpmQVSources source, const char *arg) /** \ingroup rpmcli * Bit(s) to control rpmInstall() operation. + * @todo Move to rpmcli.h */ typedef enum rpmInstallInterfaceFlags_e { INSTALL_NONE = 0, @@ -1584,37 +1586,6 @@ typedef enum rpmInstallInterfaceFlags_e { } rpmInstallInterfaceFlags; /** \ingroup rpmcli - * Install/upgrade/freshen binary rpm package. - * @param rootdir path to top of install tree - * @param fileArgv array of package file names (NULL terminated) - * @param transFlags bits to control rpmRunTransactions() - * @param interfaceFlags bits to control rpmInstall() - * @param probFilter bits to filter problem types - * @param relocations package file relocations - * @return 0 on success - */ -int rpmInstall(/*@null@*/ const char * rootdir, - /*@null@*/ const char ** fileArgv, - rpmtransFlags transFlags, - rpmInstallInterfaceFlags interfaceFlags, - rpmprobFilterFlags probFilter, - /*@null@*/ rpmRelocation * relocations) - /*@modifies *relocations, fileSystem @*/; - -/** \ingroup rpmcli - * Install source rpm package. - * @param rootdir path to top of install tree - * @param arg source rpm file name - * @retval specFile address of (installed) spec file name - * @retval cookie - * @return 0 on success - */ -int rpmInstallSource(const char * rootdir, const char * arg, - /*@null@*/ /*@out@*/ const char ** specFile, - /*@null@*/ /*@out@*/ char ** cookie) - /*@modifies *specFile, *cookie, fileSystem @*/; - -/** \ingroup rpmcli * Bit(s) to control rpmErase() operation. */ typedef enum rpmEraseInterfaceFlags_e { @@ -1623,19 +1594,6 @@ typedef enum rpmEraseInterfaceFlags_e { UNINSTALL_ALLMATCHES= (1 << 1) /*!< from --allmatches */ } rpmEraseInterfaceFlags; -/** \ingroup rpmcli - * Erase binary rpm package. - * @param rootdir path to top of install tree - * @param argv array of package file names (NULL terminated) - * @param transFlags bits to control rpmRunTransactions() - * @param interfaceFlags bits to control rpmInstall() - * @return 0 on success - */ -int rpmErase(/*@null@*/ const char * rootdir, /*@null@*/ const char ** argv, - rpmtransFlags transFlags, - rpmEraseInterfaceFlags interfaceFlags) - /*@modifies fileSystem @*/; - /*@}*/ /* ==================================================================== */ /** \name RPMK */ @@ -1644,7 +1602,6 @@ int rpmErase(/*@null@*/ const char * rootdir, /*@null@*/ const char ** argv, /** \ingroup signature * Tags found in signature header from package. */ -/*@-enummemuse@*/ enum rpmtagSignature { RPMSIGTAG_SIZE = 1000, /*!< Size in bytes. */ /* the md5 sum was broken *twice* on big endian machines */ @@ -1655,6 +1612,7 @@ enum rpmtagSignature { RPMSIGTAG_GPG = 1005, /*!< GnuPG signature. */ RPMSIGTAG_PGP5 = 1006, /*!< PGP5 signature @deprecated legacy. */ +/*@-enummemuse@*/ /* Signature tags by Public Key Algorithm (RFC 2440) */ /* N.B.: These tags are tenative, the values may change */ RPMTAG_PK_BASE = 512, /*!< @todo Implement. */ @@ -1675,8 +1633,8 @@ enum rpmtagSignature { RPMTAG_HASH_MD2 = RPMTAG_HASH_BASE+5, /*!< (unused) */ RPMTAG_HASH_TIGER192= RPMTAG_HASH_BASE+6, /*!< (unused) */ RPMTAG_HASH_HAVAL_5_160= RPMTAG_HASH_BASE+7 /*!< (unused) */ -}; /*@=enummemuse@*/ +}; /** * Return codes from verifySignature(). @@ -1710,50 +1668,6 @@ rpmVerifySignatureReturn rpmVerifySignature(const char *file, /*@null@*/ Header rpmFreeSignature(/*@null@*/ /*@killref@*/ Header h) /*@modifies h @*/; -/* --- checksig/resign */ - -/** \ingroup rpmcli - * Bit(s) to control rpmCheckSig() operation. - */ -typedef enum rpmCheckSigFlags_e { -/*@-enummemuse@*/ - CHECKSIG_NONE = 0, /*!< Don't check any signatures. */ -/*@=enummemuse@*/ - CHECKSIG_PGP = (1 << 0), /*!< if not --nopgp */ - CHECKSIG_MD5 = (1 << 1), /*!< if not --nomd5 */ - CHECKSIG_GPG = (1 << 2) /*!< if not --nogpg */ -} rpmCheckSigFlags; -#define CHECKSIG_ALL (CHECKSIG_PGP|CHECKSIG_MD5|CHECKSIG_GPG) - -/** \ingroup rpmcli - * Check elements in signature header. - * @param flags bit(s) to enable signature checks - * @param argv array of package file names (NULL terminated) - * @return 0 on success - */ -int rpmCheckSig(rpmCheckSigFlags flags, /*@null@*/ const char ** argv) - /*@modifies fileSystem @*/; - -/** \ingroup rpmcli - * Bit(s) to control rpmReSign() operation. - */ -typedef enum rpmResignFlags_e { - RESIGN_CHK_SIGNATURE = 0, /*!< from --checksig */ - RESIGN_NEW_SIGNATURE, /*!< from --resign */ - RESIGN_ADD_SIGNATURE /*!< from --addsign */ -} rpmResignFlags; - -/** \ingroup rpmcli - * Create/modify elements in signature header. - * @param add type of signature operation - * @param passPhrase - * @param argv array of package file names (NULL terminated) - * @return 0 on success - */ -int rpmReSign(rpmResignFlags add, char * passPhrase, - /*@null@*/ const char ** argv) - /*@modifies fileSystem @*/; - /*@}*/ #ifdef __cplusplus diff --git a/lib/transaction.c b/lib/transaction.c index 9f415a4..20d6acf 100644 --- a/lib/transaction.c +++ b/lib/transaction.c @@ -308,6 +308,8 @@ static Header relocateFileList(const rpmTransactionSet ts, TFI_t fi, /*@modifies ts, fi, alp, origH, actions @*/ { HGE_t hge = fi->hge; + HAE_t hae = fi->hae; + HME_t hme = fi->hme; HFD_t hfd = (fi->hfd ? fi->hfd : headerFreeData); static int _printed = 0; rpmProblemSet probs = ts->probs; @@ -316,7 +318,7 @@ static Header relocateFileList(const rpmTransactionSet ts, TFI_t fi, rpmRelocation * relocations = NULL; int numRelocations; const char ** validRelocations; - int_32 validType; + rpmTagType validType; int numValid; const char ** baseNames; const char ** dirNames; @@ -355,7 +357,7 @@ static Header relocateFileList(const rpmTransactionSet ts, TFI_t fi, if (rawRelocations == NULL || numRelocations == 0) { if (numValid) { if (!headerIsEntry(origH, RPMTAG_INSTPREFIXES)) - (void) headerAddEntry(origH, RPMTAG_INSTPREFIXES, + (void) hae(origH, RPMTAG_INSTPREFIXES, validType, validRelocations, numValid); validRelocations = hfd(validRelocations, validType); } @@ -472,7 +474,7 @@ static Header relocateFileList(const rpmTransactionSet ts, TFI_t fi, } if (numActual) - (void) headerAddEntry(h, RPMTAG_INSTPREFIXES, RPM_STRING_ARRAY_TYPE, + (void) hae(h, RPMTAG_INSTPREFIXES, RPM_STRING_ARRAY_TYPE, (void **) actualRelocations, numActual); actualRelocations = _free(actualRelocations); @@ -673,34 +675,34 @@ static Header relocateFileList(const rpmTransactionSet ts, TFI_t fi, if (nrelocated) { int c; void * p; - int t; + rpmTagType t; p = NULL; (void) hge(h, RPMTAG_BASENAMES, &t, &p, &c); - (void) headerAddEntry(h, RPMTAG_ORIGBASENAMES, t, p, c); + (void) hae(h, RPMTAG_ORIGBASENAMES, t, p, c); p = hfd(p, t); p = NULL; (void) hge(h, RPMTAG_DIRNAMES, &t, &p, &c); - (void) headerAddEntry(h, RPMTAG_ORIGDIRNAMES, t, p, c); + (void) hae(h, RPMTAG_ORIGDIRNAMES, t, p, c); p = hfd(p, t); p = NULL; (void) hge(h, RPMTAG_DIRINDEXES, &t, &p, &c); - (void) headerAddEntry(h, RPMTAG_ORIGDIRINDEXES, t, p, c); + (void) hae(h, RPMTAG_ORIGDIRINDEXES, t, p, c); p = hfd(p, t); - (void) headerModifyEntry(h, RPMTAG_BASENAMES, RPM_STRING_ARRAY_TYPE, + (void) hme(h, RPMTAG_BASENAMES, RPM_STRING_ARRAY_TYPE, baseNames, fileCount); fi->bnl = hfd(fi->bnl, RPM_STRING_ARRAY_TYPE); (void) hge(h, RPMTAG_BASENAMES, NULL, (void **) &fi->bnl, &fi->fc); - (void) headerModifyEntry(h, RPMTAG_DIRNAMES, RPM_STRING_ARRAY_TYPE, + (void) hme(h, RPMTAG_DIRNAMES, RPM_STRING_ARRAY_TYPE, dirNames, dirCount); fi->dnl = hfd(fi->dnl, RPM_STRING_ARRAY_TYPE); (void) hge(h, RPMTAG_DIRNAMES, NULL, (void **) &fi->dnl, &fi->dc); - (void) headerModifyEntry(h, RPMTAG_DIRINDEXES, RPM_INT32_TYPE, + (void) hme(h, RPMTAG_DIRINDEXES, RPM_INT32_TYPE, dirIndexes, fileCount); (void) hge(h, RPMTAG_DIRINDEXES, NULL, (void **) &fi->dil, NULL); } @@ -895,7 +897,7 @@ static int handleInstInstalledFiles(TFI_t fi, /*@null@*/ rpmdb db, { HGE_t hge = fi->hge; HFD_t hfd = (fi->hfd ? fi->hfd : headerFreeData); - int oltype, omtype; + rpmTagType oltype, omtype; Header h; int i; const char ** otherMd5s; diff --git a/lib/verify.c b/lib/verify.c index fb35919..86a590d 100644 --- a/lib/verify.c +++ b/lib/verify.c @@ -28,6 +28,7 @@ static union _vendian { #define S_ISDEV(m) (S_ISBLK((m)) || S_ISCHR((m))) +#ifdef DYING #define POPT_NODEPS 1000 #define POPT_NOFILES 1001 #define POPT_NOMD5 1002 @@ -53,39 +54,43 @@ static int noDeps = 0; static int noFiles = 0; static int noMd5 = 0; static int noScripts = 0; +#endif /* DYING */ -/** */ +/** + * Verify mode options. + */ struct poptOption rpmVerifyPoptTable[] = { +#ifdef DYING { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA, verifyArgCallback, 0, NULL, NULL }, +#endif /* DYING */ { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0, NULL, NULL }, - { "nodeps", '\0', 0, &noDeps, POPT_NODEPS, - N_("do not verify package dependencies"), - NULL }, - { "nofiles", '\0', 0, &noFiles, POPT_NOFILES, - N_("don't verify files in package"), - NULL}, - { "nomd5", '\0', 0, &noMd5, POPT_NOMD5, - N_("do not verify file md5 checksums"), - NULL }, - { "noscripts", '\0', 0, &noScripts, POPT_NOSCRIPTS, - N_("do not execute %verifyscript (if any)"), - NULL }, + { "nodeps", '\0', POPT_BIT_SET, &rpmQVArgs.qva_flags, VERIFY_DEPS, + N_("do not verify package dependencies"), NULL }, + { "nofiles", '\0', POPT_BIT_SET, &rpmQVArgs.qva_flags, VERIFY_FILES, + N_("don't verify files in package"), NULL}, + { "nomd5", '\0', POPT_BIT_SET, &rpmQVArgs.qva_flags, VERIFY_MD5, + N_("do not verify file md5 checksums"), NULL }, + { "noscripts", '\0', POPT_BIT_SET, &rpmQVArgs.qva_flags, VERIFY_SCRIPT, + N_("do not execute %verifyscript (if any)"), NULL }, + { "nodigest", '\0', POPT_BIT_SET, &rpmQVArgs.qva_flags, VERIFY_DIGEST, + N_("do not execute %verifyscript (if any)"), NULL }, POPT_TABLEEND }; -/* ======================================================================== */ int rpmVerifyFile(const char * root, Header h, int filenum, - int * result, int omitMask) + rpmVerifyAttrs * result, rpmVerifyAttrs omitMask) { HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; + int_32 * fileFlags; + rpmfileAttrs fileAttrs = RPMFILE_NONE; int_32 * verifyFlags; - rpmVerifyAttrs flags; + rpmVerifyAttrs flags = RPMVERIFY_ALL; unsigned short * modeList; const char * fileStatesList; - char * filespec; + const char * filespec = NULL; int count; int rc; struct stat sb; @@ -94,6 +99,7 @@ int rpmVerifyFile(const char * root, Header h, int filenum, if (IS_BIG_ENDIAN()) { /* XXX was ifdef WORDS_BIGENDIAN */ int_32 * brokenPtr; if (!hge(h, RPMTAG_BROKENMD5, NULL, (void **) &brokenPtr, NULL)) { + HAE_t hae = (HAE_t)headerAddEntry; const char * rpmVersion; if (hge(h, RPMTAG_RPMVERSION, NULL, (void **) &rpmVersion, NULL)) { @@ -102,8 +108,7 @@ int rpmVerifyFile(const char * root, Header h, int filenum, } else { useBrokenMd5 = 1; } - (void) headerAddEntry(h, RPMTAG_BROKENMD5, RPM_INT32_TYPE, - &useBrokenMd5, 1); + (void) hae(h, RPMTAG_BROKENMD5, RPM_INT32_TYPE, &useBrokenMd5, 1); } else { useBrokenMd5 = *brokenPtr; } @@ -112,55 +117,73 @@ int rpmVerifyFile(const char * root, Header h, int filenum, } (void) hge(h, RPMTAG_FILEMODES, NULL, (void **) &modeList, &count); + if (hge(h, RPMTAG_FILEFLAGS, NULL, (void **) &fileFlags, NULL)) + fileAttrs = fileFlags[filenum]; - if (hge(h, RPMTAG_FILEVERIFYFLAGS, NULL, (void **) &verifyFlags, NULL)) { + if (hge(h, RPMTAG_FILEVERIFYFLAGS, NULL, (void **) &verifyFlags, NULL)) flags = verifyFlags[filenum]; - } else { - flags = RPMVERIFY_ALL; - } - { + { const char ** baseNames; const char ** dirNames; int_32 * dirIndexes; - int bnt, dnt; + rpmTagType bnt, dnt; - (void) hge(h, RPMTAG_BASENAMES, &bnt, (void **) &baseNames, NULL); - (void) hge(h, RPMTAG_DIRINDEXES, NULL, (void **) &dirIndexes, NULL); - (void) hge(h, RPMTAG_DIRNAMES, &dnt, (void **) &dirNames, NULL); - - filespec = alloca(strlen(dirNames[dirIndexes[filenum]]) + + if (hge(h, RPMTAG_BASENAMES, &bnt, (void **) &baseNames, NULL) + && hge(h, RPMTAG_DIRNAMES, &dnt, (void **) &dirNames, NULL) + && hge(h, RPMTAG_DIRINDEXES, NULL, (void **) &dirIndexes, NULL)) + { + int nb = (strlen(dirNames[dirIndexes[filenum]]) + strlen(baseNames[filenum]) + strlen(root) + 5); - sprintf(filespec, "%s/%s%s", root, dirNames[dirIndexes[filenum]], - baseNames[filenum]); + char * t = alloca(nb); + filespec = t; + *t = '\0'; + t = stpcpy(t, root); + *t++ = '/'; + t = stpcpy(t, dirNames[dirIndexes[filenum]]); + t = stpcpy(t, baseNames[filenum]); + } baseNames = hfd(baseNames, bnt); dirNames = hfd(dirNames, dnt); } - - *result = 0; - /* Check to see if the file was installed - if not pretend all is OK */ + *result = RPMVERIFY_NONE; + + /* + * Check to see if the file was installed - if not pretend all is OK. + */ if (hge(h, RPMTAG_FILESTATES, NULL, (void **) &fileStatesList, NULL) && fileStatesList != NULL) { - if (fileStatesList[filenum] == RPMFILE_STATE_NOTINSTALLED) + rpmfileState fstate = fileStatesList[filenum]; + switch (fstate) { + case RPMFILE_STATE_NETSHARED: + case RPMFILE_STATE_REPLACED: + case RPMFILE_STATE_NOTINSTALLED: return 0; + /*@notreached@*/ break; + case RPMFILE_STATE_NORMAL: + break; + } } - if (lstat(filespec, &sb)) { + if (filespec == NULL || Lstat(filespec, &sb) != 0) { *result |= RPMVERIFY_LSTATFAIL; return 1; } + /* + * Not all attributes of non-regular files can be verified. + */ if (S_ISDIR(sb.st_mode)) flags &= ~(RPMVERIFY_MD5 | RPMVERIFY_FILESIZE | RPMVERIFY_MTIME | RPMVERIFY_LINKTO); else if (S_ISLNK(sb.st_mode)) { flags &= ~(RPMVERIFY_MD5 | RPMVERIFY_FILESIZE | RPMVERIFY_MTIME | RPMVERIFY_MODE); -# if CHOWN_FOLLOWS_SYMLINK +#if CHOWN_FOLLOWS_SYMLINK flags &= ~(RPMVERIFY_USER | RPMVERIFY_GROUP); -# endif +#endif } else if (S_ISFIFO(sb.st_mode)) flags &= ~(RPMVERIFY_MD5 | RPMVERIFY_FILESIZE | RPMVERIFY_MTIME | @@ -174,13 +197,23 @@ int rpmVerifyFile(const char * root, Header h, int filenum, else flags &= ~(RPMVERIFY_LINKTO); - /* Don't verify any features in omitMask */ + /* + * Content checks of %ghost files are meaningless. + */ + if (fileAttrs & RPMFILE_GHOST) { + flags &= ~(RPMVERIFY_MD5 | RPMVERIFY_FILESIZE | RPMVERIFY_MTIME | + RPMVERIFY_LINKTO); + } + + /* + * Don't verify any features in omitMask. + */ flags &= ~(omitMask | RPMVERIFY_LSTATFAIL|RPMVERIFY_READFAIL|RPMVERIFY_READLINKFAIL); if (flags & RPMVERIFY_MD5) { unsigned char md5sum[40]; const char ** md5List; - int mdt; + rpmTagType mdt; if (!hge(h, RPMTAG_FILEMD5S, &mdt, (void **) &md5List, NULL)) *result |= RPMVERIFY_MD5; @@ -202,12 +235,12 @@ int rpmVerifyFile(const char * root, Header h, int filenum, char linkto[1024]; int size = 0; const char ** linktoList; - int ltt; + rpmTagType ltt; if (!hge(h, RPMTAG_FILELINKTOS, <t, (void **) &linktoList, NULL) - || (size = readlink(filespec, linkto, sizeof(linkto)-1) == -1)) + || (size = Readlink(filespec, linkto, sizeof(linkto)-1)) == -1) *result |= (RPMVERIFY_READLINKFAIL|RPMVERIFY_LINKTO); - else { + else { linkto[size] = '\0'; if (strcmp(linkto, linktoList[filenum])) *result |= RPMVERIFY_LINKTO; @@ -257,7 +290,7 @@ int rpmVerifyFile(const char * root, Header h, int filenum, const char * name; const char ** unameList; int_32 * uidList; - int unt; + rpmTagType unt; if (hge(h, RPMTAG_FILEUSERNAME, &unt, (void **) &unameList, NULL)) { name = uidToUname(sb.st_uid); @@ -277,7 +310,7 @@ int rpmVerifyFile(const char * root, Header h, int filenum, if (flags & RPMVERIFY_GROUP) { const char ** gnameList; int_32 * gidList; - int gnt; + rpmTagType gnt; gid_t gid; if (hge(h, RPMTAG_FILEGROUPNAME, &gnt, (void **) &gnameList, NULL)) { @@ -331,14 +364,69 @@ int rpmVerifyScript(const char * rootDir, Header h, /*@null@*/ FD_t scriptFd) return rc; } -/* ======================================================================== */ +/** + * Check original header digest. + * @todo Make digest check part of rpmdb iterator. + * @param h header + * @return 0 on succes, 1 digest mismatch + */ +static int verifyDigest(Header h) + /*@modifies nothing @*/ +{ + HGE_t hge = (HGE_t)headerGetEntry; /* XXX headerGetEntryMinMemory? */ + HFD_t hfd = headerFreeData; + void * uh = NULL; + rpmTagType uht; + int_32 uhc; + const char * hdigest; + rpmTagType hdt; + int ec = 0; /* assume no problems */ + + /* Retrieve header digest. */ + if (!hge(h, RPMTAG_SHA1HEADER, &hdt, (void **) &hdigest, NULL)) + return 0; + if (hdigest == NULL) + return 0; + + /* Regenerate original header. */ + if (!hge(h, RPMTAG_HEADERIMMUTABLE, &uht, &uh, &uhc)) + return 0; + + /* Compute header digest. */ + { const char * digest; + size_t digestlen; + int flags = RPMDIGEST_SHA1; + DIGEST_CTX ctx = rpmDigestInit(flags); + + rpmDigestUpdate(ctx, uh, uhc); + rpmDigestFinal(ctx, (void **)&digest, &digestlen, 1); + + if (digest) { /* XXX can't happen */ + const char *n, *v, *r; + headerNVR(h, &n, &v, &r); + if (strcmp(hdigest, digest)) { + rpmMessage(RPMMESS_NORMAL, + _("%s-%s-%s: immutable header region digest check failed\n"), + n, v, r); + ec = 1; + } + } + digest = _free(digest); + } + + uh = hfd(uh, uht); + hdigest = hfd(hdigest, hdt); + + return ec; +} + /** * Check file info from header against what's actually installed. * @param h header * @return 0 no problems, 1 problems found */ static int verifyHeader(QVA_t qva, Header h) - /*@*/ + /*@modifies h @*/ { HGE_t hge = (HGE_t)headerGetEntryMinMemory; char buf[BUFSIZ]; @@ -365,11 +453,13 @@ static int verifyHeader(QVA_t qva, Header h) rpmBuildFileList(h, &fileNames, &count); for (i = 0; i < count; i++) { + rpmfileAttrs fileAttrs; int rc; + fileAttrs = fileFlags[i]; rc = rpmVerifyFile(prefix, h, i, &verifyResult, omitMask); if (rc) { - if (!(fileFlags[i] & RPMFILE_MISSINGOK) || rpmIsVerbose()) { + if (!(fileAttrs & RPMFILE_MISSINGOK) || rpmIsVerbose()) { sprintf(te, _("missing %s"), fileNames[i]); te += strlen(te); ec = rc; @@ -405,9 +495,13 @@ static int verifyHeader(QVA_t qva, Header h) #undef _verifyfile sprintf(te, "%s%s%s%s%s%s%s%s %c %s", - size, mode, md5, rdev, link, user, group, mtime, - fileFlags[i] & RPMFILE_CONFIG ? 'c' : ' ', - fileNames[i]); + size, mode, md5, rdev, link, user, group, mtime, + ((fileAttrs & RPMFILE_CONFIG) ? 'c' : + (fileAttrs & RPMFILE_DOC) ? 'd' : + (fileAttrs & RPMFILE_GHOST) ? 'g' : + (fileAttrs & RPMFILE_LICENSE) ? 'l' : + (fileAttrs & RPMFILE_README) ? 'r' : ' '), + fileNames[i]); te += strlen(te); } @@ -447,10 +541,10 @@ static int verifyDependencies(rpmdb rpmdb, Header h) rpmtransFree(rpmdep); if (numConflicts) { - const char * name, * version, * release; + const char *n, *v, *r; char * t, * te; int nb = 512; - (void) headerNVR(h, &name, &version, &release); + (void) headerNVR(h, &n, &v, &r); for (i = 0; i < numConflicts; i++) { nb += strlen(conflicts[i].needsName) + sizeof(", ") - 1; @@ -459,8 +553,7 @@ static int verifyDependencies(rpmdb rpmdb, Header h) } te = t = alloca(nb); *te = '\0'; - sprintf(te, _("Unsatisfied dependencies for %s-%s-%s: "), - name, version, release); + sprintf(te, _("Unsatisfied dependencies for %s-%s-%s: "), n, v, r); te += strlen(te); for (i = 0; i < numConflicts; i++) { if (i) te = stpcpy(te, ", "); @@ -491,26 +584,32 @@ static int verifyDependencies(rpmdb rpmdb, Header h) int showVerifyPackage(QVA_t qva, rpmdb rpmdb, Header h) { const char * prefix = (qva->qva_prefix ? qva->qva_prefix : ""); - FD_t fdo; int ec = 0; int rc; - if ((qva->qva_flags & VERIFY_DEPS) && - (rc = verifyDependencies(rpmdb, h)) != 0) + if (qva->qva_flags & VERIFY_DIGEST) { + if ((rc = verifyDigest(h)) != 0) + ec = rc; + } + if (qva->qva_flags & VERIFY_DEPS) { + if ((rc = verifyDependencies(rpmdb, h)) != 0) ec = rc; - if ((qva->qva_flags & VERIFY_FILES) && - (rc = verifyHeader(qva, h)) != 0) - ec = rc;; - fdo = fdDup(STDOUT_FILENO); - if ((qva->qva_flags & VERIFY_SCRIPT) && - (rc = rpmVerifyScript(prefix, h, fdo)) != 0) + } + if (qva->qva_flags & VERIFY_FILES) { + if ((rc = verifyHeader(qva, h)) != 0) ec = rc; - if (fdo) - rc = Fclose(fdo); + } + if (qva->qva_flags & VERIFY_SCRIPT) { + FD_t fdo = fdDup(STDOUT_FILENO); + if ((rc = rpmVerifyScript(prefix, h, fdo)) != 0) + ec = rc; + if (fdo) + rc = Fclose(fdo); + } return ec; } -int rpmVerify(QVA_t qva, rpmQVSources source, const char *arg) +int rpmVerify(QVA_t qva, rpmQVSources source, const char * arg) { rpmdb rpmdb = NULL; int rc; diff --git a/python/rpmmodule.c b/python/rpmmodule.c index 3242847..c190dff 100644 --- a/python/rpmmodule.c +++ b/python/rpmmodule.c @@ -14,7 +14,7 @@ #include #include "Python.h" -#include "rpmlib.h" +#include "rpmcli.h" /* XXX for rpmCheckSig */ #include "misc.h" #include "rpmmacro.h" #include "rpmio_internal.h" diff --git a/rpm.c b/rpm.c index 22b590a..b048327 100755 --- a/rpm.c +++ b/rpm.c @@ -1277,7 +1277,7 @@ int main(int argc, const char ** argv) break; case MODE_VERIFY: - verifyFlags = (VERIFY_FILES|VERIFY_DEPS|VERIFY_SCRIPT|VERIFY_MD5); + verifyFlags = VERIFY_ALL; verifyFlags &= ~qva->qva_flags; if (noDeps) verifyFlags &= ~VERIFY_DEPS; if (noScripts) verifyFlags &= ~VERIFY_SCRIPT; diff --git a/rpmdb/fprint.c b/rpmdb/fprint.c index d85b8df..d300f57 100644 --- a/rpmdb/fprint.c +++ b/rpmdb/fprint.c @@ -238,7 +238,7 @@ void fpLookupHeader(fingerPrintCache cache, Header h, fingerPrint * fpList) HGE_t hge = (HGE_t)headerGetEntryMinMemory; HFD_t hfd = headerFreeData; const char ** baseNames, ** dirNames; - int bnt, dnt; + rpmTagType bnt, dnt; int_32 * dirIndexes; int fileCount; diff --git a/rpmdb/rpmdb.c b/rpmdb/rpmdb.c index 3a1aca5..e3d7669 100644 --- a/rpmdb/rpmdb.c +++ b/rpmdb/rpmdb.c @@ -1050,7 +1050,7 @@ static int rpmdbFindByFile(rpmdb db, /*@null@*/ const char * filespec, HFD_t hfd = headerFreeData; const char * dirName; const char * baseName; - int bnt, dnt; + rpmTagType bnt, dnt; fingerPrintCache fpc; fingerPrint fp1; dbiIndex dbi = NULL; @@ -1881,7 +1881,7 @@ int rpmdbRemove(rpmdb rpmdb, int rid, unsigned int hdrNum) DBC * dbcursor = NULL; const char *av[1]; const char ** rpmvals = NULL; - int rpmtype = 0; + rpmTagType rpmtype = 0; int rpmcnt = 0; int rpmtag; int xx; @@ -2047,7 +2047,7 @@ int rpmdbAdd(rpmdb rpmdb, int iid, Header h) HFD_t hfd = headerFreeData; sigset_t signalMask; const char ** baseNames; - int bnt; + rpmTagType bnt; int count = 0; dbiIndex dbi; int dbix; @@ -2135,7 +2135,7 @@ int rpmdbAdd(rpmdb rpmdb, int iid, Header h) DBC * dbcursor = NULL; const char *av[1]; const char **rpmvals = NULL; - int rpmtype = 0; + rpmTagType rpmtype = 0; int rpmcnt = 0; int rpmtag; int_32 * requireFlags; @@ -2338,7 +2338,7 @@ int rpmdbFindFpList(rpmdb rpmdb, fingerPrint * fpList, dbiIndexSet * matchList, const char ** dirNames; const char ** baseNames; const char ** fullBaseNames; - int bnt, dnt; + rpmTagType bnt, dnt; int_32 * dirIndexes; int_32 * fullDirIndexes; fingerPrint * fps; diff --git a/rpmio/rpmerr.h b/rpmio/rpmerr.h index c83ba32..36d50a2 100644 --- a/rpmio/rpmerr.h +++ b/rpmio/rpmerr.h @@ -22,16 +22,20 @@ /** * Tokens used by rpmError(). */ -/*@-enummemuse -typeuse @*/ +/*@-typeuse @*/ typedef enum rpmerrCode_e { +/*@-enummemuse@*/ RPMERR_GDBMOPEN = _em(2), /*!< gdbm open failed */ RPMERR_GDBMREAD = _em(3), /*!< gdbm read failed */ RPMERR_GDBMWRITE = _em(4), /*!< gdbm write failed */ +/*@=enummemuse@*/ RPMERR_INTERNAL = _em(5), /*!< internal RPM error */ RPMERR_DBCORRUPT = _em(6), /*!< rpm database is corrupt */ +/*@-enummemuse@*/ RPMERR_OLDDBCORRUPT = _em(7), /*!< old style rpm database is corrupt */ RPMERR_OLDDBMISSING = _em(8), /*!< old style rpm database is missing */ RPMERR_NOCREATEDB = _em(9), /*!< cannot create new database */ +/*@=enummemuse@*/ RPMERR_DBOPEN = _em(10), /*!< database open failed */ RPMERR_DBGETINDEX = _em(11), /*!< database get from index failed */ RPMERR_DBPUTINDEX = _em(12), /*!< database get from index failed */ @@ -40,29 +44,39 @@ typedef enum rpmerrCode_e { RPMERR_RENAME = _em(15), /*!< rename(2) failed */ RPMERR_UNLINK = _em(16), /*!< unlink(2) failed */ RPMERR_RMDIR = _em(17), /*!< rmdir(2) failed */ +/*@-enummemuse@*/ RPMERR_PKGINSTALLED = _em(18), /*!< package already installed */ RPMERR_CHOWN = _em(19), /*!< chown() call failed */ RPMERR_NOUSER = _em(20), /*!< user does not exist */ RPMERR_NOGROUP = _em(21), /*!< group does not exist */ +/*@=enummemuse@*/ RPMERR_MKDIR = _em(22), /*!< mkdir() call failed */ +/*@-enummemuse@*/ RPMERR_FILECONFLICT = _em(23), /*!< file being installed exists */ +/*@=enummemuse@*/ RPMERR_RPMRC = _em(24), /*!< bad line in rpmrc */ RPMERR_NOSPEC = _em(25), /*!< .spec file is missing */ RPMERR_NOTSRPM = _em(26), /*!< a source rpm was expected */ RPMERR_FLOCK = _em(27), /*!< locking the database failed */ +/*@-enummemuse@*/ RPMERR_OLDPACKAGE = _em(28), /*!< trying upgrading to old version */ /* RPMERR_BADARCH = _em(29), bad architecture or arch mismatch */ +/*@=enummemuse@*/ RPMERR_CREATE = _em(30), /*!< failed to create a file */ RPMERR_NOSPACE = _em(31), /*!< out of disk space */ +/*@-enummemuse@*/ RPMERR_NORELOCATE = _em(32), /*!< tried to do improper relocatation */ /* RPMERR_BADOS = _em(33), bad architecture or arch mismatch */ RPMMESS_BACKUP = _em(34), /*!< backup made during [un]install */ +/*@=enummemuse@*/ RPMERR_MTAB = _em(35), /*!< failed to read mount table */ RPMERR_STAT = _em(36), /*!< failed to stat something */ RPMERR_BADDEV = _em(37), /*!< file on device not listed in mtab */ +/*@-enummemuse@*/ RPMMESS_ALTNAME = _em(38), /*!< file written as .rpmnew */ RPMMESS_PREREQLOOP = _em(39), /*!< loop in prerequisites */ RPMERR_BADRELOCATE = _em(40), /*!< bad relocation was specified */ +/*@=enummemuse@*/ RPMERR_OLDDB = _em(41), /*!< old format database */ RPMERR_UNMATCHEDIF = _em(107), /*!< unclosed %ifarch or %ifos */ @@ -70,14 +84,20 @@ typedef enum rpmerrCode_e { RPMERR_BADARG = _em(109), /*!< */ RPMERR_SCRIPT = _em(110), /*!< errors related to script exec */ RPMERR_READ = _em(111), /*!< */ +/*@-enummemuse@*/ RPMERR_UNKNOWNOS = _em(112), /*!< */ RPMERR_UNKNOWNARCH = _em(113), /*!< */ +/*@=enummemuse@*/ RPMERR_EXEC = _em(114), /*!< */ RPMERR_FORK = _em(115), /*!< */ RPMERR_CPIO = _em(116), /*!< */ +/*@-enummemuse@*/ RPMERR_GZIP = _em(117), /*!< */ +/*@=enummemuse@*/ RPMERR_BADSPEC = _em(118), /*!< */ +/*@-enummemuse@*/ RPMERR_LDD = _em(119), /*!< couldn't understand ldd output */ +/*@=enummemuse@*/ RPMERR_BADFILENAME = _em(120), /*!< */ RPMERR_OPEN = _em(121), /*!< */ RPMERR_POPEN = _em(122), /*!< */ @@ -86,7 +106,9 @@ typedef enum rpmerrCode_e { RPMERR_QFMT = _em(125), /*!< */ RPMERR_DBCONFIG = _em(126), /*!< */ RPMERR_DBERR = _em(127), /*!< */ +/*@-enummemuse@*/ RPMERR_BADPACKAGE = _em(128), /*!< getNextHeader: %s */ +/*@=enummemuse@*/ RPMERR_FREELIST = _em(129), /*!< free list corrupt (%u)- please ... */ RPMERR_DATATYPE = _em(130), /*!< Data type %d not supported */ RPMERR_BUILDROOT = _em(131), /*!< */ @@ -98,6 +120,7 @@ typedef enum rpmerrCode_e { RPMERR_QUERYINFO = _nm(137), /*!< */ RPMERR_MANIFEST = _nm(138), /*!< %s: read manifest failed: %s */ RPMERR_BADHEADER = _em(139), /*!< */ + RPMERR_FSEEK = _em(140), /*!< %s: Fseek failed: %s */ RPMERR_BADSIGTYPE = _em(200), /*!< Unknown signature type */ RPMERR_SIGGEN = _em(201), /*!< Error generating signature */ @@ -107,7 +130,7 @@ typedef enum rpmerrCode_e { RPMWARN_RMDIR = _wm(512u+17), /*!< rmdir(2) failed */ RPMWARN_FLOCK = _wm(512u+27) /*!< locking the database failed */ } rpmerrCode; -/*@=enummemuse =typeuse @*/ +/*@=typeuse @*/ /** * Retrofit rpmError() onto rpmlog sub-system. diff --git a/rpmqv.c b/rpmqv.c index 297d6a8..e2e8a29 100755 --- a/rpmqv.c +++ b/rpmqv.c @@ -20,33 +20,6 @@ #define GETOPT_RECOMPILE 1004 #endif -#ifdef DYING -#ifdef IAM_RPMDB -#define GETOPT_REBUILDDB 1013 -#define GETOPT_VERIFYDB 1023 -static int initdb = 0; -#endif -#endif - -#ifdef DYING -#ifdef IAM_RPMEIU -#define GETOPT_INSTALL 1014 -#define GETOPT_RELOCATE 1016 -#define GETOPT_EXCLUDEPATH 1019 -static int incldocs = 0; -/*@null@*/ static const char * prefix = NULL; -#endif /* IAM_RPMEIU */ -#endif - -#ifdef DYING -#ifdef IAM_RPMK -#define GETOPT_ADDSIGN 1005 -#define GETOPT_RESIGN 1006 -static int noGpg = 0; -static int noPgp = 0; -#endif /* IAM_RPMK */ -#endif - #if defined(IAM_RPMBT) || defined(IAM_RPMK) #include "signature.h" #endif @@ -100,9 +73,6 @@ extern int _ftp_debug; extern int noLibio; extern int _rpmio_debug; extern int _url_debug; -#ifdef DYING -extern int _noDirTokens; -#endif /*@-varuse@*/ /*@observer@*/ extern const char * rpmNAME; @@ -126,19 +96,6 @@ static int quiet = 0; static int showrc = 0; static int showVersion = 0; -#ifdef DYING -#if defined(IAM_RPMQV) || defined(IAM_RPMK) -static int noMd5 = 0; -#endif -#endif - -#ifdef DYING -#if defined(IAM_RPMEIU) -static int noDeps = 0; -static int force = 0; -#endif -#endif - static struct poptOption rpmAllPoptTable[] = { { "version", '\0', 0, &showVersion, 0, N_("print the version of rpm being used"), @@ -189,171 +146,6 @@ static struct poptOption rpmAllPoptTable[] = { POPT_TABLEEND }; -#ifdef DYING -#ifdef IAM_RPMDB -static struct poptOption rpmDatabasePoptTable[] = { - { "initdb", '\0', 0, &initdb, 0, - N_("initialize database"), NULL}, - { "rebuilddb", '\0', 0, 0, GETOPT_REBUILDDB, - N_("rebuild database inverted lists from installed package headers"), - NULL}, - { "verifydb", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, GETOPT_VERIFYDB, - N_("verify database files"), - NULL}, - { "nodirtokens", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_noDirTokens, 1, - N_("generate headers compatible with (legacy) rpm[23] packaging"), - NULL}, - { "dirtokens", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_noDirTokens, 0, - N_("generate headers compatible with rpm4 packaging"), NULL}, - - POPT_TABLEEND -}; -#endif /* IAM_RPMDB */ -#endif - -#ifdef DYING -#ifdef IAM_RPMK -static struct poptOption rpmSignPoptTable[] = { - { "addsign", '\0', 0, 0, GETOPT_ADDSIGN, - N_("add a signature to a package"), NULL }, - { "resign", '\0', 0, 0, GETOPT_RESIGN, - N_("sign a package (discard current signature)"), NULL }, - { "sign", '\0', 0, &signIt, 0, - N_("generate GPG/PGP signature"), NULL }, - { "checksig", 'K', 0, 0, 'K', - N_("verify package signature"), NULL }, - { "nogpg", '\0', 0, &noGpg, 0, - N_("skip any GPG signatures"), NULL }, - { "nopgp", '\0', POPT_ARGFLAG_DOC_HIDDEN, &noPgp, 0, - N_("skip any PGP signatures"), NULL }, - { "nomd5", '\0', 0, &noMd5, 0, - N_("do not verify file md5 checksums"), NULL }, - - POPT_TABLEEND -}; -#endif /* IAM_RPMK */ -#endif - -#ifdef DYING -#ifdef IAM_RPMEIU -static rpmtransFlags transFlags = RPMTRANS_FLAG_NONE; -static rpmprobFilterFlags probFilter = RPMPROB_FILTER_NONE; -static rpmInstallInterfaceFlags installInterfaceFlags = INSTALL_NONE; -static rpmEraseInterfaceFlags eraseInterfaceFlags = UNINSTALL_NONE; - -static struct poptOption rpmInstallPoptTable[] = { - { "allfiles", '\0', POPT_BIT_SET, &transFlags, RPMTRANS_FLAG_ALLFILES, - N_("install all files, even configurations which might otherwise be skipped"), - NULL}, - { "allmatches", '\0', POPT_BIT_SET, &eraseInterfaceFlags, UNINSTALL_ALLMATCHES, - N_("remove all packages which match (normally an error is generated if specified multiple packages)"), - NULL}, - - { "apply", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &transFlags, - (_noTransScripts|_noTransTriggers| - RPMTRANS_FLAG_APPLYONLY|RPMTRANS_FLAG_PKGCOMMIT), - N_("do not execute package scriptlet(s)"), NULL }, - - { "badreloc", '\0', POPT_BIT_SET, &probFilter, RPMPROB_FILTER_FORCERELOCATE, - N_("relocate files in non-relocateable package"), NULL}, - { "dirstash", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &transFlags, - RPMTRANS_FLAG_DIRSTASH, - N_("save erased package files by renaming into sub-directory"), NULL}, - { "erase", 'e', 0, 0, 'e', - N_("erase (uninstall) package"), N_("+") }, - { "excludedocs", '\0', POPT_BIT_SET, &transFlags, RPMTRANS_FLAG_NODOCS, - N_("do not install documentation"), NULL}, - { "excludepath", '\0', POPT_ARG_STRING, 0, GETOPT_EXCLUDEPATH, - N_("skip files with leading component "), - N_("") }, - { "force", '\0', 0, &force, 0, - N_("short hand for --replacepkgs --replacefiles"), NULL}, - { "freshen", 'F', POPT_BIT_SET, &installInterfaceFlags, - (INSTALL_UPGRADE|INSTALL_FRESHEN), - N_("upgrade package(s) if already installed"), - N_("+") }, - { "hash", 'h', POPT_BIT_SET, &installInterfaceFlags, INSTALL_HASH, - N_("print hash marks as package installs (good with -v)"), NULL}, - { "ignorearch", '\0', POPT_BIT_SET, &probFilter, RPMPROB_FILTER_IGNOREARCH, - N_("don't verify package architecture"), NULL}, - { "ignoreos", '\0', POPT_BIT_SET, &probFilter, RPMPROB_FILTER_IGNOREOS, - N_("don't verify package operating system"), NULL}, - { "ignoresize", '\0', POPT_BIT_SET, &probFilter, - (RPMPROB_FILTER_DISKSPACE|RPMPROB_FILTER_DISKNODES), - N_("don't check disk space before installing"), NULL}, - { "includedocs", '\0', 0, &incldocs, 0, - N_("install documentation"), NULL}, - { "install", '\0', 0, 0, GETOPT_INSTALL, - N_("install package"), N_("+") }, - { "justdb", '\0', POPT_BIT_SET, &transFlags, RPMTRANS_FLAG_JUSTDB, - N_("update the database, but do not modify the filesystem"), NULL}, - { "nodeps", '\0', 0, &noDeps, 0, - N_("do not verify package dependencies"), NULL }, - { "noorder", '\0', POPT_BIT_SET, &installInterfaceFlags, INSTALL_NOORDER, - N_("do not reorder package installation to satisfy dependencies"), - NULL}, - - { "noscripts", '\0', POPT_BIT_SET, &transFlags, - (_noTransScripts|_noTransTriggers), - N_("do not execute package scriptlet(s)"), NULL }, - { "nopre", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &transFlags, - RPMTRANS_FLAG_NOPRE, - N_("do not execute %%pre scriptlet (if any)"), NULL }, - { "nopost", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &transFlags, - RPMTRANS_FLAG_NOPOST, - N_("do not execute %%post scriptlet (if any)"), NULL }, - { "nopreun", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &transFlags, - RPMTRANS_FLAG_NOPREUN, - N_("do not execute %%preun scriptlet (if any)"), NULL }, - { "nopostun", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &transFlags, - RPMTRANS_FLAG_NOPOSTUN, - N_("do not execute %%postun scriptlet (if any)"), NULL }, - - { "notriggers", '\0', POPT_BIT_SET, &transFlags, - _noTransTriggers, - N_("do not execute any scriptlet(s) triggered by this package"), NULL}, - { "notriggerprein", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &transFlags, - RPMTRANS_FLAG_NOTRIGGERPREIN, - N_("do not execute any %%triggerprein scriptlet(s)"), NULL}, - { "notriggerin", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &transFlags, - RPMTRANS_FLAG_NOTRIGGERIN, - N_("do not execute any %%triggerin scriptlet(s)"), NULL}, - { "notriggerun", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &transFlags, - RPMTRANS_FLAG_NOTRIGGERUN, - N_("do not execute any %%triggerun scriptlet(s)"), NULL}, - { "notriggerpostun", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &transFlags, - RPMTRANS_FLAG_NOTRIGGERPOSTUN, - N_("do not execute any %%triggerpostun scriptlet(s)"), NULL}, - - { "oldpackage", '\0', POPT_BIT_SET, &probFilter, RPMPROB_FILTER_OLDPACKAGE, - N_("upgrade to an old version of the package (--force on upgrades does this automatically)"), - NULL}, - { "percent", '\0', POPT_BIT_SET, &installInterfaceFlags, INSTALL_PERCENT, - N_("print percentages as package installs"), NULL}, - { "prefix", '\0', POPT_ARG_STRING, &prefix, 0, - N_("relocate the package to , if relocatable"), - N_("") }, - { "relocate", '\0', POPT_ARG_STRING, 0, GETOPT_RELOCATE, - N_("relocate files from path to "), - N_("=") }, - { "repackage", '\0', POPT_BIT_SET, &transFlags, RPMTRANS_FLAG_REPACKAGE, - N_("save erased package files by repackaging"), NULL}, - { "replacefiles", '\0', POPT_BIT_SET, &probFilter, - (RPMPROB_FILTER_REPLACEOLDFILES | RPMPROB_FILTER_REPLACENEWFILES), - N_("install even if the package replaces installed files"), NULL}, - { "replacepkgs", '\0', POPT_BIT_SET, &probFilter, RPMPROB_FILTER_REPLACEPKG, - N_("reinstall if the package is already present"), NULL}, - { "test", '\0', POPT_BIT_SET, &transFlags, RPMTRANS_FLAG_TEST, - N_("don't install, but tell if it would work or not"), NULL}, - { "upgrade", 'U', POPT_BIT_SET, &installInterfaceFlags, INSTALL_UPGRADE, - N_("upgrade package(s)"), - N_("+") }, - - POPT_TABLEEND -}; -#endif /* IAM_RPMEIU */ -#endif /* DYING */ - /* the structure describing the options we take and the defaults */ static struct poptOption optionsTable[] = { #if !defined(_AUTOHELP) @@ -434,13 +226,11 @@ static void printBanner(void) static void printUsage(void) /*@modifies fileSystem @*/ { - FILE * fp; + FILE * fp = stdout; printVersion(); printBanner(); (void) puts(""); - fp = stdout; - fprintf(fp, _("Usage: %s {--help}\n"), __progname); fprintf(fp, (" %s {--version}\n"), __progname); @@ -451,7 +241,7 @@ static void printUsage(void) --force alias for --replacepkgs --replacefiles --includedocs handle as option in table --erase forbids many options -#endif +#endif /* DYING */ #endif /* IAM_RPMEIU */ #ifdef IAM_RPMQV @@ -473,251 +263,6 @@ static void printUsage(void) } -#ifdef DYING -static void printHelpLine(char * prefix, char * help) - /*@modifies fileSystem @*/ -{ - int indentLength = strlen(prefix) + 3; - int lineLength = 79 - indentLength; - int helpLength = strlen(help); - char * ch; - char format[10]; - - fprintf(stdout, "%s - ", prefix); - - while (helpLength > lineLength) { - ch = help + lineLength - 1; - while (ch > help && !isspace(*ch)) ch--; - if (ch == help) break; /* give up */ - while (ch > (help + 1) && isspace(*ch)) ch--; - ch++; - - sprintf(format, "%%.%ds\n%%%ds", (int) (ch - help), indentLength); - fprintf(stdout, format, help, " "); - help = ch; - while (isspace(*help) && *help) help++; - helpLength = strlen(help); - } - - if (helpLength) puts(help); -} - -static void printHelp(void) { - printVersion(); - printBanner(); - puts(""); - - puts( _("Usage:")); - printHelpLine( " --help ", - _("print this message")); - printHelpLine( " --version ", - _("print the version of rpm being used")); - - puts(""); - puts( _(" All modes support the following options:")); - printHelpLine(_(" --define ' '"), - _("define macro with value ")); - printHelpLine(_(" --eval '+' "), - _("print the expansion of macro to stdout")); - printHelpLine(_(" --pipe "), - _("send stdout to ")); - printHelpLine(_(" --rcfile "), - _("use instead of default list of macro files")); - printHelpLine( " --showrc ", - _("display final rpmrc and macro configuration")); -#if defined(IAM_RPMBT) || defined(IAM_RPMDB) || defined(IAM_RPMEIU) || defined(IAM_RPMQV) - printHelpLine(_(" --dbpath "), - _("use as the directory for the database")); - printHelpLine(_(" --root "), - _("use as the top level directory")); -#endif /* IAM_RPMBT || IAM_RPMDB || IAM_RPMEIU || IAM_RPMQV */ - printHelpLine( " -v ", - _("be a little more verbose")); - printHelpLine( " -vv ", - _("be incredibly verbose (for debugging)")); - -#if defined(IAM_RPMEIU) || defined(IAM_RPMQV) - puts(""); - puts( _(" Install, upgrade and query (with -p) modes allow URL's to be used in place")); - puts( _(" of file names as well as the following options:")); - printHelpLine(_(" --ftpproxy "), - _("hostname or IP of ftp proxy")); - printHelpLine(_(" --ftpport "), - _("port number of ftp server (or proxy)")); - printHelpLine(_(" --httpproxy "), - _("hostname or IP of http proxy")); - printHelpLine(_(" --httpport "), - _("port number of http server (or proxy)")); -#endif /* IAM_RPMEIU || IAM_RPMQV */ - -#ifdef IAM_RPMQV - puts(""); - puts( _(" Package specification options:")); - printHelpLine( " -a, --all ", - _("query/verify all packages")); - printHelpLine(_(" -f + "), - _("query/verify package owning ")); - printHelpLine(_(" -p + "), - _("query/verify (uninstalled) package ")); - printHelpLine(_(" --triggeredby "), - _("query/verify packages triggered by ")); - printHelpLine(_(" --whatprovides "), - _("query/verify packages which provide capability")); - printHelpLine(_(" --whatrequires "), - _("query/verify packages which require capability")); - puts(""); - printHelpLine( " -q, --query ", - _("query mode")); - printHelpLine(_(" --queryformat "), - _("use as the header format (implies --info)")); - puts(""); - puts( _(" Information selection options:")); - printHelpLine( " -i, --info ", - _("display package information")); - printHelpLine( " --changelog ", - _("display the package's change log")); - printHelpLine( " -l ", - _("display package file list")); - printHelpLine( " -s ", - _("show file states (implies -l)")); - printHelpLine( " -d ", - _("list only documentation files (implies -l)")); - printHelpLine( " -c ", - _("list only configuration files (implies -l)")); - printHelpLine( " --dump ", - _("show all verifiable information for each file (must be used with -l, -c, or -d)")); - printHelpLine( " --provides ", - _("list capabilities provided by package")); - printHelpLine( " -R, --requires ", - _("list capabilities required by package")); - printHelpLine( " --scripts ", - _("print the various [un]install scriptlets")); - printHelpLine( " --triggers ", - _("show the trigger scriptlets contained in the package")); - puts(""); - printHelpLine( " -V, -y, --verify ", - _("verify a package installation using the same same package specification options as -q")); - printHelpLine( " --nodeps ", - _("do not verify package dependencies")); - printHelpLine( " --nofiles ", - _("do not verify file attributes")); - printHelpLine( " --nomd5 ", - _("do not verify file md5 checksums")); - printHelpLine( " --noscripts ", - _("do not execute scripts (if any)")); - puts(""); - printHelpLine( " --querytags ", - _("list the tags that can be used in a query format")); - printHelpLine( " --setperms ", - _("set the file permissions to those in the package database" - " using the same package specification options as -q")); - printHelpLine( " --setugids ", - _("set the file owner and group to those in the package " - "database using the same package specification options as " - "-q")); -#endif /* IAM_RPMQV */ - -#ifdef IAM_RPMEIU - puts(""); - puts( _(" --install ")); - printHelpLine(_(" -i "), - _("install package")); - printHelpLine( " --allfiles ", - _("install all files, even configurations which might " - "otherwise be skipped")); - printHelpLine( " --badreloc ", - _("relocate files in non-relocateable package")); - printHelpLine( " --excludedocs ", - _("do not install documentation")); - printHelpLine(_(" --excludepath "), - _("skip files with leading component ")); - printHelpLine( " --force ", - _("short hand for --replacepkgs --replacefiles")); - printHelpLine( " -h, --hash ", - _("print hash marks as package installs (good with -v)")); - printHelpLine( " --ignorearch ", - _("don't verify package architecture")); - printHelpLine( " --ignoresize ", - _("don't check disk space before installing")); - printHelpLine( " --ignoreos ", - _("don't verify package operating system")); - printHelpLine( " --includedocs ", - _("install documentation")); - printHelpLine( " --justdb ", - _("update the database, but do not modify the filesystem")); - printHelpLine( " --nodeps ", - _("do not verify package dependencies")); - printHelpLine( " --noorder ", - _("do not reorder package installation to satisfy dependencies")); - printHelpLine( " --noscripts ", - _("don't execute any installation scriptlets")); - printHelpLine( " --notriggers ", - _("don't execute any scriptlets triggered by this package")); - printHelpLine( " --percent ", - _("print percentages as package installs")); - printHelpLine(_(" --prefix "), - _("relocate the package to , if relocatable")); - printHelpLine(_(" --relocate ="), - _("relocate files from to ")); - printHelpLine( " --replacefiles ", - _("install even if the package replaces installed files")); - printHelpLine( " --replacepkgs ", - _("reinstall if the package is already present")); - printHelpLine( " --test ", - _("don't install, but tell if it would work or not")); - puts(""); - puts( _(" --upgrade ")); - printHelpLine(_(" -U "), - _("upgrade package (same options as --install, plus)")); - printHelpLine( " --oldpackage ", - _("upgrade to an old version of the package (--force on upgrades does this automatically)")); - puts(""); - puts( _(" --erase ")); - printHelpLine(_(" -e "), - _("erase (uninstall) package")); - printHelpLine( " --allmatches ", - _("remove all packages which match (normally an error is generated if specified multiple packages)")); - printHelpLine( " --justdb ", - _("update the database, but do not modify the filesystem")); - printHelpLine( " --nodeps ", - _("do not verify package dependencies")); - printHelpLine( " --noorder ", - _("do not reorder package installation to satisfy dependencies")); - printHelpLine( " --noscripts ", - _("do not execute any package specific scripts")); - printHelpLine( " --notriggers ", - _("don't execute any scripts triggered by this package")); -#endif /* IAM_RPMEIU */ - -#ifdef IAM_RPMK - puts(""); - printHelpLine(_(" --resign + "), - _("sign a package (discard current signature)")); - printHelpLine(_(" --addsign + "), - _("add a signature to a package")); - - puts( _(" --checksig +")); - printHelpLine(_(" -K + "), - _("verify package signature")); - printHelpLine( " --nopgp ", - _("skip any PGP signatures")); - printHelpLine( " --nogpg ", - _("skip any GPG signatures")); - printHelpLine( " --nomd5 ", - _("skip any MD5 signatures")); -#endif /* IAM_RPMK */ - -#ifdef IAM_RPMDB - puts(""); - printHelpLine( " --initdb ", - _("initalize database (unnecessary, legacy use)")); - printHelpLine( " --rebuilddb ", - _("rebuild database indices from existing database headers")); -#endif - -} -#endif - int main(int argc, const char ** argv) { enum modes bigMode = MODE_UNKNOWN; @@ -731,26 +276,16 @@ int main(int argc, const char ** argv) #endif #ifdef IAM_RPMEIU -#ifdef DYING -/*@only@*/ rpmRelocation * relocations = NULL; - int numRelocations = 0; -#else struct rpmInstallArguments_s * ia = &rpmIArgs; #endif -#endif #if defined(IAM_RPMDB) struct rpmDatabaseArguments_s * da = &rpmDBArgs; #endif #if defined(IAM_RPMK) -#ifdef DYING - rpmResignFlags addSign = RESIGN_NEW_SIGNATURE; - rpmCheckSigFlags checksigFlags = CHECKSIG_NONE; -#else struct rpmSignArguments_s * ka = &rpmKArgs; #endif -#endif #if defined(IAM_RPMBT) || defined(IAM_RPMK) char * passPhrase = ""; @@ -885,12 +420,6 @@ int main(int argc, const char ** argv) #endif #ifdef IAM_RPMEIU -#ifdef DYING - transFlags = RPMTRANS_FLAG_NONE; - probFilter = RPMPROB_FILTER_NONE; - installInterfaceFlags = INSTALL_NONE; - eraseInterfaceFlags = UNINSTALL_NONE; -#else ia->relocations = _free(ia->relocations); memset(ia, 0, sizeof(*ia)); ia->transFlags = RPMTRANS_FLAG_NONE; @@ -898,7 +427,6 @@ int main(int argc, const char ** argv) ia->installInterfaceFlags = INSTALL_NONE; ia->eraseInterfaceFlags = UNINSTALL_NONE; #endif -#endif while ((arg = poptGetNextOpt(optCon)) > 0) { optArg = poptGetOptArg(optCon); @@ -932,107 +460,6 @@ int main(int argc, const char ** argv) break; #endif /* IAM_RPMQV || IAM_RPMEIU || IAM_RPMBT */ -#ifdef DYING -#ifdef IAM_RPMEIU - - case 'e': - if (bigMode != MODE_UNKNOWN && bigMode != MODE_ERASE) - argerror(_("only one major mode may be specified")); - bigMode = MODE_ERASE; - break; - - case GETOPT_INSTALL: - if (bigMode != MODE_UNKNOWN && bigMode != MODE_INSTALL) - argerror(_("only one major mode may be specified")); - bigMode = MODE_INSTALL; - break; - -#ifdef DYING /* XXX handled by popt */ - case 'U': - if (bigMode != MODE_UNKNOWN && bigMode != MODE_INSTALL) - argerror(_("only one major mode may be specified")); - bigMode = MODE_INSTALL; - break; - - case 'F': - if (bigMode != MODE_UNKNOWN && bigMode != MODE_INSTALL) - argerror(_("only one major mode may be specified")); - bigMode = MODE_INSTALL; - break; -#endif - - case GETOPT_EXCLUDEPATH: - if (optArg == NULL || *optArg != '/') - argerror(_("exclude paths must begin with a /")); - - ia->relocations = xrealloc(ia->relocations, - sizeof(*ia->relocations) * (ia->numRelocations + 1)); - /*@-observertrans -dependenttrans@*/ /* FIX: W2DO? */ - ia->relocations[ia->numRelocations].oldPath = optArg; - ia->relocations[ia->numRelocations++].newPath = NULL; - /*@=observertrans =dependenttrans@*/ - break; - - case GETOPT_RELOCATE: - { char * newPath = NULL; - if (optArg == NULL || *optArg != '/') - argerror(_("relocations must begin with a /")); - if (!(newPath = strchr(optArg, '='))) - argerror(_("relocations must contain a =")); - *newPath++ = '\0'; - if (*newPath != '/') - argerror(_("relocations must have a / following the =")); - ia->relocations = xrealloc(ia->relocations, - sizeof(*ia->relocations) * (ia->numRelocations + 1)); - /*@-observertrans -kepttrans@*/ /* FIX: W2DO? */ - ia->relocations[ia->numRelocations].oldPath = optArg; - ia->relocations[ia->numRelocations++].newPath = newPath; - /*@=observertrans =kepttrans@*/ - } break; -#endif /* IAM_RPMEIU */ -#endif /* DYING */ - -#ifdef DYING -#ifdef IAM_RPMDB - case GETOPT_REBUILDDB: - if (bigMode != MODE_UNKNOWN && bigMode != MODE_REBUILDDB) - argerror(_("only one major mode may be specified")); - bigMode = MODE_REBUILDDB; - break; - case GETOPT_VERIFYDB: - if (bigMode != MODE_UNKNOWN && bigMode != MODE_VERIFYDB) - argerror(_("only one major mode may be specified")); - bigMode = MODE_VERIFYDB; - break; -#endif /* IAM_RPMDB */ -#endif /* DYING */ - -#ifdef DYING -#ifdef IAM_RPMK - case 'K': - if (bigMode != MODE_UNKNOWN && bigMode != MODE_CHECKSIG) - argerror(_("only one major mode may be specified")); - bigMode = MODE_CHECKSIG; - break; - - case GETOPT_RESIGN: - if (bigMode != MODE_UNKNOWN && bigMode != MODE_RESIGN) - argerror(_("only one major mode may be specified")); - bigMode = MODE_RESIGN; - addSign = RESIGN_NEW_SIGNATURE; - signIt = 1; - break; - - case GETOPT_ADDSIGN: - if (bigMode != MODE_UNKNOWN && bigMode != MODE_RESIGN) - argerror(_("only one major mode may be specified")); - bigMode = MODE_RESIGN; - addSign = RESIGN_ADD_SIGNATURE; - signIt = 1; - break; -#endif /* IAM_RPMK */ -#endif /* DYING */ - case GETOPT_DEFINEMACRO: if (optArg) { (void) rpmDefineMacro(NULL, optArg, RMIL_CMDLINE); @@ -1153,6 +580,7 @@ int main(int argc, const char ** argv) } #endif /* IAM_RPMQV */ + /* XXX TODO: never happens. */ if (gotDbpath && (bigMode & ~MODES_FOR_DBPATH)) argerror(_("--dbpath given for operation that does not use a " "database")); @@ -1269,22 +697,6 @@ int main(int argc, const char ** argv) } } -#ifdef DYING -#ifdef IAM_RPMK - if (!(ka->checksigFlags & CHECKSIG_PGP) && bigMode != MODE_CHECKSIG) - argerror(_("--nopgp may only be used during signature checking")); - - if (!(ka->checksigFlags & CHECKSIG_GPG) && bigMode != MODE_CHECKSIG) - argerror(_("--nogpg may only be used during signature checking")); -#endif - -#if defined(IAM_RPMK) || defined(IAM_RPMQV) - if ((!(ka->checksigFlags & CHECKSIG_MD5) || noMd5) && bigMode != MODE_CHECKSIG && bigMode != MODE_VERIFY) - argerror(_("--nomd5 may only be used during signature checking and " - "package verification")); -#endif -#endif /* DYING */ - #if defined(IAM_RPMBT) || defined(IAM_RPMK) if (0 #if defined(IAM_RPMBT) @@ -1491,14 +903,6 @@ int main(int argc, const char ** argv) break; case MODE_INSTALL: -#ifdef DYING - if (force) { - ia->probFilter |= RPMPROB_FILTER_REPLACEPKG | - RPMPROB_FILTER_REPLACEOLDFILES | - RPMPROB_FILTER_REPLACENEWFILES | - RPMPROB_FILTER_OLDPACKAGE; - } -#endif /* RPMTRANS_FLAG_BUILD_PROBS */ /* RPMTRANS_FLAG_KEEPOBSOLETE */ @@ -1554,13 +958,12 @@ int main(int argc, const char ** argv) case MODE_VERIFY: { const char * pkg; - int verifyFlags; + rpmVerifyFlags verifyFlags = VERIFY_ALL; - verifyFlags = (VERIFY_FILES|VERIFY_DEPS|VERIFY_SCRIPT|VERIFY_MD5); verifyFlags &= ~qva->qva_flags; - + qva->qva_flags = (rpmQueryFlags) verifyFlags; qva->qva_prefix = rootdir; - qva->qva_flags = verifyFlags; + if (qva->qva_source == RPMQV_ALL) { if (poptPeekArg(optCon)) argerror(_("extra arguments given for verify of all packages")); @@ -1585,11 +988,6 @@ int main(int argc, const char ** argv) case MODE_CHECKSIG: if (!poptPeekArg(optCon)) argerror(_("no packages given for signature check")); -#ifdef DYING - if (!noPgp) checksigFlags |= CHECKSIG_PGP; - if (!noGpg) checksigFlags |= CHECKSIG_GPG; - if (!noMd5) checksigFlags |= CHECKSIG_MD5; -#endif ec = rpmCheckSig(ka->checksigFlags, (const char **)poptGetArgs(optCon)); /* XXX don't overflow single byte exit status */ -- 2.7.4