Mercurial > cpython-lru_cache-weakref
diff Modules/socketmodule.c @ 11217:f406e78ec10b legacy-trunk
Patch by Ben Gertzfield to add inet_aton() and inet_ntoa() calls.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Fri, 20 Aug 1999 18:21:51 +0000 |
| parents | 35e0d03f2b02 |
| children | 2d7331f4dfe3 |
line wrap: on
line diff
--- a/Modules/socketmodule.c Fri Aug 20 14:28:29 1999 +0000 +++ b/Modules/socketmodule.c Fri Aug 20 18:21:51 1999 +0000 @@ -54,6 +54,8 @@ - socket.htons(16 bit value) --> new int object - socket.htonl(32 bit value) --> new int object - socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h> +- socket.inet_aton(IP address) -> 32-bit packed IP representation +- socket.inet_ntoa(packed IP) -> IP address string - an Internet socket address is a pair (hostname, port) where hostname can be anything recognized by gethostbyname() (including the dd.dd.dd.dd notation) and port is in host byte order @@ -151,6 +153,10 @@ #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> + +/* added 20 Aug 1999 to remove warnings from inet_ntoa call <che@debian.org> */ +#include <arpa/inet.h> + #include <fcntl.h> #else #include <winsock.h> @@ -1785,6 +1791,68 @@ \n\ Convert a 32-bit integer from host to network byte order."; +/* + * socket.inet_aton() and socket.inet_ntoa() functions + * + * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him! + * + */ + +static char inet_aton_doc[] = +"inet_aton(string) -> packed 32-bit IP representation\n\ +\n\ +Convert an IP address in string format (123.45.67.89) to the 32-bit packed +binary format used in low-level network functions."; + +static PyObject* +BUILD_FUNC_DEF_2(PySocket_inet_aton, PyObject *, self, PyObject *, args) +{ + char *ip_addr; + struct in_addr packed_addr; + int err; + + if (!PyArg_Parse(args, "s", &ip_addr)) { + return NULL; + } + + err = inet_aton(ip_addr, &packed_addr); + + if (err == 0) { /* invalid address */ + PyErr_SetString(PySocket_Error, + "illegal IP address string passed to inet_aton"); + return NULL; + } + + return PyString_FromStringAndSize((char *) &packed_addr, + sizeof(packed_addr)); +} + +static char inet_ntoa_doc[] = +"inet_aton(packed_ip) -> ip_address_string\n\ +\n\ +Convert an IP address from 32-bit packed binary format to string format"; + +static PyObject* +BUILD_FUNC_DEF_2(PySocket_inet_ntoa, PyObject *, self, PyObject *, args) +{ + char *packed_str; + int err, addr_len; + struct in_addr packed_addr; + + if (!PyArg_Parse(args, "s#", &packed_str, &addr_len)) { + return NULL; + } + + if (addr_len != sizeof(packed_addr)) { + PyErr_SetString(PySocket_Error, + "packed IP wrong length for inet_ntoa"); + return NULL; + } + + memcpy(&packed_addr, packed_str, addr_len); + + return PyString_FromString(inet_ntoa(packed_addr)); +} /* List of functions exported by this module. */ @@ -1803,6 +1871,8 @@ {"ntohl", PySocket_ntohl, 0, ntohl_doc}, {"htons", PySocket_htons, 0, htons_doc}, {"htonl", PySocket_htonl, 0, htonl_doc}, + {"inet_aton", PySocket_inet_aton, 0, inet_aton_doc}, + {"inet_ntoa", PySocket_inet_ntoa, 0, inet_ntoa_doc}, {NULL, NULL} /* Sentinel */ }; @@ -1927,6 +1997,8 @@ getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number\n\ ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order\n\ htons(), htonl() -- convert 16, 32 bit int from host to network byte order\n\ +inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format\n\ +inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)\n\ \n\ (*) not available on all platforms!)\n\ \n\
