summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2015-01-18 09:12:11 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2015-01-18 09:12:11 (GMT)
commitb2653b344e01710a99bc782a0b9e4b4d0f8eed5f (patch)
treec44edb836460297744670f3db8970d795f8bb69a
parentccb416fee2c680252a16a55f2640cba3bde80185 (diff)
downloadcpython-b2653b344e01710a99bc782a0b9e4b4d0f8eed5f.zip
cpython-b2653b344e01710a99bc782a0b9e4b4d0f8eed5f.tar.gz
cpython-b2653b344e01710a99bc782a0b9e4b4d0f8eed5f.tar.bz2
Issue #23098: 64-bit dev_t is now supported in the os module.
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/posixmodule.c44
2 files changed, 34 insertions, 12 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index 7f87c2d..c866803 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -44,6 +44,8 @@ Core and Builtins
Library
-------
+- Issue #23098: 64-bit dev_t is now supported in the os module.
+
- Issue #23250: In the http.cookies module, capitalize "HttpOnly" and "Secure"
as they are written in the standard.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index e2d9b5c..03798ca 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -623,6 +623,29 @@ fail:
#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
+# define _PyLong_FromDev PyLong_FromLongLong
+#else
+# define _PyLong_FromDev PyLong_FromLong
+#endif
+
+#endif
+
+
#ifdef AT_FDCWD
/*
* Why the (int) cast? Solaris 10 defines AT_FDCWD as 0xffd19553 (-3041965);
@@ -2218,11 +2241,8 @@ _pystat_fromstructstat(STRUCT_STAT *st)
#endif
#ifdef MS_WINDOWS
PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLong(st->st_dev));
-#elif defined(HAVE_LONG_LONG)
- PyStructSequence_SET_ITEM(v, 2,
- PyLong_FromLongLong((PY_LONG_LONG)st->st_dev));
#else
- PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev));
+ PyStructSequence_SET_ITEM(v, 2, _PyLong_FromDev(st->st_dev));
#endif
PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink));
#if defined(MS_WINDOWS)
@@ -8633,16 +8653,16 @@ posix_mknod(PyObject *self, PyObject *args, PyObject *kwargs)
{
path_t path;
int mode = 0666;
- int device = 0;
+ dev_t device = 0;
int dir_fd = DEFAULT_DIR_FD;
int result;
PyObject *return_value = NULL;
static char *keywords[] = {"path", "mode", "device", "dir_fd", NULL};
memset(&path, 0, sizeof(path));
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|ii$O&:mknod", keywords,
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|iO&$O&:mknod", keywords,
path_converter, &path,
- &mode, &device,
+ &mode, _Py_Dev_Converter, &device,
#ifdef HAVE_MKNODAT
dir_fd_converter, &dir_fd
#else
@@ -8682,8 +8702,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 PyLong_FromLong((long)major(device));
}
@@ -8695,8 +8715,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 PyLong_FromLong((long)minor(device));
}
@@ -8711,7 +8731,7 @@ posix_makedev(PyObject *self, PyObject *args)
int major, minor;
if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor))
return NULL;
- return PyLong_FromLong((long)makedev(major, minor));
+ return _PyLong_FromDev(makedev(major, minor));
}
#endif /* device macros */