Commit b2653b34 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #23098: 64-bit dev_t is now supported in the os module.

parent ccb416fe
...@@ -44,6 +44,8 @@ Core and Builtins ...@@ -44,6 +44,8 @@ Core and Builtins
Library 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" - Issue #23250: In the http.cookies module, capitalize "HttpOnly" and "Secure"
as they are written in the standard. as they are written in the standard.
......
...@@ -623,6 +623,29 @@ fail: ...@@ -623,6 +623,29 @@ fail:
#endif /* MS_WINDOWS */ #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 #ifdef AT_FDCWD
/* /*
* Why the (int) cast? Solaris 10 defines AT_FDCWD as 0xffd19553 (-3041965); * Why the (int) cast? Solaris 10 defines AT_FDCWD as 0xffd19553 (-3041965);
...@@ -2218,11 +2241,8 @@ _pystat_fromstructstat(STRUCT_STAT *st) ...@@ -2218,11 +2241,8 @@ _pystat_fromstructstat(STRUCT_STAT *st)
#endif #endif
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLong(st->st_dev)); 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 #else
PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev)); PyStructSequence_SET_ITEM(v, 2, _PyLong_FromDev(st->st_dev));
#endif #endif
PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink)); PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink));
#if defined(MS_WINDOWS) #if defined(MS_WINDOWS)
...@@ -8633,16 +8653,16 @@ posix_mknod(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -8633,16 +8653,16 @@ posix_mknod(PyObject *self, PyObject *args, PyObject *kwargs)
{ {
path_t path; path_t path;
int mode = 0666; int mode = 0666;
int device = 0; dev_t device = 0;
int dir_fd = DEFAULT_DIR_FD; int dir_fd = DEFAULT_DIR_FD;
int result; int result;
PyObject *return_value = NULL; PyObject *return_value = NULL;
static char *keywords[] = {"path", "mode", "device", "dir_fd", NULL}; static char *keywords[] = {"path", "mode", "device", "dir_fd", NULL};
memset(&path, 0, sizeof(path)); 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, path_converter, &path,
&mode, &device, &mode, _Py_Dev_Converter, &device,
#ifdef HAVE_MKNODAT #ifdef HAVE_MKNODAT
dir_fd_converter, &dir_fd dir_fd_converter, &dir_fd
#else #else
...@@ -8682,8 +8702,8 @@ Extracts a device major number from a raw device number."); ...@@ -8682,8 +8702,8 @@ Extracts a device major number from a raw device number.");
static PyObject * static PyObject *
posix_major(PyObject *self, PyObject *args) posix_major(PyObject *self, PyObject *args)
{ {
int device; dev_t device;
if (!PyArg_ParseTuple(args, "i:major", &device)) if (!PyArg_ParseTuple(args, "O&:major", _Py_Dev_Converter, &device))
return NULL; return NULL;
return PyLong_FromLong((long)major(device)); return PyLong_FromLong((long)major(device));
} }
...@@ -8695,8 +8715,8 @@ Extracts a device minor number from a raw device number."); ...@@ -8695,8 +8715,8 @@ Extracts a device minor number from a raw device number.");
static PyObject * static PyObject *
posix_minor(PyObject *self, PyObject *args) posix_minor(PyObject *self, PyObject *args)
{ {
int device; dev_t device;
if (!PyArg_ParseTuple(args, "i:minor", &device)) if (!PyArg_ParseTuple(args, "O&:minor", _Py_Dev_Converter, &device))
return NULL; return NULL;
return PyLong_FromLong((long)minor(device)); return PyLong_FromLong((long)minor(device));
} }
...@@ -8711,7 +8731,7 @@ posix_makedev(PyObject *self, PyObject *args) ...@@ -8711,7 +8731,7 @@ posix_makedev(PyObject *self, PyObject *args)
int major, minor; int major, minor;
if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor)) if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor))
return NULL; return NULL;
return PyLong_FromLong((long)makedev(major, minor)); return _PyLong_FromDev(makedev(major, minor));
} }
#endif /* device macros */ #endif /* device macros */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment