+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 (Freadall(fd, &l, sizeof(l)) != sizeof(l)) {
+ if (Ferror(fd)) {
+ rasprintf(&err, _("read failed: %s (%d)\n"), Fstrerror(fd), errno);
+ rc = RPMRC_FAIL;
+ } else {
+ err = xstrdup(_("not an rpm package\n"));
+ rc = RPMRC_NOTFOUND;
+ }
+ } else {
+ l.type = ntohs(l.type);
+ l.archnum = ntohs(l.archnum);
+ l.osnum = ntohs(l.osnum);
+ l.signature_type = ntohs(l.signature_type);
+ rc = rpmLeadCheck(&l, &err);
+ }
+
+ 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;
+}