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_client.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 "log.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 |
/* |
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 |
* Our transport 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
|
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 |
static void tcp_client__deinit (transport_t *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
|
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 |
struct tcp_client *client = transport_check(transport, &tcp_client_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 |
|
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 |
// proxy |
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 |
tcp_client_deinit(client); |
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 |
} |
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 |
|
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 |
/* |
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 |
* 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
|
17 |
*/ |
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 |
const struct transport_type tcp_client_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
|
19 |
.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
|
20 |
.parent = &tcp_transport_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
|
21 |
}, |
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 |
.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
|
23 |
.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
|
24 |
.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
|
25 |
.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
|
26 |
.deinit = tcp_client__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
|
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 |
}; |
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 |
/* |
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 |
* Forward-declare |
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 |
*/ |
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 |
static void tcp_client_on_connect (struct transport_fd *fd, short what, void *arg); |
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 |
|
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 |
* Function implementations |
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 |
*/ |
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 |
void tcp_client_init (struct tcp_client *client) |
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 |
{ |
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(&client->base_trans, -1); |
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 |
resolve_result_init(&client->rr); |
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 |
} |
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 |
|
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 |
/* |
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 |
* Start connecting to the given address in a non-blocking fashion. Returns any errors that immediately crop up, |
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 |
* otherwise eventually calls tcp_client_connect_done(). |
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 |
static err_t tcp_client_connect_addr (struct tcp_client *client, struct addrinfo *addr, 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
|
50 |
{ |
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 |
struct transport_fd *_fd = &client->base_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
|
52 |
int ret; |
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 |
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
|
54 |
err_t tmp; |
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 |
|
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 |
// first, create 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
|
57 |
if ((sock = tcp_sock_create(addr, err)) < 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
|
58 |
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
|
59 |
|
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 |
// set it as our 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
|
61 |
if ((ERROR_CODE(err) = transport_fd_set(_fd, 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
|
62 |
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
|
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 |
// then, set it up as nonblocking |
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 |
if ((ERROR_CODE(err) = transport_fd_nonblock(_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
|
66 |
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
|
67 |
|
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 |
// then, initiate the connect |
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 |
if ((ret = connect(sock, addr->ai_addr, addr->ai_addrlen)) < 0 && errno != EINPROGRESS) |
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 |
JUMP_SET_ERROR_ERRNO(err, ERR_CONNECT); |
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 |
|
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 |
if (ret < 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
|
73 |
// ok, connect started, setup our completion callback |
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 |
if ((ERROR_CODE(err) = transport_fd_setup(_fd, tcp_client_on_connect, client))) |
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 |
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
|
76 |
|
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 |
// enable for 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
|
78 |
if ((ERROR_CODE(err) = transport_fd_enable(_fd, TRANSPORT_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
|
79 |
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
|
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 |
} 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
|
82 |
// oops... blocking connect - fail to avoid confusion |
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 |
// XXX: come up with a better error name to use |
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 |
// XXX: support non-async connects as well |
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 |
JUMP_SET_ERROR_EXTRA(err, ERR_CONNECT, EINPROGRESS); |
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 |
} |
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
|
87 |
|
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
|
88 |
// 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
|
89 |
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
|
90 |
|
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
|
91 |
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
|
92 |
// close the stuff we did open |
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
|
93 |
if ((tmp = transport_fd_close(_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
|
94 |
log_warn("error closing socket after connect error: %s", error_name(tmp)); |
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
|
95 |
|
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
|
96 |
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
|
97 |
} |
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
|
98 |
|
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
|
99 |
|
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
|
100 |
/* |
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
|
101 |
* Attempt to connect to the next addrinfo, or the next one, if that fails, etc. |
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
|
102 |
* |
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
|
103 |
* This does not call transport_connected(). |
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
|
104 |
*/ |
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
|
105 |
static err_t tcp_client_connect_continue (struct tcp_client *client, 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
|
106 |
{ |
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
|
107 |
struct addrinfo *addr; |
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
|
108 |
|
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
|
109 |
// try and connect to each one until we find one that works |
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
|
110 |
while ((addr = resolve_result_next(&client->rr))) { |
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
|
111 |
// attempt to start connect |
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
|
112 |
if (tcp_client_connect_addr(client, addr, err) == 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
|
113 |
break; |
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
|
114 |
|
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
|
115 |
// log a warning on the failed connect |
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
|
116 |
log_warn_error(err, "%s", resolve_addr_text(addr)); |
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
|
117 |
} |
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
|
118 |
|
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
|
119 |
|
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
|
120 |
if (addr) |
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
|
121 |
// we succesfully did a tcp_client_connect_addr on valid address |
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
|
122 |
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
|
123 |
|
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
|
124 |
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
|
125 |
// all of the connect_async_addr's failed, return the last 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
|
126 |
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
|
127 |
} |
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
|
128 |
|
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
|
129 |
/* |
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
|
130 |
* Cleanup our resolver state and any connect callbacks after a connect |
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
|
131 |
*/ |
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
|
132 |
static void tcp_client_connect_cleanup (struct tcp_client *client) |
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
|
133 |
{ |
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
|
134 |
// drop the resolver stuff |
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
|
135 |
resolve_result_deinit(&client->rr); |
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
|
136 |
|
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
|
137 |
// remove our event handler |
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
|
138 |
transport_fd_clear(&client->base_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
|
139 |
} |
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
|
140 |
|
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
|
141 |
/* |
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
|
142 |
* Our async connect operation has completed, clean up, set up state for event-based operation with user callbacks, and |
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
|
143 |
* invoke transport_connected(). |
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
|
144 |
* |
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
|
145 |
* The given \a err should be NULL for successful completion, or the error for failures. |
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
|
146 |
*/ |
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
|
147 |
static void tcp_client_connect_done (struct tcp_client *client, error_t *conn_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
|
148 |
{ |
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
|
149 |
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
|
150 |
|
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
|
151 |
// 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
|
152 |
tcp_client_connect_cleanup(client); |
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
|
153 |
|
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
|
154 |
if (conn_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
|
155 |
JUMP_SET_ERROR_INFO(&err, conn_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
|
156 |
|
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
|
157 |
// let the transport handle the rest |
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
|
158 |
if (tcp_transport_connected(&client->base_trans, &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
|
159 |
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
|
160 |
|
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
|
161 |
// 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
|
162 |
return; |
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
|
163 |
|
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
|
164 |
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
|
165 |
// pass the error on to 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
|
166 |
transport_connected(&client->base_trans.base_fd.base, &err, 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
|
167 |
} |
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
|
168 |
|
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
|
169 |
/* |
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
|
170 |
* Our async connect callback |
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
|
171 |
*/ |
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
|
172 |
static void tcp_client_on_connect (struct transport_fd *fd, short what, void *arg) |
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
|
173 |
{ |
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
|
174 |
struct tcp_client *client = arg; |
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
|
175 |
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
|
176 |
err_t tmp; |
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
|
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
|
178 |
// XXX: timeouts |
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
|
179 |
(void) what; |
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
|
180 |
|
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
|
181 |
// read socket error code |
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
|
182 |
if (tcp_sock_error(client->base_trans.base_fd.fd, &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
|
183 |
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
|
184 |
|
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
|
185 |
// did the connect fail? |
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
|
186 |
if (ERROR_EXTRA(&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
|
187 |
JUMP_SET_ERROR(&err, ERR_CONNECT); |
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
|
188 |
|
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
|
189 |
// done, 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
|
190 |
return tcp_client_connect_done(client, 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
|
191 |
|
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
|
192 |
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
|
193 |
// close 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
|
194 |
if ((tmp = transport_fd_close(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
|
195 |
log_warn("error closing socket after connect error: %s", error_name(tmp)); |
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
|
196 |
|
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
|
197 |
// log a warning |
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
|
198 |
log_warn_error(&err, "connect to %s failed", "???"); |
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
|
199 |
|
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
|
200 |
// try the next one or fail completely |
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
|
201 |
if (tcp_client_connect_continue(client, &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
|
202 |
tcp_client_connect_done(client, &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
|
203 |
} |
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
|
204 |
|
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
|
205 |
err_t tcp_client_connect_async (struct tcp_client *client, const char *hostname, const char *service, 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
|
206 |
{ |
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
|
207 |
// do the resolving |
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
|
208 |
if (resolve_addr(&client->rr, hostname, service, SOCK_STREAM, 0, 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
|
209 |
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
|
210 |
|
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
|
211 |
// start connecting with the first result |
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
|
212 |
if (tcp_client_connect_continue(client, 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
|
213 |
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
|
214 |
|
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
|
215 |
// 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
|
216 |
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
|
217 |
|
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
|
218 |
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
|
219 |
// 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
|
220 |
resolve_result_deinit(&client->rr); |
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
|
221 |
|
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
|
222 |
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
|
223 |
} |
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
|
224 |
|
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
|
225 |
void tcp_client_deinit (struct tcp_client *client) |
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
|
226 |
{ |
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
|
227 |
// cleanup our stuff |
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
|
228 |
resolve_result_deinit(&client->rr); |
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
|
229 |
|
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
|
230 |
// deinit lower 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
|
231 |
tcp_transport_deinit(&client->base_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
|
232 |
} |
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
|
233 |
|
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
|
234 |
/* |
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
|
235 |
* Deinit and free, not using the transport interface |
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
|
236 |
*/ |
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
|
237 |
static void tcp_client_destroy (struct tcp_client *client) |
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
|
238 |
{ |
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
|
239 |
tcp_client_deinit(client); |
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
|
240 |
|
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
|
241 |
free(client); |
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
|
242 |
} |
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
|
243 |
|
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
|
244 |
/* |
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
|
245 |
* Public interface |
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
|
246 |
*/ |
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
|
247 |
err_t tcp_connect (const struct transport_info *info, transport_t **transport_ptr, |
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
|
248 |
const char *host, const char *service, 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
|
249 |
{ |
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
|
250 |
struct tcp_client *client; |
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
|
251 |
|
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
|
252 |
// 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
|
253 |
if ((client = calloc(1, sizeof(*client))) == 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
|
254 |
return ERR_CALLOC; |
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
|
255 |
|
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
|
256 |
// 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
|
257 |
transport_init(&client->base_trans.base_fd.base, &tcp_client_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
|
258 |
|
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
|
259 |
// init our state |
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
|
260 |
tcp_client_init(client); |
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
|
261 |
|
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
|
262 |
// begin connect |
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
|
263 |
if (tcp_client_connect_async(client, host, service, 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
|
264 |
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
|
265 |
|
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
|
266 |
// good |
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
|
267 |
*transport_ptr = &client->base_trans.base_fd.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
|
268 |
|
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
|
269 |
return 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
|
270 |
|
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
|
271 |
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
|
272 |
// 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
|
273 |
tcp_client_destroy(client); |
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
|
274 |
|
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
|
275 |
// return error code |
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
|
276 |
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
|
277 |
} |
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
|
278 |