diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-01-18 09:11:25 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-01-18 09:11:25 (GMT) |
commit | 2098d61aab657657af245ed974339eb3cbd65d76 (patch) | |
tree | 1d98d23b7c96e43c4009ef00de20c68118d4eeb6 /Modules | |
parent | b5daa3d6db429017dea1e4f15b78557e03b5f847 (diff) | |
download | cpython-2098d61aab657657af245ed974339eb3cbd65d76.zip cpython-2098d61aab657657af245ed974339eb3cbd65d76.tar.gz cpython-2098d61aab657657af245ed974339eb3cbd65d76.tar.bz2 |
Issue #23098: 64-bit dev_t is now supported in the os module.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/posixmodule.c | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 379423c..c4c767e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -474,6 +474,36 @@ OverflowUp: #endif /* MS_WINDOWS */ +#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV) +static int +_Py_Dev_Converter(PyObject *obj, void *p) +{ +#ifdef HAVE_LONG_LONG + *((dev_t *)p) = PyLong_AsUnsignedLongLong(obj); +#else + *((dev_t *)p) = PyLong_AsUnsignedLong(obj); +#endif + if (PyErr_Occurred()) + return 0; + return 1; +} + +#ifdef HAVE_LONG_LONG +static PyObject * +_PyInt_FromDev(PY_LONG_LONG v) +{ + if (LONG_MIN <= v && v <= LONG_MAX) + return PyInt_FromLong((long)v); + else + return PyLong_FromLongLong(v); +} +#else +# define _PyInt_FromDev PyInt_FromLong +#endif + +#endif + + #if defined _MSC_VER && _MSC_VER >= 1400 /* Microsoft CRT in VS2005 and higher will verify that a filehandle is * valid and raise an assertion if it isn't. @@ -1426,11 +1456,10 @@ _pystat_fromstructstat(STRUCT_STAT *st) #else PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long)st->st_ino)); #endif -#if defined(HAVE_LONG_LONG) && !defined(MS_WINDOWS) - PyStructSequence_SET_ITEM(v, 2, - PyLong_FromLongLong((PY_LONG_LONG)st->st_dev)); +#ifdef MS_WINDOWS + PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLong(st->st_dev)); #else - PyStructSequence_SET_ITEM(v, 2, PyInt_FromLong((long)st->st_dev)); + PyStructSequence_SET_ITEM(v, 2, _PyInt_FromDev(st->st_dev)); #endif PyStructSequence_SET_ITEM(v, 3, PyInt_FromLong((long)st->st_nlink)); #if defined(MS_WINDOWS) @@ -7009,9 +7038,11 @@ posix_mknod(PyObject *self, PyObject *args) { char *filename; int mode = 0600; - int device = 0; + dev_t device = 0; int res; - if (!PyArg_ParseTuple(args, "s|ii:mknod", &filename, &mode, &device)) + if (!PyArg_ParseTuple(args, "s|iO&:mknod", + &filename, &mode, + _Py_Dev_Converter, &device)) return NULL; Py_BEGIN_ALLOW_THREADS res = mknod(filename, mode, device); @@ -7031,8 +7062,8 @@ Extracts a device major number from a raw device number."); static PyObject * posix_major(PyObject *self, PyObject *args) { - int device; - if (!PyArg_ParseTuple(args, "i:major", &device)) + dev_t device; + if (!PyArg_ParseTuple(args, "O&:major", _Py_Dev_Converter, &device)) return NULL; return PyInt_FromLong((long)major(device)); } @@ -7044,8 +7075,8 @@ Extracts a device minor number from a raw device number."); static PyObject * posix_minor(PyObject *self, PyObject *args) { - int device; - if (!PyArg_ParseTuple(args, "i:minor", &device)) + dev_t device; + if (!PyArg_ParseTuple(args, "O&:minor", _Py_Dev_Converter, &device)) return NULL; return PyInt_FromLong((long)minor(device)); } @@ -7060,7 +7091,7 @@ posix_makedev(PyObject *self, PyObject *args) int major, minor; if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor)) return NULL; - return PyInt_FromLong((long)makedev(major, minor)); + return _PyInt_FromDev(makedev(major, minor)); } #endif /* device macros */ @@ -8522,7 +8553,6 @@ setup_confname_table(struct constdef *table, size_t tablesize, { PyObject *d = NULL; size_t i; - qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs); d = PyDict_New(); if (d == NULL) |