17 #define _RPMFI_INTERNAL
20 #define _RPMSQ_INTERNAL
25 #define _RPMPS_INTERNAL
26 #define _RPMTS_INTERNAL
34 #define S_ISDEV(m) (S_ISBLK((m)) || S_ISCHR((m)))
53 #if defined(__LCLINT__NOTYET)
61 #define FF_ISSET(_fflags, _FLAG) ((_fflags) & (RPMFILE_##_FLAG))
63 #define VF_ISSET(_vflags, _FLAG) ((_vflags) & (RPMVERIFY_##_FLAG))
64 #define VF_SET(_vflags, _FLAG) \
65 (*((unsigned *)&(_vflags)) |= (RPMVERIFY_##_FLAG))
66 #define VF_CLR(_vflags, _FLAG) \
67 (*((unsigned *)&(_vflags)) &= ~(RPMVERIFY_##_FLAG))
69 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG))
71 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG))
72 #define VSF_SET(_vsflags, _FLAG) \
73 (*((unsigned *)&(_vsflags)) |= (RPMVSF_##_FLAG))
74 #define VSF_CLR(_vsflags, _FLAG) \
75 (*((unsigned *)&(_vsflags)) &= ~(RPMVSF_##_FLAG))
81 #define FF_ISSET(_fflags, _FLAG) ((_fflags) & (RPMFILE_##_FLAG))
83 #define VF_ISSET(_vflags, _FLAG) ((_vflags) & (RPMVERIFY_##_FLAG))
84 #define VF_SET(_vflags, _FLAG) (_vflags) |= (RPMVERIFY_##_FLAG)
85 #define VF_CLR(_vflags, _FLAG) (_vflags) &= ~(RPMVERIFY_##_FLAG)
87 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG))
89 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG))
90 #define VSF_SET(_vsflags, _FLAG) (_vsflags) |= (RPMVSF_##_FLAG)
91 #define VSF_CLR(_vsflags, _FLAG) (_vsflags) &= ~(RPMVSF_##_FLAG)
106 yarnTwist(use, TO, 0);
107 use = yarnFreeLock(use);
132 vf->
flink = fi->flinks[
i];
136 {
struct stat *
st = &vf->
sb;
138 st->st_rdev = fi->frdevs[
i];
139 st->st_ino = fi->finodes[
i];
140 st->st_mode = fi->fmodes[
i];
148 st->st_size = fi->fsizes[i];
149 st->st_blksize = 4 * 1024;
150 st->st_blocks = (st->st_size + (st->st_blksize - 1)) / st->st_blksize;
153 st->st_mtime = fi->fmtimes[i];
159 vf->
dalgo = fi->fdigestalgos
160 ? fi->fdigestalgos[i]
162 vf->
dlen = fi->digestlen;
163 vf->
digest = fi->digests + (fi->digestlen * i);
166 {
unsigned * _vflagsp = (
unsigned *)&vf->
vflags;
217 if (S_ISDIR(sb.st_mode)) {
223 }
else if (
S_ISLNK(sb.st_mode)) {
229 #if CHOWN_FOLLOWS_SYMLINK
234 else if (S_ISFIFO(sb.st_mode)) {
240 }
else if (S_ISCHR(sb.st_mode)) {
246 }
else if (S_ISBLK(sb.st_mode)) {
261 unsigned char *
fdigest = (
unsigned char *)
264 #if defined(RPM_VENDOR_PLD)
272 #define _mask (RPMVERIFY_FDIGEST|RPMVERIFY_HMAC)
292 if ((size =
Readlink(vf->
fn, linkto,
sizeof(linkto)-1)) == -1) {
293 VF_SET(res, READLINKFAIL);
303 if (sb.st_size != vf->
sb.st_size)
309 unsigned short metamode = (
unsigned short)vf->
sb.st_mode;
310 unsigned short filemode = (
unsigned short)sb.st_mode;
317 if (metamode != filemode)
322 if (S_ISCHR(vf->
sb.st_mode) != S_ISCHR(sb.st_mode)
323 || S_ISBLK(vf->
sb.st_mode) != S_ISBLK(sb.st_mode))
328 if (st_rdev != frdev)
334 if (sb.st_mtime != vf->
sb.st_mtime)
375 static const char aok[] =
".";
376 static const char unknown[] =
"?";
378 #define _verify(_FLAG, _C) \
379 (VF_ISSET(res, _FLAG) ? _C : aok)
380 #define _verifylink(_FLAG, _C) \
381 (VF_ISSET(res, READLINKFAIL) ? unknown : \
382 VF_ISSET(res, _FLAG) ? _C : aok)
383 #define _verifyfile(_FLAG, _C) \
384 (VF_ISSET(res, READFAIL) ? unknown : \
385 VF_ISSET(res, _FLAG) ? _C : aok)
390 const char * mtime =
_verify(MTIME,
"T");
391 const char * rdev =
_verify(RDEV,
"D");
392 const char * user =
_verify(USER,
"U");
393 const char * group =
_verify(GROUP,
"G");
400 sprintf(te,
"%s%s%s%s%s%s%s%s %c %s",
401 size, mode, digest, rdev, link, user, group, mtime,
439 if (scriptFd !=
NULL)
454 if (scriptFd !=
NULL)
507 if (altNEVR[0] ==
'R' && altNEVR[1] ==
' ')
508 nb +=
sizeof(
"\tRequires: ")-1;
509 if (altNEVR[0] ==
'C' && altNEVR[1] ==
' ')
510 nb +=
sizeof(
"\tConflicts: ")-1;
511 nb += strlen(altNEVR+2) +
sizeof(
"\n") - 1;
516 te = t = (
char *)
alloca(nb);
518 sprintf(te,
_(
"Unsatisfied dependencies for %s:\n"), pkgNEVR);
526 altNEVR =
"? ?altNEVR?";
527 if (altNEVR[0] ==
'R' && altNEVR[1] ==
' ')
528 te =
stpcpy(te,
"\tRequires: ");
529 if (altNEVR[0] ==
'C' && altNEVR[1] ==
' ')
530 te =
stpcpy(te,
"\tConflicts: ");
555 static int scareMem = 0;
575 (horigin ? horigin :
"verify"), (msg ? msg :
""));
584 #pragma omp parallel for private(i) reduction(+:ec)
586 for (i = 0; i < (
int)fc; i++) {
587 int fflags = fi->fflags[
i];
674 #if defined(SUPPORT_NOSIGNATURES)
676 VSF_SET(vsflags, NOSHA1HEADER);
const unsigned char * digest
int rpmfiSetHeader(rpmfi fi, Header h)
Link a header to a file info set.
rpmlog(RPMLOG_ERR,"%s\n", buf)
struct rpmpsm_s * rpmpsm
Package state machine data.
static int verifyDependencies(QVA_t qva, rpmts ts, Header h)
Check installed package dependencies for problems.
rpmuint32_t rpmfiFNlink(rpmfi fi)
Return (calculated) current file nlink count from file info set.
char * rpmGetPath(const char *path,...)
Return (malloc'ed) expanded, canonicalized, file path.
Structure(s) used for file info tag sets.
static char *size_t nb
fgets(3) analogue that reads \ continuations.
rpmpsi rpmpsFreeIterator(rpmpsi psi)
Destroy problem set iterator.
rpmtransFlags rpmtsSetFlags(rpmts ts, rpmtransFlags transFlags)
Set transaction flags, i.e.
struct rpmts_s * rpmts
The RPM Transaction Set.
int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_t argv)
char * gidToGname(gid_t gid)
#define DRD_xcalloc(_nmemb, _size)
char * rpmProblemGetPkgNEVR(rpmProblem prob)
Return the package NEVR causing the problem.
#define _verify(_FLAG, _C)
pgpDig rpmtsDig(rpmts ts)
Get OpenPGP packet parameters, i.e.
#define RPMVERIFY_FAILURES
rpmRC headerCheck(pgpDig dig, const void *uh, size_t uc, const char **msg)
Check header consistency, performing headerGet() the hard way.
#define FF_ISSET(_fflags, _FLAG)
rpmfi rpmfiFree(rpmfi fi)
Destroy a file info set.
unsigned short rpmuint16_t
void rpmtsEmpty(rpmts ts)
Re-create an empty transaction set.
int dodigest(int dalgo, const char *fn, unsigned char *digest, unsigned dflags, size_t *fsizep)
Return digest and size of a file.
struct rpmps_s * rpmps
Transaction problems found while processing a transaction set/.
#define _verifyfile(_FLAG, _C)
int rpmcliVerify(rpmts ts, QVA_t qva, const char **argv)
Verify package install.
rpmfi rpmfiNew(const void *_ts, Header h, rpmTag tagN, int flags)
Create and load a file info set.
Command line option information.
int rpmfiFC(rpmfi fi)
Return file count from file info set.
static PyObject *char * mode
sprintf(t," (%u)",(unsigned) dig->nbytes)
int rpmpsNumProblems(rpmps ps)
Return number of problems in set.
rpmdepFlags rpmtsSetDFlags(rpmts ts, rpmdepFlags depFlags)
Set dependency flags, i.e.
int showVerifyPackage(QVA_t qva, rpmts ts, Header h)
Display results of package verify.
enum rpmRC_e rpmRC
RPM return codes.
memset(_r, 0, sizeof(*_r))
#define VSF_CLR(_vsflags, _FLAG)
assert(key->size==sizeof(hdrNum))
int rpmtsAddEraseElement(rpmts ts, Header h, uint32_t hdrNum)
Add package to be erased to transaction set.
int gnameToGid(const char *thisGname, gid_t *gid)
int rpmpsNextIterator(rpmpsi psi)
Return next problem set iterator index.
char * rpmProblemGetAltNEVR(rpmProblem prob)
Return the second package NEVR causing the problem.
int Lstat(const char *path, struct stat *st)
lstat(2) clone.
const char * tagName(rpmTag tag)
Return tag name from value.
struct yarnLock_s * yarnLock
int rpmtsAddInstallElement(rpmts ts, Header h, fnpyKey key, int upgrade, rpmRelocation relocs)
Add package to be installed to transaction set.
The FD_t File Handle data structure.
rpmpsm rpmpsmNew(rpmts ts, rpmte te, rpmfi fi)
Create and load a package state machine.
const char * rpmtsRootDir(rpmts ts)
Get transaction rootDir, i.e.
rpmpsi rpmpsInitIterator(rpmps ps)
Initialize problem set iterator.
enum rpmVerifyAttrs_e rpmVerifyAttrs
Bit(s) for rpmVerifyFile() attributes and result.
pgpVSFlags rpmVSFlags
Bit(s) to control digest and signature verification.
int Fclose(FD_t fd)
fclose(3) clone.
enum rpmfileAttrs_e rpmfileAttrs
File Attributes.
rpmps rpmpsFree(rpmps ps)
Destroy a problem set.
static rpmvf rpmvfNew(rpmts ts, rpmfi fi, int i, rpmVerifyAttrs omitMask)
int Readlink(const char *path, char *buf, size_t bufsiz)
readlink(2) clone.
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
#define VF_ISSET(_vflags, _FLAG)
enum rpmfileState_e rpmfileState
File States (when installed).
return strcmp(ame->name, bme->name)
Package state machine to handle a package from a transaction set.
static PyObject *rpmtransFlags transFlags
int _rpmds_unspecified_epoch_noise
enum rpmtransFlags_e rpmtransFlags
Bit(s) to control rpmtsRun() operation.
rpmProblem rpmpsProblem(rpmpsi psi)
Return current problem from problem set.
Methods to handle package elements.
#define VF_SET(_vflags, _FLAG)
char * stpcpy(char *dest, const char *src)
static int rpmvfVerify(rpmvf vf, int spew)
Verify file attributes (including file digest).
char * uidToUname(uid_t uid)
static int rpmVerifyScript(QVA_t qva, rpmts ts, rpmfi fi, FD_t scriptFd)
Return exit code from running verify script from header.
struct rpmProblem_s * rpmProblem
Raw data for an element of a problem set.
rpmpsm rpmpsmFree(rpmpsm psm, const char *msg)
Destroy a package state machine.
static void
Print copy of spec file, filling in Group/Description/Summary from specspo.
#define QVA_ISSET(_qvaflags, _FLAG)
#define VF_CLR(_vflags, _FLAG)
char * buf
Parse (and execute) macro undefinition.
static rpmvf rpmvfFree(rpmvf vf)
int
Save source and expand field into target.
struct rpmfi_s * rpmfi
File info tag sets from a header, so that a header can be discarded early.
int unameToUid(const char *thisUname, uid_t *uid)
#define _verifylink(_FLAG, _C)
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
rpmRC rpmpsmScriptStage(rpmpsm psm, rpmTag scriptTag, rpmTag progTag)
Run rpmpsmStage(PSM_SCRIPT) for scriptTag and progTag.
#define VSF_SET(_vsflags, _FLAG)
int(* rpmtsCheck)(rpmts ts)
Perform dependency resolution on the transaction set.
enum rpmdepFlags_e rpmdepFlags
Bit(s) to control rpmtsCheck() and rpmtsOrder() operation.
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
void rpmtsSetScriptFd(rpmts ts, FD_t scriptFd)
rpmps rpmtsProblems(rpmts ts)
Return current transaction set problems.
const unsigned char * digest
void rpmtsCleanDig(rpmts ts)
Free signature verification data.