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];
133 vf->
fuser = fi->fuser[i];
134 vf->
fgroup = fi->fgroup[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];
142 st->st_nlink =
rpmfiFNlink(fi) + (int)S_ISDIR(st->st_mode);
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;
209 assert(vf->
fn != NULL);
210 if (vf->
fn == NULL ||
Lstat(vf->
fn, &sb) != 0) {
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 #define _mask (RPMVERIFY_FDIGEST|RPMVERIFY_HMAC)
283 if ((size =
Readlink(vf->
fn, linkto,
sizeof(linkto)-1)) == -1) {
284 VF_SET(res, READLINKFAIL);
288 if (vf->
flink == NULL || strcmp(linkto, vf->
flink))
294 if (sb.st_size != vf->
sb.st_size)
300 unsigned short metamode = (
unsigned short)vf->
sb.st_mode;
301 unsigned short filemode = (
unsigned short)sb.st_mode;
308 if (metamode != filemode)
313 if (S_ISCHR(vf->
sb.st_mode) != S_ISCHR(sb.st_mode)
314 || S_ISBLK(vf->
sb.st_mode) != S_ISBLK(sb.st_mode))
319 if (st_rdev != frdev)
325 if (sb.st_mtime != vf->
sb.st_mtime)
331 if (fuser == NULL || vf->
fuser == NULL || strcmp(fuser, vf->
fuser))
337 if (fgroup == NULL || vf->
fgroup == NULL || strcmp(fgroup, vf->
fgroup))
352 sprintf(te,
_(
"missing %c %s"),
362 sprintf(te,
" (%s)", strerror(
errno));
366 static const char aok[] =
".";
367 static const char unknown[] =
"?";
369 #define _verify(_FLAG, _C) \
370 (VF_ISSET(res, _FLAG) ? _C : aok)
371 #define _verifylink(_FLAG, _C) \
372 (VF_ISSET(res, READLINKFAIL) ? unknown : \
373 VF_ISSET(res, _FLAG) ? _C : aok)
374 #define _verifyfile(_FLAG, _C) \
375 (VF_ISSET(res, READFAIL) ? unknown : \
376 VF_ISSET(res, _FLAG) ? _C : aok)
379 const char * size =
_verify(FILESIZE,
"S");
381 const char * mtime =
_verify(MTIME,
"T");
382 const char * rdev =
_verify(RDEV,
"D");
383 const char * user =
_verify(USER,
"U");
384 const char * group =
_verify(GROUP,
"G");
385 const char * mode =
_verify(MODE,
"M");
391 sprintf(te,
"%s%s%s%s%s%s%s%s %c %s",
392 size, mode, digest, rdev, link, user, group, mtime,
430 if (scriptFd != NULL)
445 if (scriptFd != NULL)
483 const char * altNEVR;
484 const char * pkgNEVR = NULL;
497 assert(altNEVR != NULL);
498 if (altNEVR[0] ==
'R' && altNEVR[1] ==
' ')
499 nb +=
sizeof(
"\tRequires: ")-1;
500 if (altNEVR[0] ==
'C' && altNEVR[1] ==
' ')
501 nb +=
sizeof(
"\tConflicts: ")-1;
502 nb += strlen(altNEVR+2) +
sizeof(
"\n") - 1;
507 te = t = (
char *)
alloca(nb);
509 sprintf(te,
_(
"Unsatisfied dependencies for %s:\n"), pkgNEVR);
517 altNEVR =
"? ?altNEVR?";
518 if (altNEVR[0] ==
'R' && altNEVR[1] ==
' ')
519 te =
stpcpy(te,
"\tRequires: ");
520 if (altNEVR[0] ==
'C' && altNEVR[1] ==
' ')
521 te =
stpcpy(te,
"\tConflicts: ");
546 static int scareMem = 0;
560 const char * msg = NULL;
566 (horigin ? horigin :
"verify"), (msg ? msg :
""));
575 #pragma omp parallel for private(i) reduction(+:ec)
577 for (i = 0; i < (int)fc; i++) {
578 int fflags = fi->fflags[i];
665 #if defined(SUPPORT_NOSIGNATURES)
667 VSF_SET(vsflags, NOSHA1HEADER);