static PyObject * TCP_func_bind(TCP *self, PyObject *args) { int r; struct sockaddr sa; PyObject *addr; RAISE_IF_HANDLE_NOT_INITIALIZED(self, NULL); RAISE_IF_HANDLE_CLOSED(self, PyExc_HandleClosedError, NULL); if (!PyArg_ParseTuple(args, "O:bind", &addr)) { return NULL; } if (pyuv_parse_addr_tuple(addr, &sa) < 0) { /* Error is set by the function itself */ return NULL; } if (sa.sa_family == AF_INET) { r = uv_tcp_bind(&self->tcp_h, *(struct sockaddr_in *)&sa); } else { r = uv_tcp_bind6(&self->tcp_h, *(struct sockaddr_in6 *)&sa); } if (r != 0) { RAISE_UV_EXCEPTION(UV_HANDLE_LOOP(self), PyExc_TCPError); return NULL; } Py_RETURN_NONE; }
static PyObject * UDP_func_bind(UDP *self, PyObject *args) { int err, flags; struct sockaddr_storage ss; PyObject *addr; RAISE_IF_HANDLE_NOT_INITIALIZED(self, NULL); RAISE_IF_HANDLE_CLOSED(self, PyExc_HandleClosedError, NULL); flags = 0; if (!PyArg_ParseTuple(args, "O|i:bind", &addr, &flags)) { return NULL; } if (pyuv_parse_addr_tuple(addr, &ss) < 0) { /* Error is set by the function itself */ return NULL; } err = uv_udp_bind(&self->udp_h, (struct sockaddr *)&ss, flags); if (err < 0) { RAISE_UV_EXCEPTION(err, PyExc_UDPError); return NULL; } Py_RETURN_NONE; }
static PyObject * TCP_func_connect(TCP *self, PyObject *args) { int r; struct sockaddr sa; uv_connect_t *connect_req = NULL; PyObject *addr, *callback; RAISE_IF_HANDLE_NOT_INITIALIZED(self, NULL); RAISE_IF_HANDLE_CLOSED(self, PyExc_HandleClosedError, NULL); if (!PyArg_ParseTuple(args, "OO:connect", &addr, &callback)) { return NULL; } if (!PyCallable_Check(callback)) { PyErr_SetString(PyExc_TypeError, "a callable is required"); return NULL; } if (pyuv_parse_addr_tuple(addr, &sa) < 0) { /* Error is set by the function itself */ return NULL; } Py_INCREF(callback); connect_req = PyMem_Malloc(sizeof *connect_req); if (!connect_req) { PyErr_NoMemory(); goto error; } connect_req->data = callback; if (sa.sa_family == AF_INET) { r = uv_tcp_connect(connect_req, &self->tcp_h, *(struct sockaddr_in *)&sa, on_tcp_client_connection); } else { r = uv_tcp_connect6(connect_req, &self->tcp_h, *(struct sockaddr_in6 *)&sa, on_tcp_client_connection); } if (r != 0) { RAISE_UV_EXCEPTION(UV_HANDLE_LOOP(self), PyExc_TCPError); goto error; } /* Increase refcount so that object is not removed before the callback is called */ Py_INCREF(self); Py_RETURN_NONE; error: Py_DECREF(callback); PyMem_Free(connect_req); return NULL; }
static PyObject * UDP_func_sendlines(UDP *self, PyObject *args) { int i, err, buf_count; struct sockaddr_storage ss; PyObject *addr, *callback, *seq; Py_buffer *views; uv_buf_t *bufs; udp_send_ctx *ctx; callback = Py_None; ctx = NULL; RAISE_IF_HANDLE_NOT_INITIALIZED(self, NULL); RAISE_IF_HANDLE_CLOSED(self, PyExc_HandleClosedError, NULL); if (!PyArg_ParseTuple(args, "OO|O:sendlines", &addr, &seq, &callback)) { return NULL; } if (callback != Py_None && !PyCallable_Check(callback)) { PyErr_SetString(PyExc_TypeError, "a callable or None is required"); return NULL; } if (pyuv_parse_addr_tuple(addr, &ss) < 0) { /* Error is set by the function itself */ return NULL; } err = pyseq2uvbuf(seq, &views, &bufs, &buf_count); if (err != 0) { /* error is already set */ return NULL; } Py_INCREF(callback); ctx = PyMem_Malloc(sizeof *ctx); if (!ctx) { PyErr_NoMemory(); goto error; } ctx->callback = callback; ctx->view_count = buf_count; ctx->views = views; err = uv_udp_send(&ctx->req, &self->udp_h, bufs, buf_count, (struct sockaddr *)&ss, (uv_udp_send_cb)on_udp_send); /* uv_write copies the uv_buf_t structures, so we can free them now */ PyMem_Free(bufs); bufs = NULL; if (err < 0) { RAISE_UV_EXCEPTION(err, PyExc_UDPError); goto error; } /* Increase refcount so that object is not removed before the callback is called */ Py_INCREF(self); Py_RETURN_NONE; error: Py_DECREF(callback); for (i = 0; i < buf_count; i++) { PyBuffer_Release(&views[i]); } PyMem_Free(views); PyMem_Free(bufs); PyMem_Free(ctx); return NULL; }
static PyObject * UDP_func_send(UDP *self, PyObject *args) { int err; struct sockaddr_storage ss; uv_buf_t buf; Py_buffer *view; PyObject *addr, *callback; udp_send_ctx *ctx; RAISE_IF_HANDLE_NOT_INITIALIZED(self, NULL); RAISE_IF_HANDLE_CLOSED(self, PyExc_HandleClosedError, NULL); callback = Py_None; ctx = PyMem_Malloc(sizeof *ctx); if (!ctx) { PyErr_NoMemory(); return NULL; } view = &ctx->view[0]; if (!PyArg_ParseTuple(args, "O"PYUV_BYTES"*|O:send", &addr, view, &callback)) { PyMem_Free(ctx); return NULL; } if (callback != Py_None && !PyCallable_Check(callback)) { PyErr_SetString(PyExc_TypeError, "a callable or None is required"); goto error; } if (pyuv_parse_addr_tuple(addr, &ss) < 0) { /* Error is set by the function itself */ goto error; } Py_INCREF(callback); buf = uv_buf_init(view->buf, view->len); ctx->callback = callback; ctx->view_count = 1; ctx->views = view; err = uv_udp_send(&ctx->req, &self->udp_h, &buf, 1, (struct sockaddr *)&ss, (uv_udp_send_cb)on_udp_send); if (err < 0) { RAISE_UV_EXCEPTION(err, PyExc_UDPError); Py_DECREF(callback); goto error; } /* Increase refcount so that object is not removed before the callback is called */ Py_INCREF(self); Py_RETURN_NONE; error: PyBuffer_Release(view); PyMem_Free(ctx); return NULL; }