diff options
author | xuhy <huayong.xu@samsung.com> | 2023-11-16 17:39:20 +0800 |
---|---|---|
committer | xuhy <huayong.xu@samsung.com> | 2023-11-16 17:39:20 +0800 |
commit | 76ea0b5d4a1b8180f2552c2729d84388a77beecb (patch) | |
tree | 9a2b028c24c205b075d9386acd7a62a2eb2271a7 /python | |
parent | c30d127e8780dc678168ee121b9f2eeb1a8aaafa (diff) | |
download | librpm-tizen-76ea0b5d4a1b8180f2552c2729d84388a77beecb.tar.gz librpm-tizen-76ea0b5d4a1b8180f2552c2729d84388a77beecb.tar.bz2 librpm-tizen-76ea0b5d4a1b8180f2552c2729d84388a77beecb.zip |
The following issues are fixed:
1. Prevent execution of arbitrary scripts
2. Enable dash(-) in spec file.
3. Ignore bad expressions in %if conditionals.
4. Ignore unknown tags.
5. Ignore error macro.
Change-Id: Id5b7b47c1a78de364ef0d513023fbe9ccc773a87
Signed-off-by: xuhy <huayong.xu@samsung.com>
Diffstat (limited to 'python')
-rw-r--r-- | python/Makefile.am | 34 | ||||
-rw-r--r-- | python/header-py.c | 26 | ||||
-rw-r--r-- | python/rpm/__init__.py.in (renamed from python/rpm/__init__.py) | 18 | ||||
-rw-r--r-- | python/rpm/transaction.py.in (renamed from python/rpm/transaction.py) | 7 | ||||
-rw-r--r-- | python/rpmbmodule.c | 95 | ||||
-rw-r--r-- | python/rpmds-py.c | 18 | ||||
-rw-r--r-- | python/rpmfd-py.c | 8 | ||||
-rw-r--r-- | python/rpmfi-py.c | 48 | ||||
-rw-r--r-- | python/rpmfiles-py.c | 32 | ||||
-rw-r--r-- | python/rpmii-py.c | 6 | ||||
-rw-r--r-- | python/rpmkeyring-py.c | 6 | ||||
-rw-r--r-- | python/rpmmacro-py.c | 2 | ||||
-rw-r--r-- | python/rpmmi-py.c | 2 | ||||
-rw-r--r-- | python/rpmmodule.c | 74 | ||||
-rw-r--r-- | python/rpmps-py.c | 12 | ||||
-rw-r--r-- | python/rpmsmodule.c | 98 | ||||
-rw-r--r-- | python/rpmstrpool-py.c | 4 | ||||
-rw-r--r-- | python/rpmsystem-py.h | 11 | ||||
-rw-r--r-- | python/rpmtd-py.c | 2 | ||||
-rw-r--r-- | python/rpmte-py.c | 20 | ||||
-rw-r--r-- | python/rpmts-py.c | 27 | ||||
-rw-r--r-- | python/setup.py.in | 41 | ||||
-rw-r--r-- | python/spec-py.c | 16 |
23 files changed, 218 insertions, 389 deletions
diff --git a/python/Makefile.am b/python/Makefile.am index a9bd34729..bf9abd2d3 100644 --- a/python/Makefile.am +++ b/python/Makefile.am @@ -7,18 +7,21 @@ EXTRA_DIST = rpm/__init__.py rpm/transaction.py AM_CPPFLAGS = -I$(top_builddir)/include/ AM_CPPFLAGS += -I$(top_srcdir)/python -AM_CPPFLAGS += @PYTHON_CFLAGS@ +AM_CPPFLAGS += @PYTHON_CFLAGS@ -DPYTHON_MODULENAME=\"@PYTHON_MODULENAME@\" -pkgpyexec_LTLIBRARIES = _rpmmodule.la _rpmbmodule.la _rpmsmodule.la +pkgpyexec_LTLIBRARIES = _rpm.la pkgpyexec_DATA = rpm/__init__.py rpm/transaction.py +pkgpyexecdir = @pyexecdir@/@PYTHON_MODULENAME@ -_rpmmodule_la_LDFLAGS = -module -avoid-version -shared -_rpmmodule_la_LIBADD = \ +_rpm_la_LDFLAGS = -module -avoid-version -shared +_rpm_la_LIBADD = \ $(top_builddir)/lib/librpm.la \ $(top_builddir)/rpmio/librpmio.la \ + $(top_builddir)/build/librpmbuild.la \ + $(top_builddir)/sign/librpmsign.la \ @PYTHON_LIBS@ -_rpmmodule_la_SOURCES = rpmmodule.c rpmsystem-py.h \ +_rpm_la_SOURCES = rpmmodule.c rpmsystem-py.h \ header-py.c header-py.h \ rpmarchive-py.c rpmarchive-py.h \ rpmds-py.c rpmds-py.h \ @@ -33,24 +36,5 @@ _rpmmodule_la_SOURCES = rpmmodule.c rpmsystem-py.h \ rpmstrpool-py.c rpmstrpool-py.h \ rpmtd-py.c rpmtd-py.h \ rpmte-py.c rpmte-py.h \ - rpmts-py.c rpmts-py.h - -_rpmbmodule_la_LDFLAGS = -module -avoid-version -shared -_rpmbmodule_la_LIBADD = \ - $(top_builddir)/build/librpmbuild.la \ - $(top_builddir)/lib/librpm.la \ - $(top_builddir)/rpmio/librpmio.la \ - @PYTHON_LIBS@ - -_rpmbmodule_la_SOURCES = rpmbmodule.c rpmsystem-py.h \ + rpmts-py.c rpmts-py.h \ spec-py.c spec-py.h - -_rpmsmodule_la_LDFLAGS = -module -avoid-version -shared -_rpmsmodule_la_LIBADD = \ - $(top_builddir)/sign/librpmsign.la \ - $(top_builddir)/lib/librpm.la \ - $(top_builddir)/rpmio/librpmio.la \ - @PYTHON_LIBS@ - -_rpmsmodule_la_SOURCES = rpmsmodule.c rpmsystem-py.h - diff --git a/python/header-py.c b/python/header-py.c index 45af51637..04aa96931 100644 --- a/python/header-py.c +++ b/python/header-py.c @@ -143,7 +143,7 @@ static PyObject * hdrKeyList(hdrObject * s) hi = headerInitIterator(s->h); while ((tag = headerNextTag(hi)) != RPMTAG_NOT_FOUND) { - PyObject *to = PyInt_FromLong(tag); + PyObject *to = PyLong_FromLong(tag); if (!to) { headerFreeIterator(hi); Py_DECREF(keys); @@ -231,7 +231,7 @@ static PyObject * hdrFormat(hdrObject * s, PyObject * args, PyObject * kwds) return NULL; } - result = Py_BuildValue("s", r); + result = utf8FromString(r); free(r); return result; @@ -377,7 +377,7 @@ static PyObject *hdr_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds) if (obj == NULL) { h = headerNew(); } else if (CAPSULE_CHECK(obj)) { - h = CAPSULE_EXTRACT(obj, "rpm._C_Header"); + h = CAPSULE_EXTRACT(obj, PYTHON_MODULENAME"._C_Header"); headerLink(h); } else if (hdrObject_Check(obj)) { h = headerCopy(((hdrObject*) obj)->h); @@ -415,7 +415,7 @@ static PyObject * hdr_iternext(hdrObject *s) if (s->hi == NULL) s->hi = headerInitIterator(s->h); if ((tag = headerNextTag(s->hi)) != RPMTAG_NOT_FOUND) { - res = PyInt_FromLong(tag); + res = PyLong_FromLong(tag); } else { s->hi = headerFreeIterator(s->hi); } @@ -442,9 +442,9 @@ int tagNumFromPyObject (PyObject *item, rpmTagVal *tagp) rpmTagVal tag = RPMTAG_NOT_FOUND; PyObject *str = NULL; - if (PyInt_Check(item)) { + if (PyLong_Check(item)) { /* XXX we should probably validate tag numbers too */ - tag = PyInt_AsLong(item); + tag = PyLong_AsLong(item); } else if (utf8FromPyObject(item, &str)) { tag = rpmTagGetValue(PyBytes_AsString(str)); Py_DECREF(str); @@ -483,7 +483,7 @@ static int validItem(rpmTagClass tclass, PyObject *item) switch (tclass) { case RPM_NUMERIC_CLASS: - rc = (PyLong_Check(item) || PyInt_Check(item)); + rc = (PyLong_Check(item) || PyLong_Check(item)); break; case RPM_STRING_CLASS: rc = (PyBytes_Check(item) || PyUnicode_Check(item)); @@ -532,7 +532,7 @@ static int hdrAppendItem(Header h, rpmTagVal tag, rpmTagType type, PyObject *ite case RPM_STRING_TYPE: case RPM_STRING_ARRAY_TYPE: { PyObject *str = NULL; - if (utf8FromPyObject(item, &str)) + if (utf8FromPyObject(item, &str)) rc = headerPutString(h, tag, PyBytes_AsString(str)); Py_XDECREF(str); } break; @@ -542,20 +542,20 @@ static int hdrAppendItem(Header h, rpmTagVal tag, rpmTagType type, PyObject *ite rc = headerPutBin(h, tag, val, len); } break; case RPM_INT64_TYPE: { - uint64_t val = PyInt_AsUnsignedLongLongMask(item); + uint64_t val = PyLong_AsUnsignedLongLongMask(item); rc = headerPutUint64(h, tag, &val, 1); } break; case RPM_INT32_TYPE: { - uint32_t val = PyInt_AsUnsignedLongMask(item); + uint32_t val = PyLong_AsUnsignedLongMask(item); rc = headerPutUint32(h, tag, &val, 1); } break; case RPM_INT16_TYPE: { - uint16_t val = PyInt_AsUnsignedLongMask(item); + uint16_t val = PyLong_AsUnsignedLongMask(item); rc = headerPutUint16(h, tag, &val, 1); } break; case RPM_INT8_TYPE: case RPM_CHAR_TYPE: { - uint8_t val = PyInt_AsUnsignedLongMask(item); + uint8_t val = PyLong_AsUnsignedLongMask(item); rc = headerPutUint8(h, tag, &val, 1); } break; default: @@ -718,7 +718,7 @@ static char hdr_doc[] = PyTypeObject hdr_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.hdr", /* tp_name */ + PYTHON_MODULENAME".hdr", /* tp_name */ sizeof(hdrObject), /* tp_size */ 0, /* tp_itemsize */ (destructor) hdr_dealloc, /* tp_dealloc */ diff --git a/python/rpm/__init__.py b/python/rpm/__init__.py.in index 54728bbd4..4d02d2d02 100644 --- a/python/rpm/__init__.py +++ b/python/rpm/__init__.py.in @@ -35,9 +35,9 @@ is very useful for resolving dependencies. """ import warnings -from rpm._rpm import * -from rpm.transaction import * -import rpm._rpm as _rpm +from @PYTHON_MODULENAME@._rpm import * +from @PYTHON_MODULENAME@.transaction import * +import @PYTHON_MODULENAME@._rpm as _rpm _RPMVSF_NODIGESTS = _rpm._RPMVSF_NODIGESTS _RPMVSF_NOHEADER = _rpm._RPMVSF_NOHEADER _RPMVSF_NOPAYLOAD = _rpm._RPMVSF_NOPAYLOAD @@ -46,18 +46,6 @@ _RPMVSF_NOSIGNATURES = _rpm._RPMVSF_NOSIGNATURES __version__ = _rpm.__version__ __version_info__ = tuple(__version__.split('.')) -# try to import build bits but dont require it -try: - from rpm._rpmb import * -except ImportError: - pass - -# try to import signing bits but dont require it -try: - from rpm._rpms import * -except ImportError: - pass - # backwards compatibility + give the same class both ways ts = TransactionSet diff --git a/python/rpm/transaction.py b/python/rpm/transaction.py.in index 675ecaf8e..764a5cb68 100644 --- a/python/rpm/transaction.py +++ b/python/rpm/transaction.py.in @@ -1,8 +1,8 @@ from __future__ import with_statement import sys -import rpm -from rpm._rpm import ts as TransactionSetCore +import @PYTHON_MODULENAME@ as rpm +from @PYTHON_MODULENAME@._rpm import ts as TransactionSetCore if sys.version_info[0] == 3: _string_types = str, @@ -38,8 +38,7 @@ class TransactionSet(TransactionSetCore): return self._wrapSetGet('_probFilter', ignoreSet) def parseSpec(self, specfile): - import rpm._rpmb - return rpm._rpmb.spec(specfile) + return rpm.spec(specfile) def getKeys(self): keys = [] diff --git a/python/rpmbmodule.c b/python/rpmbmodule.c deleted file mode 100644 index ad30570e4..000000000 --- a/python/rpmbmodule.c +++ /dev/null @@ -1,95 +0,0 @@ -#include "rpmsystem-py.h" - -#include "spec-py.h" - -static char rpmb__doc__[] = -""; - -/* - Do any common preliminary work before python 2 vs python 3 module creation: -*/ -static int prepareInitModule(void) -{ - if (PyType_Ready(&spec_Type) < 0) return 0; - if (PyType_Ready(&specPkg_Type) < 0) return 0; - - return 1; -} - -static int initModule(PyObject *m) -{ - Py_INCREF(&spec_Type); - PyModule_AddObject(m, "spec", (PyObject *) &spec_Type); - Py_INCREF(&specPkg_Type); - PyModule_AddObject(m, "specPkg", (PyObject *) &specPkg_Type); - -#define REGISTER_ENUM(val) PyModule_AddIntConstant(m, #val, val) - REGISTER_ENUM(RPMBUILD_ISSOURCE); - REGISTER_ENUM(RPMBUILD_ISPATCH); - REGISTER_ENUM(RPMBUILD_ISICON); - REGISTER_ENUM(RPMBUILD_ISNO); - - REGISTER_ENUM(RPMBUILD_NONE); - REGISTER_ENUM(RPMBUILD_PREP); - REGISTER_ENUM(RPMBUILD_BUILD); - REGISTER_ENUM(RPMBUILD_INSTALL); - REGISTER_ENUM(RPMBUILD_CHECK); - REGISTER_ENUM(RPMBUILD_CLEAN); - REGISTER_ENUM(RPMBUILD_FILECHECK); - REGISTER_ENUM(RPMBUILD_PACKAGESOURCE); - REGISTER_ENUM(RPMBUILD_PACKAGEBINARY); - REGISTER_ENUM(RPMBUILD_RMSOURCE); - REGISTER_ENUM(RPMBUILD_RMBUILD); - REGISTER_ENUM(RPMBUILD_RMSPEC); - - REGISTER_ENUM(RPMBUILD_PKG_NONE); - REGISTER_ENUM(RPMBUILD_PKG_NODIRTOKENS); - - REGISTER_ENUM(RPMSPEC_NONE); - REGISTER_ENUM(RPMSPEC_ANYARCH); - REGISTER_ENUM(RPMSPEC_FORCE); - REGISTER_ENUM(RPMSPEC_NOLANG); - - return 1; -} - -#if PY_MAJOR_VERSION >= 3 -static struct PyModuleDef moduledef = { - PyModuleDef_HEAD_INIT, - "_rpmb", /* m_name */ - rpmb__doc__, /* m_doc */ - 0, /* m_size */ - NULL, /* m_methods */ - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; - -PyObject * PyInit__rpmb(void); /* XXX eliminate gcc warning */ -PyObject * PyInit__rpmb(void) -{ - PyObject *m; - - if (!prepareInitModule()) - return NULL; - m = PyModule_Create(&moduledef); - if (m == NULL || !initModule(m)) { - Py_XDECREF(m); - m = NULL; - } - return m; -} -#else -void init_rpmb(void); /* XXX eliminate gcc warning */ -void init_rpmb(void) -{ - PyObject *m; - - if (!prepareInitModule()) - return; - - m = Py_InitModule3("_rpmb", NULL, rpmb__doc__); - if (m) initModule(m); -} -#endif diff --git a/python/rpmds-py.c b/python/rpmds-py.c index 9eae9a228..86d993f5b 100644 --- a/python/rpmds-py.c +++ b/python/rpmds-py.c @@ -31,19 +31,19 @@ rpmds_Ix(rpmdsObject * s) static PyObject * rpmds_DNEVR(rpmdsObject * s) { - return Py_BuildValue("s", rpmdsDNEVR(s->ds)); + return utf8FromString(rpmdsDNEVR(s->ds)); } static PyObject * rpmds_N(rpmdsObject * s) { - return Py_BuildValue("s", rpmdsN(s->ds)); + return utf8FromString(rpmdsN(s->ds)); } static PyObject * rpmds_EVR(rpmdsObject * s) { - return Py_BuildValue("s", rpmdsEVR(s->ds)); + return utf8FromString(rpmdsEVR(s->ds)); } static PyObject * @@ -230,14 +230,14 @@ rpmds_subscript(rpmdsObject * s, PyObject * key) { int ix; - if (!PyInt_Check(key)) { + if (!PyLong_Check(key)) { PyErr_SetString(PyExc_TypeError, "integer expected"); return NULL; } - ix = (int) PyInt_AsLong(key); + ix = (int) PyLong_AsLong(key); rpmdsSetIx(s->ds, ix); - return Py_BuildValue("s", rpmdsDNEVR(s->ds)); + return utf8FromString(rpmdsDNEVR(s->ds)); } static PyMappingMethods rpmds_as_mapping = { @@ -258,9 +258,9 @@ static int depflags(PyObject *o, rpmsenseFlags *senseFlags) PyObject *str = NULL; rpmsenseFlags flags = RPMSENSE_ANY; - if (PyInt_Check(o)) { + if (PyLong_Check(o)) { ok = 1; - flags = PyInt_AsLong(o); + flags = PyLong_AsLong(o); } else if (utf8FromPyObject(o, &str)) { ok = 1; for (const char *s = PyBytes_AsString(str); *s; s++) { @@ -339,7 +339,7 @@ static char rpmds_doc[] = PyTypeObject rpmds_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.ds", /* tp_name */ + PYTHON_MODULENAME".ds", /* tp_name */ sizeof(rpmdsObject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ diff --git a/python/rpmfd-py.c b/python/rpmfd-py.c index 85fb0cd24..4f9ef92ab 100644 --- a/python/rpmfd-py.c +++ b/python/rpmfd-py.c @@ -327,17 +327,17 @@ static PyObject *rpmfd_get_closed(rpmfdObject *s) static PyObject *rpmfd_get_name(rpmfdObject *s) { /* XXX: rpm returns non-paths with [mumble], python files use <mumble> */ - return Py_BuildValue("s", Fdescr(s->fd)); + return utf8FromString(Fdescr(s->fd)); } static PyObject *rpmfd_get_mode(rpmfdObject *s) { - return Py_BuildValue("s", s->mode); + return utf8FromString(s->mode); } static PyObject *rpmfd_get_flags(rpmfdObject *s) { - return Py_BuildValue("s", s->flags); + return utf8FromString(s->flags); } static PyGetSetDef rpmfd_getseters[] = { @@ -350,7 +350,7 @@ static PyGetSetDef rpmfd_getseters[] = { PyTypeObject rpmfd_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.fd", /* tp_name */ + PYTHON_MODULENAME".fd", /* tp_name */ sizeof(rpmfdObject), /* tp_size */ 0, /* tp_itemsize */ /* methods */ diff --git a/python/rpmfi-py.c b/python/rpmfi-py.c index a1a743a1d..61417c5f5 100644 --- a/python/rpmfi-py.c +++ b/python/rpmfi-py.c @@ -41,19 +41,19 @@ rpmfi_DX(rpmfiObject * s, PyObject * unused) static PyObject * rpmfi_BN(rpmfiObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmfiBN(s->fi)); + return utf8FromString(rpmfiBN(s->fi)); } static PyObject * rpmfi_DN(rpmfiObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmfiDN(s->fi)); + return utf8FromString(rpmfiDN(s->fi)); } static PyObject * rpmfi_FN(rpmfiObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmfiFN(s->fi)); + return utf8FromString(rpmfiFN(s->fi)); } static PyObject * @@ -98,7 +98,7 @@ rpmfi_Digest(rpmfiObject * s, PyObject * unused) { char *digest = rpmfiFDigestHex(s->fi, NULL); if (digest) { - PyObject *dig = Py_BuildValue("s", digest); + PyObject *dig = utf8FromString(digest); free(digest); return dig; } else { @@ -109,7 +109,7 @@ rpmfi_Digest(rpmfiObject * s, PyObject * unused) static PyObject * rpmfi_FLink(rpmfiObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmfiFLink(s->fi)); + return utf8FromString(rpmfiFLink(s->fi)); } static PyObject * @@ -133,13 +133,13 @@ rpmfi_FMtime(rpmfiObject * s, PyObject * unused) static PyObject * rpmfi_FUser(rpmfiObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmfiFUser(s->fi)); + return utf8FromString(rpmfiFUser(s->fi)); } static PyObject * rpmfi_FGroup(rpmfiObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmfiFGroup(s->fi)); + return utf8FromString(rpmfiFGroup(s->fi)); } static PyObject * @@ -155,7 +155,7 @@ rpmfi_FClass(rpmfiObject * s, PyObject * unused) if ((FClass = rpmfiFClass(s->fi)) == NULL) FClass = ""; - return Py_BuildValue("s", FClass); + return utf8FromString(FClass); } static PyObject * @@ -172,7 +172,7 @@ rpmfi_FLinks(rpmfiObject * s, PyObject * unused) result = PyTuple_New(nlinks); for (uint32_t i=0; i<nlinks; i++) { - PyTuple_SET_ITEM(result, i, PyInt_FromLong(files[i])); + PyTuple_SET_ITEM(result, i, PyLong_FromLong(files[i])); } return result; } @@ -208,26 +208,26 @@ rpmfi_iternext(rpmfiObject * s) Py_INCREF(Py_None); PyTuple_SET_ITEM(result, 0, Py_None); } else - PyTuple_SET_ITEM(result, 0, Py_BuildValue("s", FN)); + PyTuple_SET_ITEM(result, 0, utf8FromString(FN)); PyTuple_SET_ITEM(result, 1, PyLong_FromLongLong(FSize)); - PyTuple_SET_ITEM(result, 2, PyInt_FromLong(FMode)); - PyTuple_SET_ITEM(result, 3, PyInt_FromLong(FMtime)); - PyTuple_SET_ITEM(result, 4, PyInt_FromLong(FFlags)); - PyTuple_SET_ITEM(result, 5, PyInt_FromLong(FRdev)); - PyTuple_SET_ITEM(result, 6, PyInt_FromLong(FInode)); - PyTuple_SET_ITEM(result, 7, PyInt_FromLong(FNlink)); - PyTuple_SET_ITEM(result, 8, PyInt_FromLong(FState)); - PyTuple_SET_ITEM(result, 9, PyInt_FromLong(VFlags)); + PyTuple_SET_ITEM(result, 2, PyLong_FromLong(FMode)); + PyTuple_SET_ITEM(result, 3, PyLong_FromLong(FMtime)); + PyTuple_SET_ITEM(result, 4, PyLong_FromLong(FFlags)); + PyTuple_SET_ITEM(result, 5, PyLong_FromLong(FRdev)); + PyTuple_SET_ITEM(result, 6, PyLong_FromLong(FInode)); + PyTuple_SET_ITEM(result, 7, PyLong_FromLong(FNlink)); + PyTuple_SET_ITEM(result, 8, PyLong_FromLong(FState)); + PyTuple_SET_ITEM(result, 9, PyLong_FromLong(VFlags)); if (FUser == NULL) { Py_INCREF(Py_None); PyTuple_SET_ITEM(result, 10, Py_None); } else - PyTuple_SET_ITEM(result, 10, Py_BuildValue("s", FUser)); + PyTuple_SET_ITEM(result, 10, utf8FromString(FUser)); if (FGroup == NULL) { Py_INCREF(Py_None); PyTuple_SET_ITEM(result, 11, Py_None); } else - PyTuple_SET_ITEM(result, 11, Py_BuildValue("s", FGroup)); + PyTuple_SET_ITEM(result, 11, utf8FromString(FGroup)); PyTuple_SET_ITEM(result, 12, rpmfi_Digest(s, NULL)); } else @@ -306,14 +306,14 @@ rpmfi_subscript(rpmfiObject * s, PyObject * key) { int ix; - if (!PyInt_Check(key)) { + if (!PyLong_Check(key)) { PyErr_SetString(PyExc_TypeError, "integer expected"); return NULL; } - ix = (int) PyInt_AsLong(key); + ix = (int) PyLong_AsLong(key); rpmfiSetFX(s->fi, ix); - return Py_BuildValue("s", rpmfiFN(s->fi)); + return utf8FromString(rpmfiFN(s->fi)); } static PyMappingMethods rpmfi_as_mapping = { @@ -362,7 +362,7 @@ static char rpmfi_doc[] = PyTypeObject rpmfi_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.fi", /* tp_name */ + PYTHON_MODULENAME".fi", /* tp_name */ sizeof(rpmfiObject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ diff --git a/python/rpmfiles-py.c b/python/rpmfiles-py.c index d69d1f2ee..5ca3421c4 100644 --- a/python/rpmfiles-py.c +++ b/python/rpmfiles-py.c @@ -41,37 +41,37 @@ static PyObject *rpmfile_dx(rpmfileObject *s) static PyObject *rpmfile_name(rpmfileObject *s) { char * fn = rpmfilesFN(s->files, s->ix); - PyObject *o = Py_BuildValue("s", fn); + PyObject *o = utf8FromString(fn); free(fn); return o; } static PyObject *rpmfile_basename(rpmfileObject *s) { - return Py_BuildValue("s", rpmfilesBN(s->files, s->ix)); + return utf8FromString(rpmfilesBN(s->files, s->ix)); } static PyObject *rpmfile_dirname(rpmfileObject *s) { - return Py_BuildValue("s", rpmfilesDN(s->files, rpmfilesDI(s->files, s->ix))); + return utf8FromString(rpmfilesDN(s->files, rpmfilesDI(s->files, s->ix))); } static PyObject *rpmfile_orig_name(rpmfileObject *s) { char * fn = rpmfilesOFN(s->files, s->ix); - PyObject *o = Py_BuildValue("s", fn); + PyObject *o = utf8FromString(fn); free(fn); return o; } static PyObject *rpmfile_orig_basename(rpmfileObject *s) { - return Py_BuildValue("s", rpmfilesOBN(s->files, s->ix)); + return utf8FromString(rpmfilesOBN(s->files, s->ix)); } static PyObject *rpmfile_orig_dirname(rpmfileObject *s) { - return Py_BuildValue("s", rpmfilesODN(s->files, rpmfilesODI(s->files, s->ix))); + return utf8FromString(rpmfilesODN(s->files, rpmfilesODI(s->files, s->ix))); } static PyObject *rpmfile_mode(rpmfileObject *s) { @@ -105,17 +105,17 @@ static PyObject *rpmfile_nlink(rpmfileObject *s) static PyObject *rpmfile_linkto(rpmfileObject *s) { - return Py_BuildValue("s", rpmfilesFLink(s->files, s->ix)); + return utf8FromString(rpmfilesFLink(s->files, s->ix)); } static PyObject *rpmfile_user(rpmfileObject *s) { - return Py_BuildValue("s", rpmfilesFUser(s->files, s->ix)); + return utf8FromString(rpmfilesFUser(s->files, s->ix)); } static PyObject *rpmfile_group(rpmfileObject *s) { - return Py_BuildValue("s", rpmfilesFGroup(s->files, s->ix)); + return utf8FromString(rpmfilesFGroup(s->files, s->ix)); } static PyObject *rpmfile_fflags(rpmfileObject *s) @@ -145,7 +145,7 @@ static PyObject *rpmfile_digest(rpmfileObject *s) NULL, &diglen); if (digest) { char * hex = pgpHexStr(digest, diglen); - PyObject *o = Py_BuildValue("s", hex); + PyObject *o = utf8FromString(hex); free(hex); return o; } @@ -154,17 +154,17 @@ static PyObject *rpmfile_digest(rpmfileObject *s) static PyObject *rpmfile_class(rpmfileObject *s) { - return Py_BuildValue("s", rpmfilesFClass(s->files, s->ix)); + return utf8FromString(rpmfilesFClass(s->files, s->ix)); } static PyObject *rpmfile_caps(rpmfileObject *s) { - return Py_BuildValue("s", rpmfilesFCaps(s->files, s->ix)); + return utf8FromString(rpmfilesFCaps(s->files, s->ix)); } static PyObject *rpmfile_langs(rpmfileObject *s) { - return Py_BuildValue("s", rpmfilesFLangs(s->files, s->ix)); + return utf8FromString(rpmfilesFLangs(s->files, s->ix)); } static PyObject *rpmfile_links(rpmfileObject *s) @@ -468,8 +468,8 @@ static PyObject *rpmfiles_subscript(rpmfilesObject *s, PyObject *item) PyObject *str = NULL; /* treat numbers as sequence accesses */ - if (PyInt_Check(item)) { - return rpmfiles_getitem(s, PyInt_AsSsize_t(item)); + if (PyLong_Check(item)) { + return rpmfiles_getitem(s, PyLong_AsSsize_t(item)); } else if (PyLong_Check(item)) { return rpmfiles_getitem(s, PyLong_AsSsize_t(item)); } @@ -478,7 +478,7 @@ static PyObject *rpmfiles_subscript(rpmfilesObject *s, PyObject *item) if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength, i, cur; PyObject * result; - + if (PySlice_GetIndicesEx( #if PY_MAJOR_VERSION < 3 (PySliceObject*) diff --git a/python/rpmii-py.c b/python/rpmii-py.c index 180741479..ceb5c8bbd 100644 --- a/python/rpmii-py.c +++ b/python/rpmii-py.c @@ -68,9 +68,9 @@ rpmii_instances(rpmiiObject * s) for (int i = 0; i < entries; i++) { tuple = PyTuple_New(2); PyTuple_SET_ITEM(tuple, 0, - PyInt_FromLong(rpmdbIndexIteratorPkgOffset(s->ii, i))); + PyLong_FromLong(rpmdbIndexIteratorPkgOffset(s->ii, i))); PyTuple_SET_ITEM(tuple, 1, - PyInt_FromLong(rpmdbIndexIteratorTagNum(s->ii, i))); + PyLong_FromLong(rpmdbIndexIteratorTagNum(s->ii, i))); PyList_SET_ITEM(list, i, tuple); } return list; @@ -115,7 +115,7 @@ static char rpmii_doc[] = PyTypeObject rpmii_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.ii", /* tp_name */ + PYTHON_MODULENAME".ii", /* tp_name */ sizeof(rpmiiObject), /* tp_size */ 0, /* tp_itemsize */ (destructor) rpmii_dealloc, /* tp_dealloc */ diff --git a/python/rpmkeyring-py.c b/python/rpmkeyring-py.c index d5f131e42..b116f462d 100644 --- a/python/rpmkeyring-py.c +++ b/python/rpmkeyring-py.c @@ -38,7 +38,7 @@ static PyObject *rpmPubkey_new(PyTypeObject *subtype, static PyObject * rpmPubkey_Base64(rpmPubkeyObject *s) { char *b64 = rpmPubkeyBase64(s->pubkey); - PyObject *res = Py_BuildValue("s", b64); + PyObject *res = utf8FromString(b64); free(b64); return res; } @@ -52,7 +52,7 @@ static char rpmPubkey_doc[] = ""; PyTypeObject rpmPubkey_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.pubkey", /* tp_name */ + PYTHON_MODULENAME".pubkey", /* tp_name */ sizeof(rpmPubkeyObject), /* tp_size */ 0, /* tp_itemsize */ (destructor) rpmPubkey_dealloc,/* tp_dealloc */ @@ -133,7 +133,7 @@ static char rpmKeyring_doc[] = PyTypeObject rpmKeyring_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.keyring", /* tp_name */ + PYTHON_MODULENAME".keyring", /* tp_name */ sizeof(rpmKeyringObject), /* tp_size */ 0, /* tp_itemsize */ (destructor) rpmKeyring_dealloc,/* tp_dealloc */ diff --git a/python/rpmmacro-py.c b/python/rpmmacro-py.c index 3cb1a51f5..d8a365547 100644 --- a/python/rpmmacro-py.c +++ b/python/rpmmacro-py.c @@ -52,7 +52,7 @@ rpmmacro_ExpandMacro(PyObject * self, PyObject * args, PyObject * kwds) if (rpmExpandMacros(NULL, macro, &str, 0) < 0) PyErr_SetString(pyrpmError, "error expanding macro"); else - res = Py_BuildValue("s", str); + res = utf8FromString(str); free(str); } return res; diff --git a/python/rpmmi-py.c b/python/rpmmi-py.c index 379cafb38..6988f37d6 100644 --- a/python/rpmmi-py.c +++ b/python/rpmmi-py.c @@ -201,7 +201,7 @@ static char rpmmi_doc[] = PyTypeObject rpmmi_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.mi", /* tp_name */ + PYTHON_MODULENAME".mi", /* tp_name */ sizeof(rpmmiObject), /* tp_size */ 0, /* tp_itemsize */ (destructor) rpmmi_dealloc, /* tp_dealloc */ diff --git a/python/rpmmodule.c b/python/rpmmodule.c index d1390e889..ba58de54c 100644 --- a/python/rpmmodule.c +++ b/python/rpmmodule.c @@ -6,6 +6,7 @@ #include <rpm/rpmsq.h> #include <rpm/rpmlog.h> #include <rpm/rpmmacro.h> +#include <rpm/rpmsign.h> #include "header-py.h" #include "rpmarchive-py.h" @@ -22,6 +23,7 @@ #include "rpmtd-py.h" #include "rpmte-py.h" #include "rpmts-py.h" +#include "spec-py.h" /** \ingroup python * \name Module: rpm @@ -156,6 +158,38 @@ static PyObject * setInterruptSafety(PyObject * self, PyObject * args, PyObject Py_RETURN_NONE; } +static int parseSignArgs(PyObject * args, PyObject *kwds, + const char **path, struct rpmSignArgs *sargs) +{ + char * kwlist[] = { "path", "keyid", "hashalgo", NULL }; + + memset(sargs, 0, sizeof(*sargs)); + return PyArg_ParseTupleAndKeywords(args, kwds, "s|si", kwlist, + path, &sargs->keyid, &sargs->hashalgo); +} + +static PyObject * addSign(PyObject * self, PyObject * args, PyObject *kwds) +{ + const char *path = NULL; + struct rpmSignArgs sargs; + + if (!parseSignArgs(args, kwds, &path, &sargs)) + return NULL; + + return PyBool_FromLong(rpmPkgSign(path, &sargs) == 0); +} + +static PyObject * delSign(PyObject * self, PyObject * args, PyObject *kwds) +{ + const char *path = NULL; + struct rpmSignArgs sargs; + + if (!parseSignArgs(args, kwds, &path, &sargs)) + return NULL; + + return PyBool_FromLong(rpmPkgDelSign(path, &sargs) == 0); +} + static PyMethodDef rpmModuleMethods[] = { { "addMacro", (PyCFunction) rpmmacro_AddMacro, METH_VARARGS|METH_KEYWORDS, "rpmPushMacro(macro, value)\n" @@ -215,6 +249,8 @@ static PyMethodDef rpmModuleMethods[] = { "once only at process startup because currently signal handlers will\n" "not be retroactively applied if a database is open." }, + { "addSign", (PyCFunction) addSign, METH_VARARGS|METH_KEYWORDS, NULL }, + { "delSign", (PyCFunction) delSign, METH_VARARGS|METH_KEYWORDS, NULL }, { NULL } } ; @@ -236,8 +272,8 @@ static void addRpmTags(PyObject *module) tagval = rpmTagGetValue(shortname); PyModule_AddIntConstant(module, tagname, tagval); - pyval = PyInt_FromLong(tagval); - pyname = Py_BuildValue("s", shortname); + pyval = PyLong_FromLong(tagval); + pyname = utf8FromString(shortname); PyDict_SetItem(dict, pyval, pyname); Py_DECREF(pyval); Py_DECREF(pyname); @@ -269,6 +305,8 @@ static int prepareInitModule(void) #endif if (PyType_Ready(&rpmte_Type) < 0) return 0; if (PyType_Ready(&rpmts_Type) < 0) return 0; + if (PyType_Ready(&spec_Type) < 0) return 0; + if (PyType_Ready(&specPkg_Type) < 0) return 0; return 1; } @@ -388,6 +426,12 @@ static int initModule(PyObject *m) Py_INCREF(&rpmts_Type); PyModule_AddObject(m, "ts", (PyObject *) &rpmts_Type); + Py_INCREF(&spec_Type); + PyModule_AddObject(m, "spec", (PyObject *) &spec_Type); + + Py_INCREF(&specPkg_Type); + PyModule_AddObject(m, "specPkg", (PyObject *) &specPkg_Type); + addRpmTags(m); PyModule_AddStringConstant(m, "__version__", RPMVERSION); @@ -596,6 +640,32 @@ static int initModule(PyObject *m) REGISTER_ENUM(RPMVERIFY_READFAIL); REGISTER_ENUM(RPMVERIFY_LSTATFAIL); + REGISTER_ENUM(RPMBUILD_ISSOURCE); + REGISTER_ENUM(RPMBUILD_ISPATCH); + REGISTER_ENUM(RPMBUILD_ISICON); + REGISTER_ENUM(RPMBUILD_ISNO); + + REGISTER_ENUM(RPMBUILD_NONE); + REGISTER_ENUM(RPMBUILD_PREP); + REGISTER_ENUM(RPMBUILD_BUILD); + REGISTER_ENUM(RPMBUILD_INSTALL); + REGISTER_ENUM(RPMBUILD_CHECK); + REGISTER_ENUM(RPMBUILD_CLEAN); + REGISTER_ENUM(RPMBUILD_FILECHECK); + REGISTER_ENUM(RPMBUILD_PACKAGESOURCE); + REGISTER_ENUM(RPMBUILD_PACKAGEBINARY); + REGISTER_ENUM(RPMBUILD_RMSOURCE); + REGISTER_ENUM(RPMBUILD_RMBUILD); + REGISTER_ENUM(RPMBUILD_RMSPEC); + + REGISTER_ENUM(RPMBUILD_PKG_NONE); + REGISTER_ENUM(RPMBUILD_PKG_NODIRTOKENS); + + REGISTER_ENUM(RPMSPEC_NONE); + REGISTER_ENUM(RPMSPEC_ANYARCH); + REGISTER_ENUM(RPMSPEC_FORCE); + REGISTER_ENUM(RPMSPEC_NOLANG); + return 1; } diff --git a/python/rpmps-py.c b/python/rpmps-py.c index bdc899a60..b18e89e55 100644 --- a/python/rpmps-py.c +++ b/python/rpmps-py.c @@ -18,12 +18,12 @@ static PyObject *rpmprob_get_type(rpmProblemObject *s, void *closure) static PyObject *rpmprob_get_pkgnevr(rpmProblemObject *s, void *closure) { - return Py_BuildValue("s", rpmProblemGetPkgNEVR(s->prob)); + return utf8FromString(rpmProblemGetPkgNEVR(s->prob)); } static PyObject *rpmprob_get_altnevr(rpmProblemObject *s, void *closure) { - return Py_BuildValue("s", rpmProblemGetAltNEVR(s->prob)); + return utf8FromString(rpmProblemGetAltNEVR(s->prob)); } static PyObject *rpmprob_get_key(rpmProblemObject *s, void *closure) @@ -38,7 +38,7 @@ static PyObject *rpmprob_get_key(rpmProblemObject *s, void *closure) static PyObject *rpmprob_get_str(rpmProblemObject *s, void *closure) { - return Py_BuildValue("s", rpmProblemGetStr(s->prob)); + return utf8FromString(rpmProblemGetStr(s->prob)); } static PyObject *rpmprob_get_num(rpmProblemObject *s, void *closure) @@ -59,7 +59,7 @@ static PyGetSetDef rpmprob_getseters[] = { static PyObject *rpmprob_str(rpmProblemObject *s) { char *str = rpmProblemString(s->prob); - PyObject *res = Py_BuildValue("s", str); + PyObject *res = utf8FromString(str); free(str); return res; } @@ -72,8 +72,8 @@ static void rpmprob_dealloc(rpmProblemObject *s) PyTypeObject rpmProblem_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.prob", /* tp_name */ - sizeof(rpmProblemObject), /* tp_basicsize */ + PYTHON_MODULENAME".prob", /* tp_name */ + sizeof(rpmProblemObject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)rpmprob_dealloc, /* tp_dealloc */ diff --git a/python/rpmsmodule.c b/python/rpmsmodule.c deleted file mode 100644 index 72465221d..000000000 --- a/python/rpmsmodule.c +++ /dev/null @@ -1,98 +0,0 @@ -#include "rpmsystem-py.h" - -#include <rpm/rpmsign.h> - -static char rpms__doc__[] = -""; - -static int parseSignArgs(PyObject * args, PyObject *kwds, - const char **path, struct rpmSignArgs *sargs) -{ - char * kwlist[] = { "path", "keyid", "hashalgo", NULL }; - - memset(sargs, 0, sizeof(*sargs)); - return PyArg_ParseTupleAndKeywords(args, kwds, "s|si", kwlist, - path, &sargs->keyid, &sargs->hashalgo); -} - -static PyObject * addSign(PyObject * self, PyObject * args, PyObject *kwds) -{ - const char *path = NULL; - struct rpmSignArgs sargs; - - if (parseSignArgs(args, kwds, &path, &sargs)) - return NULL; - - return PyBool_FromLong(rpmPkgSign(path, &sargs) == 0); -} - -static PyObject * delSign(PyObject * self, PyObject * args, PyObject *kwds) -{ - const char *path = NULL; - struct rpmSignArgs sargs; - - if (parseSignArgs(args, kwds, &path, &sargs)) - return NULL; - - return PyBool_FromLong(rpmPkgDelSign(path, &sargs) == 0); -} - -/* - Do any common preliminary work before python 2 vs python 3 module creation: -*/ -static int prepareInitModule(void) -{ - return 1; -} - -static int initModule(PyObject *m) -{ - return 1; -} - -static PyMethodDef modMethods[] = { - { "addSign", (PyCFunction) addSign, METH_VARARGS|METH_KEYWORDS, NULL }, - { "delSign", (PyCFunction) delSign, METH_VARARGS|METH_KEYWORDS, NULL }, - { NULL }, -}; - -#if PY_MAJOR_VERSION >= 3 -static struct PyModuleDef moduledef = { - PyModuleDef_HEAD_INIT, - "_rpms", /* m_name */ - rpms__doc__, /* m_doc */ - 0, /* m_size */ - modMethods, /* m_methods */ - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; - -PyObject * PyInit__rpms(void); /* XXX eliminate gcc warning */ -PyObject * PyInit__rpms(void) -{ - PyObject *m; - - if (!prepareInitModule()) - return NULL; - m = PyModule_Create(&moduledef); - if (m == NULL || !initModule(m)) { - Py_XDECREF(m); - m = NULL; - } - return m; -} -#else -void init_rpms(void); /* XXX eliminate gcc warning */ -void init_rpms(void) -{ - PyObject *m; - - if (!prepareInitModule()) - return; - - m = Py_InitModule3("_rpms", modMethods, rpms__doc__); - if (m) initModule(m); -} -#endif diff --git a/python/rpmstrpool-py.c b/python/rpmstrpool-py.c index 356bd1de5..5c25d15fb 100644 --- a/python/rpmstrpool-py.c +++ b/python/rpmstrpool-py.c @@ -44,8 +44,8 @@ static PyObject *strpool_id2str(rpmstrPoolObject *s, PyObject *item) const char *str = rpmstrPoolStr(s->pool, id); if (str) - ret = PyBytes_FromString(str); - else + ret = utf8FromString(str); + else PyErr_SetObject(PyExc_KeyError, item); } return ret; diff --git a/python/rpmsystem-py.h b/python/rpmsystem-py.h index c8423e3dc..ebdbf371b 100644 --- a/python/rpmsystem-py.h +++ b/python/rpmsystem-py.h @@ -42,14 +42,11 @@ typedef Py_ssize_t (*lenfunc)(PyObject *); #define CAPSULE_EXTRACT(obj,name) PyCObject_AsVoidPtr(obj) #endif -/* For Python 3, use the PyLong type throughout in place of PyInt */ +/* In Python 3, we return all strings as surrogate-escaped utf-8 */ #if PY_MAJOR_VERSION >= 3 -#define PyInt_Check PyLong_Check -#define PyInt_AsLong PyLong_AsLong -#define PyInt_FromLong PyLong_FromLong -#define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask -#define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask -#define PyInt_AsSsize_t PyLong_AsSsize_t +#define utf8FromString(_s) PyUnicode_DecodeUTF8(_s, strlen(_s), "surrogateescape") +#else +#define utf8FromString(_s) PyBytes_FromString(_s) #endif #endif /* H_SYSTEM_PYTHON */ diff --git a/python/rpmtd-py.c b/python/rpmtd-py.c index 247c7502a..23ca10517 100644 --- a/python/rpmtd-py.c +++ b/python/rpmtd-py.c @@ -17,7 +17,7 @@ PyObject * rpmtd_ItemAsPyobj(rpmtd td, rpmTagClass tclass) switch (tclass) { case RPM_STRING_CLASS: - res = PyBytes_FromString(rpmtdGetString(td)); + res = utf8FromString(rpmtdGetString(td)); break; case RPM_NUMERIC_CLASS: res = PyLong_FromLongLong(rpmtdGetNumber(td)); diff --git a/python/rpmte-py.c b/python/rpmte-py.c index 6936e757e..184aa5ee5 100644 --- a/python/rpmte-py.c +++ b/python/rpmte-py.c @@ -56,49 +56,49 @@ rpmte_TEType(rpmteObject * s, PyObject * unused) static PyObject * rpmte_N(rpmteObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmteN(s->te)); + return utf8FromString(rpmteN(s->te)); } static PyObject * rpmte_E(rpmteObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmteE(s->te)); + return utf8FromString(rpmteE(s->te)); } static PyObject * rpmte_V(rpmteObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmteV(s->te)); + return utf8FromString(rpmteV(s->te)); } static PyObject * rpmte_R(rpmteObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmteR(s->te)); + return utf8FromString(rpmteR(s->te)); } static PyObject * rpmte_A(rpmteObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmteA(s->te)); + return utf8FromString(rpmteA(s->te)); } static PyObject * rpmte_O(rpmteObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmteO(s->te)); + return utf8FromString(rpmteO(s->te)); } static PyObject * rpmte_NEVR(rpmteObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmteNEVR(s->te)); + return utf8FromString(rpmteNEVR(s->te)); } static PyObject * rpmte_NEVRA(rpmteObject * s, PyObject * unused) { - return Py_BuildValue("s", rpmteNEVRA(s->te)); + return utf8FromString(rpmteNEVRA(s->te)); } static PyObject * @@ -204,7 +204,7 @@ rpmte_Files(rpmteObject * s, PyObject * args, PyObject * kwds) } static struct PyMethodDef rpmte_methods[] = { {"Type", (PyCFunction)rpmte_TEType, METH_NOARGS, - "te.Type() -- Return element type (rpm.TR_ADDED | rpm.TR_REMOVED).\n" }, + "te.Type() -- Return element type ("PYTHON_MODULENAME".TR_ADDED | "PYTHON_MODULENAME".TR_REMOVED).\n" }, {"N", (PyCFunction)rpmte_N, METH_NOARGS, "te.N() -- Return element name.\n" }, {"E", (PyCFunction)rpmte_E, METH_NOARGS, @@ -257,7 +257,7 @@ static char rpmte_doc[] = PyTypeObject rpmte_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.te", /* tp_name */ + PYTHON_MODULENAME".te", /* tp_name */ sizeof(rpmteObject), /* tp_size */ 0, /* tp_itemsize */ (destructor)0, /* tp_dealloc */ diff --git a/python/rpmts-py.c b/python/rpmts-py.c index d56a09c22..d6ae23750 100644 --- a/python/rpmts-py.c +++ b/python/rpmts-py.c @@ -230,16 +230,17 @@ rpmts_SolveCallback(rpmts ts, rpmds ds, const void * data) PyEval_RestoreThread(cbInfo->_save); - args = Py_BuildValue("(Oissi)", cbInfo->tso, - rpmdsTagN(ds), rpmdsN(ds), rpmdsEVR(ds), rpmdsFlags(ds)); - result = PyEval_CallObject(cbInfo->cb, args); + args = Py_BuildValue("(OiNNi)", cbInfo->tso, + rpmdsTagN(ds), utf8FromString(rpmdsN(ds)), + utf8FromString(rpmdsEVR(ds)), rpmdsFlags(ds)); + result = PyObject_Call(cbInfo->cb, args, NULL); Py_DECREF(args); if (!result) { die(cbInfo->cb); } else { - if (PyInt_Check(result)) - res = PyInt_AsLong(result); + if (PyLong_Check(result)) + res = PyLong_AsLong(result); Py_DECREF(result); } @@ -409,7 +410,7 @@ rpmts_HdrCheck(rpmtsObject * s, PyObject *obj) rpmrc = headerCheck(s->ts, uh, uc, &msg); Py_END_ALLOW_THREADS; - return Py_BuildValue("(is)", rpmrc, msg); + return Py_BuildValue("(iN)", rpmrc, utf8FromString(msg)); } static PyObject * @@ -459,7 +460,7 @@ static PyObject *rpmts_setKeyring(rpmtsObject *s, PyObject *arg) if (arg == Py_None || rpmKeyringFromPyObject(arg, &keyring)) { return PyBool_FromLong(rpmtsSetKeyring(s->ts, keyring) == 0); } else { - PyErr_SetString(PyExc_TypeError, "rpm.keyring or None expected"); + PyErr_SetString(PyExc_TypeError, PYTHON_MODULENAME".keyring or None expected"); return NULL; } } @@ -498,7 +499,7 @@ rpmtsCallback(const void * hd, const rpmCallbackType what, /* Synthesize a python object for callback (if necessary). */ if (pkgObj == NULL) { if (h) { - pkgObj = Py_BuildValue("s", headerGetString(h, RPMTAG_NAME)); + pkgObj = utf8FromString(headerGetString(h, RPMTAG_NAME)); } else { pkgObj = Py_None; Py_INCREF(pkgObj); @@ -509,7 +510,7 @@ rpmtsCallback(const void * hd, const rpmCallbackType what, PyEval_RestoreThread(cbInfo->_save); args = Py_BuildValue("(iLLOO)", what, amount, total, pkgObj, cbInfo->data); - result = PyEval_CallObject(cbInfo->cb, args); + result = PyObject_Call(cbInfo->cb, args, NULL); Py_DECREF(args); Py_DECREF(pkgObj); @@ -624,8 +625,8 @@ rpmts_Match(rpmtsObject * s, PyObject * args, PyObject * kwds) return NULL; if (Key) { - if (PyInt_Check(Key)) { - lkey = PyInt_AsLong(Key); + if (PyLong_Check(Key)) { + lkey = PyLong_AsLong(Key); key = (char *)&lkey; len = sizeof(lkey); } else if (PyLong_Check(Key)) { @@ -845,7 +846,7 @@ static PyObject *rpmts_get_tid(rpmtsObject *s, void *closure) static PyObject *rpmts_get_rootDir(rpmtsObject *s, void *closure) { - return Py_BuildValue("s", rpmtsRootDir(s->ts)); + return utf8FromString(rpmtsRootDir(s->ts)); } static int rpmts_set_scriptFd(rpmtsObject *s, PyObject *value, void *closure) @@ -968,7 +969,7 @@ static PyGetSetDef rpmts_getseters[] = { PyTypeObject rpmts_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.ts", /* tp_name */ + PYTHON_MODULENAME".ts", /* tp_name */ sizeof(rpmtsObject), /* tp_size */ 0, /* tp_itemsize */ (destructor) rpmts_dealloc, /* tp_dealloc */ diff --git a/python/setup.py.in b/python/setup.py.in index dd56a47a9..3b87edddb 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -25,35 +25,18 @@ if os.access('Makefile.am', os.F_OK): os.environ['PKG_CONFIG_PATH'] = '..' -rpmmod = Extension('rpm._rpm', - sources = [ 'header-py.c', 'rpmds-py.c', 'rpmfd-py.c', - 'rpmfi-py.c', 'rpmii-py.c', 'rpmkeyring-py.c', - 'rpmmacro-py.c', 'rpmmi-py.c', 'rpmps-py.c', - 'rpmstrpool-py.c', 'rpmfiles-py.c', - 'rpmarchive-py.c', 'rpmtd-py.c', - 'rpmte-py.c', 'rpmts-py.c', 'rpmmodule.c', - ], +rpmmod = Extension('@PYTHON_MODULENAME@._rpm', + sources = ['header-py.c', 'rpmds-py.c', 'rpmfd-py.c', + 'rpmfi-py.c', 'rpmii-py.c', 'rpmkeyring-py.c', + 'rpmmacro-py.c', 'rpmmi-py.c', 'rpmps-py.c', + 'rpmstrpool-py.c', 'rpmfiles-py.c', + 'rpmarchive-py.c', 'rpmtd-py.c', + 'rpmte-py.c', 'rpmts-py.c', + 'spec-py', + 'rpmmodule.c'], include_dirs = pkgconfig('--cflags'), library_dirs = pkgconfig('--libs-only-L'), - libraries = pkgconfig('--libs-only-l'), - extra_compile_args = cflags, - extra_link_args = additional_link_args - ) - -rpmbuild_mod = Extension('rpm._rpmb', - sources = ['rpmbmodule.c', 'spec-py.c'], - include_dirs = pkgconfig('--cflags'), - library_dirs = pkgconfig('--libs-only-L'), - libraries = pkgconfig('--libs-only-l') + ['rpmbuild'], - extra_compile_args = cflags, - extra_link_args = additional_link_args - ) - -rpmsign_mod = Extension('rpm._rpms', - sources = ['rpmsmodule.c'], - include_dirs = pkgconfig('--cflags'), - library_dirs = pkgconfig('--libs-only-L'), - libraries = pkgconfig('--libs-only-l') + ['rpmsign'], + libraries = pkgconfig('--libs-only-l') + ['rpmbuild', 'rpmsign'], extra_compile_args = cflags, extra_link_args = additional_link_args ) @@ -63,6 +46,6 @@ setup(name='@PACKAGE_NAME@', description='Python bindings for @PACKAGE_NAME@', maintainer_email='@PACKAGE_BUGREPORT@', url='http://www.rpm.org/', - packages = ['@PACKAGE_NAME@'], - ext_modules= [rpmmod, rpmbuild_mod, rpmsign_mod] + packages=['@PACKAGE_NAME@'], + ext_modules=[rpmmod] ) diff --git a/python/spec-py.c b/python/spec-py.c index 47c17400f..ab42ee780 100644 --- a/python/spec-py.c +++ b/python/spec-py.c @@ -31,10 +31,10 @@ /* Header objects are in another module, some hoop jumping required... */ static PyObject *makeHeader(Header h) { - PyObject *rpmmod = PyImport_ImportModuleNoBlock("rpm"); + PyObject *rpmmod = PyImport_ImportModuleNoBlock(PYTHON_MODULENAME); if (rpmmod == NULL) return NULL; - PyObject *ptr = CAPSULE_BUILD(h, "rpm._C_Header"); + PyObject *ptr = CAPSULE_BUILD(h, PYTHON_MODULENAME"._C_Header"); PyObject *hdr = PyObject_CallMethod(rpmmod, "hdr", "(O)", ptr); Py_XDECREF(ptr); Py_XDECREF(rpmmod); @@ -57,7 +57,7 @@ static PyObject *pkgGetSection(rpmSpecPkg pkg, int section) { char *sect = rpmSpecPkgGetSection(pkg, section); if (sect != NULL) { - PyObject *ps = PyBytes_FromString(sect); + PyObject *ps = utf8FromString(sect); free(sect); if (ps != NULL) return ps; @@ -98,7 +98,7 @@ static PyGetSetDef specpkg_getseters[] = { PyTypeObject specPkg_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.specpkg", /* tp_name */ + PYTHON_MODULENAME".specpkg", /* tp_name */ sizeof(specPkgObject), /* tp_size */ 0, /* tp_itemsize */ (destructor) specPkg_dealloc, /* tp_dealloc */ @@ -158,7 +158,7 @@ static PyObject * getSection(rpmSpec spec, int section) { const char *sect = rpmSpecGetSection(spec, section); if (sect) { - return Py_BuildValue("s", sect); + return utf8FromString(sect); } Py_RETURN_NONE; } @@ -208,8 +208,8 @@ static PyObject * spec_get_sources(specObject *s, void *closure) rpmSpecSrcIter iter = rpmSpecSrcIterInit(s->spec); while ((source = rpmSpecSrcIterNext(iter)) != NULL) { - PyObject *srcUrl = Py_BuildValue("(sii)", - rpmSpecSrcFilename(source, 1), + PyObject *srcUrl = Py_BuildValue("(Nii)", + utf8FromString(rpmSpecSrcFilename(source, 1)), rpmSpecSrcNum(source), rpmSpecSrcFlags(source)); if (!srcUrl) { @@ -312,7 +312,7 @@ static struct PyMethodDef spec_methods[] = { PyTypeObject spec_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "rpm.spec", /*tp_name*/ + PYTHON_MODULENAME".spec", /*tp_name*/ sizeof(specObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor) spec_dealloc, /*tp_dealloc*/ |