int aio_socket_connect(aio_socket_t socket, const struct sockaddr *addr, socklen_t addrlen, aio_onconnect proc, void* param) { int r = -1; struct kqueue_context* ctx = (struct kqueue_context*)socket; assert(0 == ctx->ev[1].filter); if(ctx->ev[1].filter) return EBUSY; ctx->out.connect.addrlen = addrlen > sizeof(ctx->out.connect.addr) ? sizeof(ctx->out.connect.addr) : addrlen; memcpy(&ctx->out.connect.addr, addr, ctx->out.connect.addrlen); ctx->out.connect.proc = proc; ctx->out.connect.param = param; //r = kqueue_connect(ctx, 0, 0); addrlen = sizeof(ctx->out.connect.addr); r = connect(ctx->socket, (const struct sockaddr*)&ctx->out.connect.addr, ctx->out.connect.addrlen); if(0 == r) { // man 2 connect to see more(ERRORS: EINPROGRESS) addrlen = sizeof(r); if(0 == getsockopt(ctx->socket, SOL_SOCKET, SO_ERROR, (void*)&r, &addrlen) && 0 == r) ctx->out.connect.proc(ctx->out.connect.param, r); return r; } if(EINPROGRESS == errno) { KQueueWrite(ctx, kqueue_connect); } return 0 == r ? 0 : errno; }
int aio_socket_connect(aio_socket_t socket, const char* ip, int port, aio_onconnect proc, void* param) { int r = -1; socklen_t addrlen; struct kqueue_context* ctx = (struct kqueue_context*)socket; assert(0 == ctx->ev[1].filter); if(ctx->ev[1].filter) return EBUSY; ctx->out.connect.addr.sin_family = AF_INET; ctx->out.connect.addr.sin_port = htons(port); ctx->out.connect.addr.sin_addr.s_addr = inet_addr(ip); ctx->out.connect.proc = proc; ctx->out.connect.param = param; //r = kqueue_connect(ctx, 0, 0); addrlen = sizeof(ctx->out.connect.addr); r = connect(ctx->socket, (const struct sockaddr*)&ctx->out.connect.addr, addrlen); if(0 == r) { // man 2 connect to see more(ERRORS: EINPROGRESS) addrlen = sizeof(r); if(0 == getsockopt(ctx->socket, SOL_SOCKET, SO_ERROR, (void*)&r, &addrlen) && 0 == r) ctx->out.connect.proc(ctx->out.connect.param, r); return r; } if(EINPROGRESS == errno) { KQueueWrite(ctx, kqueue_connect); } return 0 == r ? 0 : errno; }
int aio_socket_send_v(aio_socket_t socket, socket_bufvec_t* vec, int n, aio_onsend proc, void* param) { int r = -1; struct kqueue_context* ctx = (struct kqueue_context*)socket; assert(0 == ctx->ev[1].filter); if(ctx->ev[1].filter) return EBUSY; ctx->out.send_v.proc = proc; ctx->out.send_v.param = param; ctx->out.send_v.vec = vec; ctx->out.send_v.n = n; // r = kqueue_send_v(ctx, 0, 0); // if(EAGAIN == r) { KQueueWrite(ctx, kqueue_send_v); } return 0 == r ? 0 : errno; }
int aio_socket_send(aio_socket_t socket, const void* buffer, size_t bytes, aio_onsend proc, void* param) { int r = -1; struct kqueue_context* ctx = (struct kqueue_context*)socket; assert(0 == ctx->ev[1].filter); if(ctx->ev[1].filter) return EBUSY; ctx->out.send.proc = proc; ctx->out.send.param = param; ctx->out.send.buffer = buffer; ctx->out.send.bytes = bytes; // r = kqueue_send(ctx, 0, 0); // if(EAGAIN == r) { KQueueWrite(ctx, kqueue_send); } return 0 == r ? 0 : errno; }
int aio_socket_sendto_v(aio_socket_t socket, const struct sockaddr *addr, socklen_t addrlen, socket_bufvec_t* vec, int n, aio_onsend proc, void* param) { int r = -1; struct kqueue_context* ctx = (struct kqueue_context*)socket; assert(0 == ctx->ev[1].filter); if(ctx->ev[1].filter) return EBUSY; ctx->out.send_v.addrlen = addrlen > sizeof(ctx->out.send_v.addr) ? sizeof(ctx->out.send_v.addr) : addrlen; memcpy(&ctx->out.send_v.addr, addr, ctx->out.send_v.addrlen); ctx->out.send_v.proc = proc; ctx->out.send_v.param = param; ctx->out.send_v.vec = vec; ctx->out.send_v.n = n; // r = kqueue_sendto_v(ctx, 0, 0); // if(EAGAIN == r) { KQueueWrite(ctx, kqueue_sendto_v); } return 0 == r ? 0 : errno; }
int aio_socket_sendto(aio_socket_t socket, const struct sockaddr *addr, socklen_t addrlen, const void* buffer, size_t bytes, aio_onsend proc, void* param) { int r = -1; struct kqueue_context* ctx = (struct kqueue_context*)socket; assert(0 == ctx->ev[1].filter); if(ctx->ev[1].filter) return EBUSY; ctx->out.send.addrlen = addrlen > sizeof(ctx->out.send.addr) ? sizeof(ctx->out.send.addr) : addrlen; memcpy(&ctx->out.send.addr, addr, ctx->out.send.addrlen); ctx->out.send.proc = proc; ctx->out.send.param = param; ctx->out.send.buffer = buffer; ctx->out.send.bytes = bytes; // r = kqueue_sendto(ctx, 0, 0); // if(EAGAIN == r) { KQueueWrite(ctx, kqueue_sendto); } return 0 == r ? 0 : errno; }
int aio_socket_sendto_v(aio_socket_t socket, const char* ip, int port, socket_bufvec_t* vec, int n, aio_onsend proc, void* param) { int r = -1; struct kqueue_context* ctx = (struct kqueue_context*)socket; assert(0 == ctx->ev[1].filter); if(ctx->ev[1].filter) return EBUSY; ctx->out.send_v.addr.sin_family = AF_INET; ctx->out.send_v.addr.sin_port = htons(port); ctx->out.send_v.addr.sin_addr.s_addr = inet_addr(ip); ctx->out.send_v.proc = proc; ctx->out.send_v.param = param; ctx->out.send_v.vec = vec; ctx->out.send_v.n = n; // r = kqueue_sendto_v(ctx, 0, 0); // if(EAGAIN == r) { KQueueWrite(ctx, kqueue_sendto_v); } return 0 == r ? 0 : errno; }
int aio_socket_sendto(aio_socket_t socket, const char* ip, int port, const void* buffer, size_t bytes, aio_onsend proc, void* param) { int r = -1; struct kqueue_context* ctx = (struct kqueue_context*)socket; assert(0 == ctx->ev[1].filter); if(ctx->ev[1].filter) return EBUSY; ctx->out.send.addr.sin_family = AF_INET; ctx->out.send.addr.sin_port = htons(port); ctx->out.send.addr.sin_addr.s_addr = inet_addr(ip); ctx->out.send.proc = proc; ctx->out.send.param = param; ctx->out.send.buffer = buffer; ctx->out.send.bytes = bytes; // r = kqueue_sendto(ctx, 0, 0); // if(EAGAIN == r) { KQueueWrite(ctx, kqueue_sendto); } return 0 == r ? 0 : errno; }