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