/****************************************************************************** ****************************************************************************** ** Socket Functions ** ****************************************************************************** ******************************************************************************/ static lcb_sockdata_t *create_socket(lcb_io_opt_t iobase, int domain, int type, int protocol) { my_sockdata_t *ret; my_iops_t *io = (my_iops_t *)iobase; ret = calloc(1, sizeof(*ret)); if (!ret) { return NULL; } uv_tcp_init(io->loop, &ret->tcp.t); incref_iops(io); incref_sock(ret); set_last_error(io, 0); (void)domain; (void)type; (void)protocol; return (lcb_sockdata_t *)ret; }
static int start_write(lcb_io_opt_t iobase, lcb_sockdata_t *sockbase, lcb_io_writebuf_t *wbufbase, lcb_io_write_cb callback) { my_sockdata_t *sock = (my_sockdata_t *)sockbase; my_iops_t *io = (my_iops_t *)iobase; my_writebuf_t *wbuf = (my_writebuf_t *)wbufbase; int ii; int ret; wbuf->sock = sock; wbuf->write.callback = callback; for (ii = 0; ii < 2; ii++) { wbuf->uvbuf[ii].base = wbuf->base.buffer.iov[ii].iov_base; wbuf->uvbuf[ii].len = (lcb_uvbuf_len_t)wbuf->base.buffer.iov[ii].iov_len; } ret = uv_write(&wbuf->write.w, (uv_stream_t *)&sock->tcp, wbuf->uvbuf, 2, write_callback); set_last_error(io, ret); if (ret == 0) { incref_sock(sock); SOCK_INCR_PENDING(sock, write); } return ret; }
static int start_connect(lcb_io_opt_t iobase, lcb_sockdata_t *sockbase, const struct sockaddr *name, unsigned int namelen, lcb_io_connect_cb callback) { my_sockdata_t *sock = (my_sockdata_t *)sockbase; my_iops_t *io = (my_iops_t *)iobase; my_uvreq_t *uvr; int ret; int err_is_set = 0; uvr = alloc_uvreq(sock, (generic_callback_t)callback); if (!uvr) { return -1; } if (namelen == sizeof(struct sockaddr_in)) { ret = UVC_TCP_CONNECT(&uvr->uvreq.conn, &sock->tcp.t, name, connect_callback); } else if (namelen == sizeof(struct sockaddr_in6)) { ret = UVC_TCP_CONNECT6(&uvr->uvreq.conn, &sock->tcp.t, name, connect_callback); } else { io->base.v.v1.error = EINVAL; ret = -1; err_is_set = 1; } if (ret) { if (!err_is_set) { set_last_error(io, ret); } free(uvr); } else { incref_sock(sock); } return ret; }
static int start_read(lcb_io_opt_t iobase, lcb_sockdata_t *sockbase, lcb_io_read_cb callback) { my_sockdata_t *sock = (my_sockdata_t *)sockbase; my_iops_t *io = (my_iops_t *)iobase; int ret; sock->cur_iov = 0; sock->tcp.callback = callback; ret = uv_read_start((uv_stream_t *)&sock->tcp.t, alloc_cb, read_cb); set_last_error(io, ret); if (ret == 0) { SOCK_INCR_PENDING(sock, read); incref_sock(sock); } return ret; }
static void send_error(lcb_io_opt_t iobase, lcb_sockdata_t *sockbase, lcb_io_error_cb callback) { my_sockdata_t *sock = (my_sockdata_t *)sockbase; my_iops_t *io = (my_iops_t *)iobase; my_uvreq_t *uvr; if (!sock) { return; } uvr = alloc_uvreq(sock, (generic_callback_t)callback); if (!uvr) { return; } uv_idle_init(io->loop, &uvr->uvreq.idle); uv_idle_start(&uvr->uvreq.idle, err_idle_cb); incref_sock(sock); }
static int start_read(lcb_io_opt_t iobase, lcb_sockdata_t *sockbase, lcb_IOV *iov, lcb_size_t niov, void *uarg, lcb_ioC_read2_callback callback) { my_sockdata_t *sock = (my_sockdata_t *)sockbase; my_iops_t *io = (my_iops_t *)iobase; int ret; sock->iov = *iov; sock->rdarg = uarg; sock->tcp.callback = callback; ret = uv_read_start((uv_stream_t *)&sock->tcp.t, alloc_cb, read_cb); set_last_error(io, ret); if (ret == 0) { SOCK_INCR_PENDING(sock, read); incref_sock(sock); } return ret; }