static int chkinf(FILE * fp, const char *path) { char buf[30]; /* "cksum.2 = 10 6" */ char ext[3]; struct stat sb; const char *dname; off_t len; u_long sum; intmax_t sumlen; uint32_t chk; int rval, error, c, pieces, cnt, fd; char ch; rval = 0; for (cnt = -1; fgets(buf, sizeof(buf), fp); cnt++) { fd = -1; dname = NULL; error = 0; if (cnt == -1) { if ((c = sscanf(buf, "Pieces = %d%c", &pieces, &ch)) != 2 || ch != '\n' || pieces < 1) error = E_BADINF; } else if (((c = sscanf(buf, "cksum.%2s = %lu %jd%c", ext, &sum, &sumlen, &ch)) != 4 && (!feof(fp) || c != 3)) || (c == 4 && ch != '\n') || ext[0] != 'a' + cnt / 26 || ext[1] != 'a' + cnt % 26) error = E_BADINF; else if ((dname = distname(fp == stdin ? NULL : path, NULL, ext)) == NULL) error = E_NAME; else if ((fd = open(dname, O_RDONLY)) == -1) error = E_ERRNO; else if (fstat(fd, &sb)) error = E_ERRNO; else if (sb.st_size != (off_t)sumlen) error = E_LENGTH; else if (!opt_exist) { if (crc(fd, &chk, &len)) error = E_ERRNO; else if (chk != sum) error = E_CHKSUM; } if (fd != -1 && close(fd)) err(2, "%s", dname); if (opt_ignore && error == E_ERRNO && errno == ENOENT) continue; if (error || (opt_all && cnt >= 0)) rval |= report(path, dname, error); if (isfatal(error)) break; } return rval; }
SIG_T NEW(signal)(int signum, SIG_T handler) { SIG_T ret; LOADSYM(signal); if(!_zz_signal) return ORIG(signal)(signum, handler); ret = ORIG(signal)(signum, isfatal(signum) ? SIG_DFL : handler); debug("%s(%i, %p) = %p", __func__, signum, handler, ret); return ret; }
static int chkmd5(FILE * fp, const char *path) { char buf[298]; /* "MD5 (NAMESIZE = MDSUMLEN" */ char name[NAMESIZE + 1]; char sum[MDSUMLEN + 1], chk[MDSUMLEN + 1]; const char *dname; char *s; int rval, error, c, fd; char ch; rval = 0; while (fgets(buf, sizeof(buf), fp)) { dname = NULL; error = 0; if (((c = sscanf(buf, "MD5 (%256s = %32s%c", name, sum, &ch)) != 3 && (!feof(fp) || c != 2)) || (c == 3 && ch != '\n') || (s = strrchr(name, ')')) == NULL || strlen(sum) != MDSUMLEN) error = E_BADMD5; else { *s = 0; if ((dname = distname(path, name, NULL)) == NULL) error = E_NAME; else if (opt_exist) { if ((fd = open(dname, O_RDONLY)) == -1) error = E_ERRNO; else if (close(fd)) err(2, "%s", dname); } else if (!MD5File(dname, chk)) error = E_ERRNO; else if (strcmp(chk, sum)) error = E_CHKSUM; } if (opt_ignore && error == E_ERRNO && errno == ENOENT) continue; if (error || opt_all) rval |= report(path, dname, error); if (isfatal(error)) break; } return rval; }
int NEW(sigaction)(int signum, const struct sigaction *act, struct sigaction *oldact) { int ret; LOADSYM(sigaction); if(!_zz_signal) return ORIG(sigaction)(signum, act, oldact); if(act && isfatal(signum)) { struct sigaction newact; memcpy(&newact, act, sizeof(struct sigaction)); newact.sa_handler = SIG_DFL; ret = ORIG(sigaction)(signum, &newact, oldact); } else ret = ORIG(sigaction)(signum, act, oldact); debug("%s(%i, %p, %p) = %i", __func__, signum, act, oldact, ret); return ret; }