src/tcp_transport.c
branchnew-lib-errors
changeset 219 cefec18b8268
parent 218 5229a5d098b2
equal deleted inserted replaced
218:5229a5d098b2 219:cefec18b8268
     1 #include "tcp_internal.h"
       
     2 #include "sock_internal.h"
       
     3 
       
     4 #include <unistd.h>
       
     5 
       
     6 /*
       
     7  * Our transport_type
       
     8  */
       
     9 const struct transport_type tcp_transport_type = {
       
    10     .base_type = {
       
    11         .parent             = &transport_fd_type.base_type,
       
    12     },
       
    13     .methods                = {
       
    14         .read               = transport_fd__read,
       
    15         .write              = transport_fd__write,
       
    16         .events             = transport_fd__events,
       
    17         .deinit             = transport_fd__deinit,
       
    18     },
       
    19 };
       
    20 
       
    21 void tcp_transport_init (struct tcp_transport *trans, evutil_socket_t sock)
       
    22 {
       
    23     struct event_base *ev_base = _sock_stream_ctx.ev_base;
       
    24 
       
    25     transport_fd_init(&trans->base_fd, ev_base, sock);
       
    26 }
       
    27 
       
    28 err_t tcp_transport_create (struct tcp_transport **trans_ptr, const struct transport_info *info, evutil_socket_t sock, error_t *err)
       
    29 {
       
    30     struct tcp_transport *trans;
       
    31 
       
    32     // alloc
       
    33     if ((trans = calloc(1, sizeof(*trans))) == NULL)
       
    34         JUMP_SET_ERROR(err, ERR_MEM);
       
    35 
       
    36     // init transport
       
    37     transport_init(&trans->base_fd.base, &tcp_transport_type, info);
       
    38 
       
    39     // init ourselves
       
    40     tcp_transport_init(trans, sock);
       
    41 
       
    42     // setup the socket?
       
    43     if (sock >= 0) {
       
    44         // make it non-blocking
       
    45         if ((ERROR_CODE(err) = transport_fd_nonblock(&trans->base_fd, true)))
       
    46             goto error;
       
    47     }
       
    48 
       
    49     // ok
       
    50     *trans_ptr = trans;
       
    51 
       
    52     return SUCCESS;
       
    53 
       
    54 error:
       
    55     // cleanup
       
    56     if (trans)
       
    57         tcp_transport_deinit(trans);
       
    58     else
       
    59         EVUTIL_CLOSESOCKET(sock);
       
    60 
       
    61     return ERROR_CODE(err);
       
    62 }
       
    63 
       
    64 err_t tcp_transport_connected (struct tcp_transport *trans, error_t *err)
       
    65 {
       
    66     // set up for default transport event-based operation
       
    67     if ((ERROR_CODE(err) = transport_fd_defaults(&trans->base_fd)))
       
    68         return ERROR_CODE(err);
       
    69 
       
    70     // ok
       
    71     transport_connected(&trans->base_fd.base, NULL, false);
       
    72 
       
    73     return SUCCESS;
       
    74 }
       
    75 
       
    76 void tcp_transport_deinit (struct tcp_transport *trans)
       
    77 {
       
    78     transport_fd_deinit(&trans->base_fd);
       
    79 }
       
    80 
       
    81 void tcp_transport_destroy (struct tcp_transport *trans)
       
    82 {
       
    83     tcp_transport_deinit(trans);
       
    84 
       
    85     free(trans);
       
    86 }