#include #include #include #include #include #include "fail.h" void lx__fail(LX_CONN *xc, const char *fmt, ...) { char *msg; va_list ap; int msglen; void (*done)(void *, LX_OPEN_STATUS); void *donearg; if (xc->flags & XCF_FAIL) return; xc->flags |= XCF_FAIL; va_start(ap,fmt); msglen = vasprintf(&msg,fmt,ap); va_end(ap); if (msglen < 0) msg = lx__no_mem_err; if (xc->fd >= 0) { close(xc->fd); xc->fd = -1; } if (xc->pid != AIO_NOID) { aio_remove_poll(xc->pid); xc->pid = AIO_NOID; } if (xc->os) { if (xc->os->errp) *xc->os->errp = msg; done = xc->os->done; donearg = xc->os->donearg; if (xc->os->ai0) { freeaddrinfo(xc->os->ai0); xc->os->ai0 = 0; } if (xc->os->ihdata) { free(xc->os->ihdata); xc->os->ihdata = 0; } lx__str_list_flush(&xc->os->errlist); } else { done = 0; } (*done)(donearg,LX_OPENSTATUS_failed); }