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 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); }