/** * Handler invoked to deliver final status for a connection. This will invoke * the user supplied callback with the relevant status (if it has not been * cancelled) and then free the CONNSTART object. */ static void cs_handler(void *cookie) { lcbio_CONNSTART *cs = cookie; lcb_error_t err; lcbio_SOCKET *s = cs->sock; if (s && cs->event) { cs_unwatch(cs); IOT_V0EV(s->io).destroy(IOT_ARG(s->io), cs->event); } if (cs->state == CS_PENDING) { /* state was not changed since initial scheduling */ err = LCB_ETIMEDOUT; } else if (cs->state == CS_CONNECTED) { /* clear pending error */ err = LCB_SUCCESS; } else { if (s != NULL && cs->pending == LCB_CONNECT_ERROR) { err = lcbio_mklcberr(cs->syserr, s->settings); } else { err = cs->pending; } } if (cs->state == CS_CANCELLED) { /* ignore everything. Clean up resources */ goto GT_DTOR; } if (s) { lcbio__load_socknames(s); if (err == LCB_SUCCESS) { lcb_log(LOGARGS(s, INFO), CSLOGFMT "Connected ", CSLOGID(s)); } else { lcb_log(LOGARGS(s, ERR), CSLOGFMT "Failed: lcb_err=0x%x, os_errno=%u", CSLOGID(s), err, cs->syserr); } } /** Handler section */ cs->in_uhandler = 1; cs->handler(err == LCB_SUCCESS ? s : NULL, cs->arg, err, cs->syserr); GT_DTOR: if (cs->async) { lcbio_timer_destroy(cs->async); } if (cs->sock) { lcbio_unref(cs->sock); } if (cs->ai_root) { freeaddrinfo(cs->ai_root); } free(cs); }
static lcb_error_t convert_lcberr(const lcbio_CTX *ctx, lcbio_IOSTATUS status) { const lcb_settings *settings = ctx->sock->settings; lcbio_OSERR oserr = IOT_ERRNO(ctx->sock->io); if (lcbio_ssl_check(ctx->sock)) { lcb_error_t err = lcbio_ssl_get_error(ctx->sock); if (err) { return err; } } if (status == LCBIO_SHUTDOWN) { return lcbio_mklcberr(0, settings); } else if (oserr != 0) { return lcbio_mklcberr(oserr, settings); } else { return LCB_NETWORK_ERROR; } }
static int C_put_ex(lcbio_CTX *ctx, lcb_IOV *iov, unsigned niov, unsigned nb) { lcbio_TABLE *iot = ctx->io; lcb_sockdata_t *sd = CTX_SD(ctx); int status = IOT_V1(iot).write2(IOT_ARG(iot), sd, iov, niov, (void *)(uintptr_t)nb, Cw_ex_handler); if (status) { /** error! */ lcbio_OSERR saverr = IOT_ERRNO(iot); ctx->procs.cb_flush_done(ctx, nb, nb); lcbio_ctx_senderr(ctx, lcbio_mklcberr(saverr, ctx->sock->settings)); return 0; } else { ctx->npending++; return 1; } }