Author: ArcRiley
Date: 2009-01-03 01:09:20 -0500 (Sat, 03 Jan 2009)
New Revision: 1410

Modified:
   trunk/concordance/setup.py
   trunk/concordance/src/Core.c
   trunk/concordance/src/Core.h
Log:
Now opens listening sockets with full ipv4/ipv6 address resolution
Next step is GMainLoop and handling the io channel


Modified: trunk/concordance/setup.py
===================================================================
--- trunk/concordance/setup.py  2009-01-03 03:25:49 UTC (rev 1409)
+++ trunk/concordance/setup.py  2009-01-03 06:09:20 UTC (rev 1410)
@@ -48,6 +48,9 @@
     sources        = ['src/__init__.c',
                       'src/Core.c',
     ],
+    include_dirs   = ['/usr/include/glib-2.0',
+                      '/usr/lib/glib-2.0/include',
+    ],
   )],
   classifiers      = [
     'Development Status :: 1 - Planning',

Modified: trunk/concordance/src/Core.c
===================================================================
--- trunk/concordance/src/Core.c        2009-01-03 03:25:49 UTC (rev 1409)
+++ trunk/concordance/src/Core.c        2009-01-03 06:09:20 UTC (rev 1410)
@@ -20,77 +20,141 @@
 */
 
 #include "Python.h"
+#include "glib.h"
+#include <sys/socket.h>
+#include <netdb.h>
+
 #include "Core.h"
 
-/* 
-
-cdef class Core :                                                         */
+static int opensocket(conSocket sock);
+                                                                          /*\ 
+cdef class Core :                                                         \*/
   static char conCore_Doc[] = "Test";
 
   static PyObject*
-  conCore_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {
-    conCoreObject* self;
+  conCore_new(PyTypeObject* type, PyObject* args, PyObject* kwds) {       /*\
+    cdef :                                                                \*/
+      conCoreObject*    self;
+    /* allocate self */
     self = (conCoreObject*) type->tp_alloc(type, 0);
+
     if (self) {
-      self->attrs = NULL;
-      return (PyObject*) self;
+      self->c2s.sock = -1;
+      self->s2s.sock = -1;
     }
-    return NULL;
+    return (PyObject*) self;
   }
 
+  static int
+  conCore_init(PyObject* s, PyObject* args, PyObject* kwds) {             /*\
+    cdef :                                                                \*/
+      conCoreObject*    self = (conCoreObject*) s;
+      static char*      kwlist[] = {"client", "server", 0};
+
+    /* set defaults for optional arguments */
+    self->c2s.addr = INADDR_ANY;
+    self->c2s.port = 5222;
+    self->s2s.addr = INADDR_ANY;
+    self->s2s.port = 5269;
+
+    /* parse and check arguments */
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|(sH)(sH):Core", kwlist, 
+                                     &self->c2s.addr, &self->c2s.port, 
+                                     &self->s2s.addr, &self->s2s.port))
+      return -1;
+    
+    if (self->c2s.port<0 || self->c2s.port>65535) {
+      PyErr_SetString(PyExc_ValueError, "client port out of range (0-65535)");
+      return -1;
+    }
+
+    if (self->s2s.port<0 || self->s2s.port>65535) {
+      PyErr_SetString(PyExc_ValueError, "server port out of range (0-65535)");
+      return -1;
+    }
+
+    if (!opensocket(self->c2s))
+      return -1;
+
+    if (!opensocket(self->s2s))
+      return -1;
+
+    return 0;
+  }
+
   static void
