Mercurial > cpython-lru_cache-weakref
diff Modules/socketmodule.c @ 24375:89ce62126664 legacy-trunk
Extended socket.htonl and ntohl to accept longs.
Fixes SF bug #568322.
The code should raise an OverflowError if the long is > 32 bits, even
on platforms where sizeof(long) > 4.
| author | Jeremy Hylton <jeremy@alum.mit.edu> |
|---|---|
| date | Thu, 25 Jul 2002 16:01:12 +0000 |
| parents | 979ff5d0ae07 |
| children | 672843ee4b61 |
line wrap: on
line diff
--- a/Modules/socketmodule.c Thu Jul 25 15:37:23 2002 +0000 +++ b/Modules/socketmodule.c Thu Jul 25 16:01:12 2002 +0000 @@ -2469,15 +2469,34 @@ static PyObject * -socket_ntohl(PyObject *self, PyObject *args) +socket_ntohl(PyObject *self, PyObject *arg) { - int x1, x2; - - if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) { + unsigned long x; + + if (PyInt_Check(arg)) { + x = PyInt_AS_LONG(arg); + } + else if (PyLong_Check(arg)) { + x = PyLong_AsUnsignedLong(arg); +#if SIZEOF_LONG > 4 + { + unsigned long y; + /* only want the trailing 32 bits */ + y = x & 0xFFFFFFFFUL; + if (y ^ x) + return PyErr_Format(PyExc_OverflowError, + "long int larger than 32 bits"); + x = y; + } +#endif + } + else + return PyErr_Format(PyExc_TypeError, + "expected int/long, %s found", + arg->ob_type->tp_name); + if (x == (unsigned long) -1 && PyErr_Occurred()) return NULL; - } - x2 = ntohl(x1); - return PyInt_FromLong(x2); + return PyInt_FromLong(ntohl(x)); } PyDoc_STRVAR(ntohl_doc, @@ -2489,7 +2508,7 @@ static PyObject * socket_htons(PyObject *self, PyObject *args) { - int x1, x2; + unsigned long x1, x2; if (!PyArg_ParseTuple(args, "i:htons", &x1)) { return NULL; @@ -2505,15 +2524,34 @@ static PyObject * -socket_htonl(PyObject *self, PyObject *args) +socket_htonl(PyObject *self, PyObject *arg) { - int x1, x2; - - if (!PyArg_ParseTuple(args, "i:htonl", &x1)) { + unsigned long x; + + if (PyInt_Check(arg)) { + x = PyInt_AS_LONG(arg); + } + else if (PyLong_Check(arg)) { + x = PyLong_AsUnsignedLong(arg); +#if SIZEOF_LONG > 4 + { + unsigned long y; + /* only want the trailing 32 bits */ + y = x & 0xFFFFFFFFUL; + if (y ^ x) + return PyErr_Format(PyExc_OverflowError, + "long int larger than 32 bits"); + x = y; + } +#endif + } + else + return PyErr_Format(PyExc_TypeError, + "expected int/long, %s found", + arg->ob_type->tp_name); + if (x == (unsigned long) -1 && PyErr_Occurred()) return NULL; - } - x2 = htonl(x1); - return PyInt_FromLong(x2); + return PyInt_FromLong(htonl(x)); } PyDoc_STRVAR(htonl_doc, @@ -2812,11 +2850,11 @@ {"ntohs", socket_ntohs, METH_VARARGS, ntohs_doc}, {"ntohl", socket_ntohl, - METH_VARARGS, ntohl_doc}, + METH_O, ntohl_doc}, {"htons", socket_htons, METH_VARARGS, htons_doc}, {"htonl", socket_htonl, - METH_VARARGS, htonl_doc}, + METH_O, htonl_doc}, {"inet_aton", socket_inet_aton, METH_VARARGS, inet_aton_doc}, {"inet_ntoa", socket_inet_ntoa,
