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 } |
|