terom@177: #include "tcp_internal.h" terom@177: #include "sock_internal.h" terom@177: terom@177: #include terom@177: terom@177: /* terom@177: * Our transport_type terom@177: */ terom@177: const struct transport_type tcp_transport_type = { terom@177: .base_type = { terom@177: .parent = &transport_fd_type.base_type, terom@177: }, terom@177: .methods = { terom@177: .read = transport_fd__read, terom@177: .write = transport_fd__write, terom@177: .events = transport_fd__events, terom@177: .deinit = transport_fd__deinit, terom@177: }, terom@177: }; terom@177: terom@177: void tcp_transport_init (struct tcp_transport *trans, evutil_socket_t sock) terom@177: { terom@177: struct event_base *ev_base = _sock_stream_ctx.ev_base; terom@177: terom@177: transport_fd_init(&trans->base_fd, ev_base, sock); terom@177: } terom@177: terom@177: err_t tcp_transport_create (struct tcp_transport **trans_ptr, const struct transport_info *info, evutil_socket_t sock, error_t *err) terom@177: { terom@177: struct tcp_transport *trans; terom@177: terom@177: // alloc terom@177: if ((trans = calloc(1, sizeof(*trans))) == NULL) terom@177: JUMP_SET_ERROR(err, ERR_MEM); terom@177: terom@177: // init transport terom@177: transport_init(&trans->base_fd.base, &tcp_transport_type, info); terom@177: terom@177: // init ourselves terom@177: tcp_transport_init(trans, sock); terom@177: terom@177: // setup the socket? terom@177: if (sock >= 0) { terom@177: // make it non-blocking terom@177: if ((ERROR_CODE(err) = transport_fd_nonblock(&trans->base_fd, true))) terom@177: goto error; terom@177: } terom@177: terom@177: // ok terom@177: *trans_ptr = trans; terom@177: terom@177: return SUCCESS; terom@177: terom@177: error: terom@177: // cleanup terom@177: if (trans) terom@177: tcp_transport_deinit(trans); terom@177: else terom@177: EVUTIL_CLOSESOCKET(sock); terom@177: terom@177: return ERROR_CODE(err); terom@177: } terom@177: terom@177: err_t tcp_transport_connected (struct tcp_transport *trans, error_t *err) terom@177: { terom@177: // set up for default transport event-based operation terom@177: if ((ERROR_CODE(err) = transport_fd_defaults(&trans->base_fd))) terom@177: return ERROR_CODE(err); terom@177: terom@177: // ok terom@177: transport_connected(&trans->base_fd.base, NULL, false); terom@177: terom@177: return SUCCESS; terom@177: } terom@177: terom@177: void tcp_transport_deinit (struct tcp_transport *trans) terom@177: { terom@177: transport_fd_deinit(&trans->base_fd); terom@177: } terom@177: terom@177: void tcp_transport_destroy (struct tcp_transport *trans) terom@177: { terom@177: tcp_transport_deinit(trans); terom@177: terom@177: free(trans); terom@177: }