Author: ArcRiley Date: 2009-01-03 16:21:10 -0500 (Sat, 03 Jan 2009) New Revision: 1411
Modified: trunk/concordance/src/Core.c Log: Cleaned up network code, added many comments Modified: trunk/concordance/src/Core.c =================================================================== --- trunk/concordance/src/Core.c 2009-01-03 06:09:20 UTC (rev 1410) +++ trunk/concordance/src/Core.c 2009-01-03 21:21:10 UTC (rev 1411) @@ -52,9 +52,9 @@ static char* kwlist[] = {"client", "server", 0}; /* set defaults for optional arguments */ - self->c2s.addr = INADDR_ANY; + self->c2s.addr = "0.0.0.0"; self->c2s.port = 5222; - self->s2s.addr = INADDR_ANY; + self->s2s.addr = "0.0.0.0"; self->s2s.port = 5269; /* parse and check arguments */ @@ -97,50 +97,67 @@ cdef : \*/ int ret; struct addrinfo* resinfo = NULL; - struct sockaddr_in ipaddr; - struct sockaddr* addr; - int addrsz; - if (sock.addr) { - ret = getaddrinfo(sock.addr, NULL, NULL, &resinfo); - if (ret<0) { - switch (ret) { - case EAI_AGAIN : - PyErr_SetString(PyExc_OSError, "temporary dns failure"); - case EAI_FAIL : - PyErr_SetString(PyExc_OSError, "permanent dns failure"); - case EAI_FAMILY : - PyErr_SetString(PyExc_OSError, "address family not supported"); - case EAI_MEMORY : - PyErr_SetString(PyExc_MemoryError, "out of memory on getaddrinfo"); - case EAI_NODATA : - PyErr_SetString(PyExc_AttributeError, "host lacks IP address"); - default : - PyErr_SetString(PyExc_AttributeError, "invalid address/hostname"); - } - return 0; + ret = getaddrinfo(sock.addr, NULL, NULL, &resinfo); + + /* Handle address lookup errors */ + if (ret<0) { + switch (ret) { + case EAI_AGAIN : + /* EAI_AGAIN + The name server returned a temporary failure indication. Try + again later. */ + PyErr_SetString(PyExc_OSError, "temporary dns failure"); + case EAI_FAIL : + /* EAI_FAIL + The name server returned a permanent failure indication. */ + PyErr_SetString(PyExc_OSError, "permanent dns failure"); + case EAI_FAMILY : + /* EAI_FAMILY + The requested address family is not supported. */ + PyErr_SetString(PyExc_OSError, "address family not supported"); + case EAI_MEMORY : + /* EAI_MEMORY + Out of memory. */ + PyErr_SetString(PyExc_MemoryError, "out of memory on getaddrinfo"); + case EAI_NODATA : + /* EAI_NODATA + The specified network host exists, but does not have any network + addresses defined. */ + PyErr_SetString(PyExc_AttributeError, "host lacks IP address"); + default : + PyErr_SetString(PyExc_AttributeError, "invalid address/hostname"); } - sock.sock = socket(resinfo->ai_family, SOCK_STREAM, 0); - addr = (struct sockaddr*) resinfo->ai_addr; - addrsz = resinfo->ai_addrlen; - } else { - ipaddr.sin_family = AF_INET; - ipaddr.sin_addr.s_addr = INADDR_ANY; - sock.sock = socket(AF_INET, SOCK_STREAM, 0); - addr = (struct sockaddr*) &ipaddr; - addrsz = sizeof(ipaddr); + return 0; } - ((struct sockaddr_in*) addr)->sin_port = htons(sock.port); + + /* int socket(int domain, int type, int protocol); */ + sock.sock = socket(resinfo->ai_family, SOCK_STREAM, 0); + if (sock.sock == -1) { + if (resinfo) + /* prevent leaking resinfo on err, see freeaddrinfo below */ + freeaddrinfo(resinfo); PyErr_SetString(PyExc_OSError, "unable to create listening socket"); return 0; } - if (bind(sock.sock, addr, addrsz) == -1 || + + /* The htons() function converts the unsigned short integer hostshort from + host byte order to network byte order. */ + ((struct sockaddr_in*) resinfo->ai_addr)->sin_port = htons(sock.port); + + /* int bind(int sockfd, const struct sockaddr *addr, + socklen_t addrlen); + On success, zero is returned. On error, -1 is returned. */ + if (bind(sock.sock, resinfo->ai_addr, resinfo->ai_addrlen) == -1 || listen(sock.sock, 16) == -1 ) { PyErr_SetString(PyExc_OSError, "unable to bind listening socket"); return 0; } + if (resinfo) + /* The freeaddrinfo() function frees the memory that was allocated for + the dynamically allocated linked list res. */ freeaddrinfo(resinfo); /* #ifdef MS_WINDOWS _______________________________________________ PySoy-SVN mailing list PySoy-SVN@pysoy.org http://www.pysoy.org/mailman/listinfo/pysoy-svn