pgpDig dig = NULL;
char buf[8*BUFSIZ];
ssize_t count;
- rpmlead l = NULL;
Header sigh = NULL;
rpmTagVal sigtag;
struct rpmtd_s sigtd;
Header h = NULL;
- char * msg;
+ char * msg = NULL;
rpmRC rc = RPMRC_FAIL; /* assume failure */
int leadtype = -1;
headerGetFlags hgeflags = HEADERGET_DEFAULT;
rpmtdReset(&sigtd);
- if ((rc = rpmLeadRead(fd, &l)) == RPMRC_OK) {
- const char * err = NULL;
- if ((rc = rpmLeadCheck(l, &err)) == RPMRC_FAIL) {
- rpmlog(RPMLOG_ERR, "%s: %s\n", fn, err);
- }
- leadtype = rpmLeadType(l);
- l = rpmLeadFree(l);
- }
-
- if (rc != RPMRC_OK)
+ if ((rc = rpmLeadRead(fd, NULL, &leadtype, &msg)) != RPMRC_OK) {
+ /* Avoid message spew on manifests */
+ if (rc != RPMRC_NOTFOUND)
+ rpmlog(RPMLOG_ERR, "%s: %s\n", fn, msg);
+ free(msg);
goto exit;
+ }
/* Read the signature header. */
- msg = NULL;
rc = rpmReadSignature(fd, &sigh, RPMSIGTYPE_HEADERSIG, &msg);
switch (rc) {
default:
pgpDigParams sigp;
Header sigh = NULL;
HeaderIterator hi = NULL;
- rpmlead lead = NULL;
char * msg = NULL;
int res = 1; /* assume failure */
rpmRC rc;
rpmDigestBundle plbundle = rpmDigestBundleNew();
rpmDigestBundle hdrbundle = rpmDigestBundleNew();
- if ((rc = rpmLeadRead(fd, &lead)) == RPMRC_OK) {
- const char *lmsg = NULL;
- rc = rpmLeadCheck(lead, &lmsg);
- if (rc != RPMRC_OK)
- rpmlog(RPMLOG_ERR, "%s: %s\n", fn, lmsg);
- lead = rpmLeadFree(lead);
- }
-
- if (rc != RPMRC_OK) {
+ if ((rc = rpmLeadRead(fd, NULL, NULL, &msg)) != RPMRC_OK) {
+ rpmlog(RPMLOG_ERR, "%s: %s\n", fn, msg);
+ free(msg);
goto exit;
}
return rc;
}
-rpmRC rpmLeadCheck(rpmlead lead, const char **msg)
+static rpmRC rpmLeadCheck(rpmlead lead, char **msg)
{
if (memcmp(lead->magic, lead_magic, sizeof(lead_magic))) {
- if (msg) *msg = _("not an rpm package");
+ *msg = xstrdup(_("not an rpm package"));
return RPMRC_NOTFOUND;
}
if (lead->signature_type != RPMSIGTYPE_HEADERSIG) {
- if (msg) *msg = _("illegal signature type");
+ *msg = xstrdup(_("illegal signature type"));
return RPMRC_FAIL;
}
if (lead->major < 3 || lead->major > 4) {
- if (msg) *msg = _("unsupported RPM package version");
+ *msg = xstrdup(_("unsupported RPM package version"));
return RPMRC_FAIL;
}
return RPMRC_OK;
}
-rpmRC rpmLeadRead(FD_t fd, rpmlead *lead)
+rpmRC rpmLeadRead(FD_t fd, rpmlead *lead, int *type, char **emsg)
{
rpmRC rc = RPMRC_OK;
struct rpmlead_s l;
+ char *err = NULL;
memset(&l, 0, sizeof(l));
if (Fread(&l, 1, sizeof(l), fd) != sizeof(l)) {
if (Ferror(fd)) {
- rpmlog(RPMLOG_ERR, _("read failed: %s (%d)\n"),
- Fstrerror(fd), errno);
+ rasprintf(&err, _("read failed: %s (%d)\n"), Fstrerror(fd), errno);
rc = RPMRC_FAIL;
} else {
- rpmlog(RPMLOG_ERR, _("not an rpm package\n"));
+ err = xstrdup(_("not an rpm package\n"));
rc = RPMRC_NOTFOUND;
}
} else {
l.archnum = ntohs(l.archnum);
l.osnum = ntohs(l.osnum);
l.signature_type = ntohs(l.signature_type);
+ rc = rpmLeadCheck(&l, &err);
}
- if (lead != NULL && rc == RPMRC_OK) {
- *lead = xmalloc(sizeof(l));
- memcpy(*lead, &l, sizeof(l));
+ if (rc == RPMRC_OK) {
+ if (lead != NULL) {
+ *lead = xmalloc(sizeof(l));
+ memcpy(*lead, &l, sizeof(l));
+ }
+ if (type != NULL)
+ *type = l.type;
+ } else {
+ if (emsg != NULL)
+ *emsg = err;
+ else
+ free(err);
}
return rc;
}
-
-int rpmLeadType(rpmlead lead)
-{
- return lead ? lead->type : -1;
-}
* Read lead from file handle.
* @param fd file handle
* @retval lead pointer to package lead (malloced)
+ * @retval type RPMLEAD_BINARY or RPMLEAD_SOURCE on success
+ * @retval emsg failure message on error (malloced)
* @return RPMRC_OK on success, RPMRC_FAIL/RPMRC_NOTFOUND on error
*/
-rpmRC rpmLeadRead(FD_t fd, rpmlead *lead);
-
-/** \ingroup lead
- * Check lead for compatibility.
- * @param lead Pointer to lead handle
- * @retval fn Pointer to error message, NULL on success
- * @return RPMRC_OK on success,
- * RPMRC_NOTFOUND if not an rpm,
- * RPMRC_FAIL on invalid/incompatible rpm
- */
-rpmRC rpmLeadCheck(rpmlead lead, const char **msg);
-
-/** \ingroup lead
- * Returen type (source vs binary) of lead
- * @param lead Pointer to lead handle
- * @return RPMLEAD_BINARY or RPMLEAD_SOURCE, -1 on invalid
- */
-int rpmLeadType(rpmlead lead);
+rpmRC rpmLeadRead(FD_t fd, rpmlead *lead, int *type, char **emsg);
#ifdef __cplusplus
}
rpmlead lead = NULL;
char *sigtarget = NULL, *trpm = NULL;
Header sigh = NULL;
- char * msg;
+ char * msg = NULL;
int res = -1; /* assume failure */
rpmRC rc;
struct rpmtd_s utd;
if (manageFile(&fd, rpm, O_RDONLY))
goto exit;
- if ((rc = rpmLeadRead(fd, &lead)) == RPMRC_OK) {
- const char *lmsg = NULL;
- rc = rpmLeadCheck(lead, &lmsg);
- if (rc != RPMRC_OK)
- rpmlog(RPMLOG_ERR, "%s: %s\n", rpm, lmsg);
- }
-
- if (rc != RPMRC_OK) {
+ if ((rc = rpmLeadRead(fd, &lead, NULL, &msg)) != RPMRC_OK) {
+ rpmlog(RPMLOG_ERR, "%s: %s\n", rpm, msg);
+ free(msg);
goto exit;
}
- msg = NULL;
rc = rpmReadSignature(fd, &sigh, RPMSIGTYPE_HEADERSIG, &msg);
switch (rc) {
default: