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

Reply via email to