static PyObject * hdrUnload(hdrObject * s, PyObject * args, PyObject *keywords) { char * buf; PyObject * rc; int len, legacy = 0; Header h; static char *kwlist[] = { "legacyHeader", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywords, "|i", kwlist, &legacy)) return NULL; h = headerLink(s->h); /* XXX this legacy switch is a hack, needs to be removed. */ if (legacy) { h = headerCopy(s->h); /* XXX strip region tags, etc */ headerFree(s->h); } len = headerSizeof(h, HEADER_MAGIC_NO); buf = headerUnload(h); h = headerFree(h); if (buf == NULL || len == 0) { PyErr_SetString(pyrpmError, "can't unload bad header\n"); return NULL; } rc = PyBytes_FromStringAndSize(buf, len); buf = _free(buf); return rc; }
static int replaceSignature(Header sigh, sigTarget sigt1, sigTarget sigt2) { /* Grab a copy of the header so we can compare the result */ Header oldsigh = headerCopy(sigh); int rc = -1; /* Nuke all signature tags */ deleteSigs(sigh); /* * rpmGenSignature() internals parse the actual signing result and * adds appropriate tags for DSA/RSA. */ if (rpmGenSignature(sigh, sigt1, sigt2) == 0) { /* Lets see what we got and whether its the same signature as before */ rpmTagVal sigtag = headerIsEntry(sigh, RPMSIGTAG_DSA) ? RPMSIGTAG_DSA : RPMSIGTAG_RSA; rc = sameSignature(sigtag, sigh, oldsigh); } headerFree(oldsigh); return rc; }
static Header do_loadrpmhdr(const char *path, int vfmode, const char *pdir_name) { struct vfile *vf = NULL; tn_buf *nbuf; tn_buf buf[4096]; int n; Header h, ch = NULL; if ((vf = vfile_open_ul(path, VFT_GZIO, vfmode, pdir_name)) == NULL) return NULL; nbuf = n_buf_new(1024 * 64); while ((n = gzread(vf->vf_gzstream, buf, sizeof(buf))) > 0) n_buf_write(nbuf, buf, n); vfile_close(vf); h = headerLoad(n_buf_ptr(nbuf)); /* rpm's memleak */ if (h == NULL) { logn(LOGERR, "%s: load header failed", n_basenam(path)); } else if (headerIsEntry(h, RPMTAG_SOURCEPACKAGE)) { /* omit src.rpms */ h = NULL; } if (h) ch = headerCopy(h); n_buf_free(nbuf); return ch; }
static void unloadImmutableRegion(Header *hdrp, rpmTagVal tag) { struct rpmtd_s td; rpmtd utd = &td; Header nh; Header oh; if (headerGet(*hdrp, tag, utd, HEADERGET_DEFAULT)) { oh = headerCopyLoad(utd->data); nh = headerCopy(oh); headerFree(oh); rpmtdFreeData(utd); headerFree(*hdrp); *hdrp = headerLink(nh); headerFree(nh); } }
static rpmRC writeHdr(FD_t fd, Header pkgh) { /* Reallocate the header into one contiguous region for writing. */ Header h = headerReload(headerCopy(pkgh), RPMTAG_HEADERIMMUTABLE); rpmRC rc = RPMRC_FAIL; if (h == NULL) { rpmlog(RPMLOG_ERR,_("Unable to create immutable header region\n")); goto exit; } if (headerWrite(fd, h, HEADER_MAGIC_YES)) { rpmlog(RPMLOG_ERR, _("Unable to write header to %s: %s\n"), Fdescr(fd), Fstrerror(fd)); goto exit; } (void) Fflush(fd); rc = RPMRC_OK; exit: headerFree(h); return rc; }
static PyObject * hdrAsBytes(hdrObject * s, int legacy) { PyObject *res = NULL; char *buf = NULL; unsigned int len; Header h = headerLink(s->h); /* XXX this legacy switch is a hack, needs to be removed. */ if (legacy) { h = headerCopy(s->h); /* XXX strip region tags, etc */ headerFree(s->h); } buf = headerExport(h, &len); h = headerFree(h); if (buf == NULL || len == 0) { PyErr_SetString(pyrpmError, "can't unload bad header\n"); } else { res = PyBytes_FromStringAndSize(buf, len); } free(buf); return res; }
/* TODO: permit keyring check + retrofits on copy/load */ static PyObject *hdr_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds) { PyObject *obj = NULL; rpmfdObject *fdo = NULL; Header h = NULL; char *kwlist[] = { "obj", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, &obj)) { return NULL; } if (obj == NULL) { h = headerNew(); } else if (CAPSULE_CHECK(obj)) { h = CAPSULE_EXTRACT(obj, "rpm._C_Header"); headerLink(h); } else if (hdrObject_Check(obj)) { h = headerCopy(((hdrObject*) obj)->h); } else if (PyBytes_Check(obj)) { h = headerCopyLoad(PyBytes_AsString(obj)); } else if (rpmfdFromPyObject(obj, &fdo)) { Py_BEGIN_ALLOW_THREADS; h = headerRead(rpmfdGetFd(fdo), HEADER_MAGIC_YES); Py_END_ALLOW_THREADS; Py_XDECREF(fdo); } else { PyErr_SetString(PyExc_TypeError, "header, blob or file expected"); return NULL; } if (h == NULL) { PyErr_SetString(pyrpmError, "bad header"); return NULL; } return hdr_Wrap(subtype, h); }