-  conCore_dealloc(conCoreObject* self) {
-    Py_XDECREF(self->attrs);
+  conCore_dealloc(conCoreObject* self) {                                  /*\
+    cdef :                                                                \*/
+      int ret;
+    if (self->c2s.sock > -1)
+      close(self->c2s.sock);
+    if (self->s2s.sock > -1)
+      close(self->s2s.sock);
     PyObject_Del(self);
   }
 
-  static PyObject* 
-  conCore_getattro(conCoreObject* self, PyObject* name) {
-    if (self->attrs != NULL) {
-      PyObject* v = PyDict_GetItem(self->attrs, name);
-      if (v != NULL) {
-        Py_INCREF(v);
-        return v;
-      }
-    }
-    return PyObject_GenericGetAttr((PyObject* )self, name);
-  }
+  static int opensocket(conSocket sock) {                                 /*\
+    cdef :                                                                \*/
+      int                ret;
+      struct addrinfo*   resinfo = NULL;
+      struct sockaddr_in ipaddr;
+      struct sockaddr*   addr;
+      int                addrsz;
 
-  static PyObject*
-  conCore_setattro(conCoreObject* self, PyObject* name, PyObject* value) {
-    if (self->attrs == NULL) {
-      self->attrs = PyDict_New();
-      if (self->attrs == NULL) {
-        PyErr_SetString(PyExc_AttributeError,
-                        "error creating attribute dict");
-        return NULL;
+    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;
       }
+      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);
     }
-    if (value == NULL) {
-      int rv = PyDict_DelItem(self->attrs, name);
-      if (rv < 0) {
-        PyErr_SetString(PyExc_AttributeError,
-                        "delete non-existing attribute");
-        return NULL;
-      }      
+    ((struct sockaddr_in*) addr)->sin_port = htons(sock.port);
+    if (sock.sock == -1) {
+      PyErr_SetString(PyExc_OSError, "unable to create listening socket");
+      return 0;
     }
-    else
-      return (PyObject*) PyDict_SetItem(self->attrs, name, value);
+    if (bind(sock.sock, addr, addrsz) == -1 ||
+        listen(sock.sock, 16) == -1 ) {
+      PyErr_SetString(PyExc_OSError, "unable to bind listening socket");
+      return 0;
+    }
+    if (resinfo)
+      freeaddrinfo(resinfo);
+/*
+#ifdef MS_WINDOWS
+    sock.chan = g_io_channel_win32_new_socket(sock.sock);
+#else
+    sock.chan = g_io_channel_unix_new(sock.sock);
+#endif
+    g_io_add_watch(sock.chan, G_IO_IN, callback, NULL);
+*/
+    return 1;
   }
 
-  static PyObject*
-  conCore_demo(conCoreObject* self, PyObject* args) {
-    if (!PyArg_ParseTuple(args, ":demo"))
-      return NULL;
-    Py_INCREF(Py_None);
-    return Py_None;
-  }
 
   static PyMethodDef conCore_methods[] = {
-    { "demo",
-      (PyCFunction)conCore_demo,
-      METH_VARARGS,
-      PyDoc_STR("demo() -> None")},
     { NULL, NULL },
   };
 
@@ -112,8 +176,8 @@
     0,                                 /*tp_hash*/
     0,                                 /*tp_call*/
     0,                                 /*tp_str*/
-    (getattrofunc) conCore_getattro,   /*tp_getattro*/
-    (setattrofunc) conCore_setattro,   /*tp_setattro*/
+    PyObject_GenericGetAttr,           /*tp_getattro*/
+    PyObject_GenericSetAttr,           /*tp_setattro*/
     0,                                 /*tp_as_buffer*/
     Py_TPFLAGS_DEFAULT |               /*tp_flags*/ 
     Py_TPFLAGS_BASETYPE,
@@ -132,7 +196,7 @@
     0,                                 /*tp_descr_get*/
     0,                                 /*tp_descr_set*/
     0,                                 /*tp_dictoffset*/
-    0,                                 /*tp_init*/
+    conCore_init,                      /*tp_init*/
     0,                                 /*tp_alloc*/
     conCore_new,                       /*tp_new*/
     0,                                 /*tp_free*/

Modified: trunk/concordance/src/Core.h
===================================================================
--- trunk/concordance/src/Core.h        2009-01-03 03:25:49 UTC (rev 1409)
+++ trunk/concordance/src/Core.h        2009-01-03 06:09:20 UTC (rev 1410)
@@ -23,8 +23,16 @@
 #define CONCORE_H
 
 typedef struct {
+  const gchar* addr;
+  gushort      port;
+  int          sock;
+  GIOChannel*  chan;
+} conSocket;
+
+typedef struct {
   PyObject_HEAD
-  PyObject *attrs;
+  conSocket c2s;
+  conSocket s2s;
 } conCoreObject;
 
 PyTypeObject conCore_Type;

_______________________________________________
PySoy-SVN mailing list
PySoy-SVN@pysoy.org
http://www.pysoy.org/mailman/listinfo/pysoy-svn

Reply via email to