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