summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPanu Matilainen <pmatilai@redhat.com>2009-10-28 15:55:35 +0200
committerPanu Matilainen <pmatilai@redhat.com>2009-10-28 15:55:35 +0200
commita5e123bc3e07fa6cc3fad13bc7f8a471ecb17d9b (patch)
treeacc2bc3bf4182a92e4c8282618ba04c3d6489a9f
parent590914c32c1d514d1a4e5c2244e1e38548a2e87d (diff)
downloadrpm-a5e123bc3e07fa6cc3fad13bc7f8a471ecb17d9b.tar.gz
rpm-a5e123bc3e07fa6cc3fad13bc7f8a471ecb17d9b.tar.bz2
rpm-a5e123bc3e07fa6cc3fad13bc7f8a471ecb17d9b.zip
Use PyObject_AsFileDescriptor() instead of object type comparison
- this permits any file-like object implementing .fileno() method (including rpm.fd) to be dup'ed, not just PyFile subtypes - this also avoids yet another incompatibility with Python 3 which doesn't have PyFile_Check() and PyFile_AsFile() at all
-rw-r--r--python/rpmfd-py.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/python/rpmfd-py.c b/python/rpmfd-py.c
index 8b0da0e6e..5c50a4f63 100644
--- a/python/rpmfd-py.c
+++ b/python/rpmfd-py.c
@@ -51,6 +51,7 @@ static PyObject *rpmfd_new(PyTypeObject *subtype,
PyObject *fo = NULL;
rpmfdObject *s = NULL;
FD_t fd = NULL;
+ int fdno;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|ss", kwlist,
&fo, &mode, &flags))
@@ -62,11 +63,8 @@ static PyObject *rpmfd_new(PyTypeObject *subtype,
fd = Fopen(PyBytes_AsString(fo), m);
Py_END_ALLOW_THREADS
free(m);
- } else if (PyInt_Check(fo)) {
- fd = fdDup(PyInt_AsLong(fo));
- } else if (PyFile_Check(fo)) {
- FILE *fp = PyFile_AsFile(fo);
- fd = fdDup(fileno(fp));
+ } else if ((fdno = PyObject_AsFileDescriptor(fo)) >= 0) {
+ fd = fdDup(fdno);
} else {
PyErr_SetString(PyExc_TypeError, "path or file object expected");
return NULL;