author | Tero Marttila <terom@fixme.fi> |
Wed, 27 May 2009 23:57:48 +0300 | |
branch | new-lib-errors |
changeset 217 | 7728d6ec3abf |
parent 180 | 22967b165692 |
permissions | -rw-r--r-- |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
1 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
2 |
#include "irc_net_internal.h" |
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:
156
diff
changeset
|
3 |
#include "tcp.h" |
180
22967b165692
rename sock_ssl/sock_gnutls -> ssl/ssl_client
Tero Marttila <terom@fixme.fi>
parents:
177
diff
changeset
|
4 |
#include "ssl.h" |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
5 |
#include "log.h" |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
6 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
7 |
#include <time.h> |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
8 |
#include <assert.h> |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
9 |
|
154
f4472119de3b
initial code towards transport implementation, doesn't compile
Tero Marttila <terom@fixme.fi>
parents:
153
diff
changeset
|
10 |
void irc_net_disconnect (struct irc_net *net) |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
11 |
{ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
12 |
struct irc_chan *chan = NULL; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
13 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
14 |
// mark |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
15 |
net->connected = false; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
16 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
17 |
// destroy connection and set NULL |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
18 |
irc_conn_destroy(net->conn); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
19 |
net->conn = NULL; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
20 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
21 |
// update channel state |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
22 |
TAILQ_FOREACH(chan, &net->channels, net_channels) { |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
23 |
// XXX: notify channel somehow |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
24 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
25 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
26 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
27 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
28 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
29 |
/** |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
30 |
* We have succesfully established a connection to our server with the given transport, so create the irc_conn and bind |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
31 |
* it to us. |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
32 |
* |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
33 |
* If this fails, this will clean up any partial state, including \a transport. |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
34 |
*/ |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
35 |
static err_t irc_net_connected (struct irc_net *net, transport_t *transport, struct error_info *err) |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
36 |
{ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
37 |
// mark state |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
38 |
net->connecting = false; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
39 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
40 |
// create the irc connection state |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
41 |
if (irc_conn_create(&net->conn, transport, &irc_net_conn_callbacks, net, err)) |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
42 |
goto error; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
43 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
44 |
// add our command handlers |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
45 |
if ((ERROR_CODE(err) = irc_conn_add_cmd_handlers (net->conn, irc_net_cmd_handlers, net))) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
46 |
goto error; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
47 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
48 |
// register |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
49 |
if ((ERROR_CODE(err) = irc_conn_register(net->conn, &net->info.register_info))) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
50 |
goto error; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
51 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
52 |
// great, we're alive now |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
53 |
net->connected = true; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
54 |
net->connected_ts = time(NULL); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
55 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
56 |
return SUCCESS; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
57 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
58 |
error: |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
59 |
if (!net->conn) { |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
60 |
// cleanup transport ourselves |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
61 |
transport_destroy(transport); |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
62 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
63 |
} else { |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
64 |
// cleanup the partial stuff |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
65 |
irc_conn_destroy(net->conn); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
66 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
67 |
net->conn = NULL; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
68 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
69 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
70 |
return ERROR_CODE(err); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
71 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
72 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
73 |
/** |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
74 |
* Our sock_*_connect_async callback. If the connect ended up failing, then try and reconnect later. Otherwise, do |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
75 |
* irc_net_connected(). |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
76 |
*/ |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
77 |
static void irc_net_on_connect (transport_t *transport, void *arg) |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
78 |
{ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
79 |
struct irc_net *net = arg; |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
80 |
error_t err; |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
81 |
|
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
82 |
// yay |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
83 |
if (irc_net_connected(net, transport, &err)) |
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:
156
diff
changeset
|
84 |
log_error(&err, "irc_net_connected"); |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
85 |
} |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
86 |
|
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
87 |
static void irc_net_on_connect_error (transport_t *transport, const error_t *conn_err, void *arg) |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
88 |
{ |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
89 |
struct irc_net *net = arg; |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
90 |
error_t err; |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
91 |
|
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
92 |
// clean up |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
93 |
transport_destroy(transport); |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
94 |
|
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
95 |
// attempt reconnect later |
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:
156
diff
changeset
|
96 |
log_error(conn_err, "connect failed"); |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
97 |
|
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
98 |
if (irc_net_connect(net, false, &err)) |
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:
156
diff
changeset
|
99 |
log_error(&err, "unable to reconnect"); |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
100 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
101 |
|
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
102 |
static const struct transport_callbacks irc_net_transport_callbacks = { |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
103 |
.on_connect = irc_net_on_connect, |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
104 |
.on_error = irc_net_on_connect_error, |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
105 |
}; |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
106 |
|
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
107 |
/** |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
108 |
* The low-level connect() implementation, connects based on irc_net::info, calling irc_net_connected/irc_net_reconnect |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
109 |
* later if this succeeds. |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
110 |
*/ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
111 |
static err_t irc_net_do_connect (struct irc_net *net, struct error_info *err) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
112 |
{ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
113 |
struct irc_net_info *info = &net->info; |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
114 |
struct transport_info transport_info = { &irc_net_transport_callbacks, net, TRANSPORT_READ | TRANSPORT_WRITE }; |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
115 |
transport_t *transport = NULL; |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
116 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
117 |
// sanity check |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
118 |
assert(!net->connecting && !net->connected); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
119 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
120 |
// connect based on what's known |
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
121 |
if (info->transport) { |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
122 |
log_debug("connected using raw transport: %p", info->transport); |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
123 |
|
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
124 |
// direct transport connection |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
125 |
transport = info->transport; |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
126 |
|
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
127 |
// invalidate it from info since it will get destroyed later |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
128 |
info->transport = NULL; |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
129 |
|
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
130 |
// then create the transport right away |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
131 |
if (irc_net_connected(net, transport, err)) |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
132 |
goto error; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
133 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
134 |
} else if (info->ssl_cred) { |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
135 |
// aquire a ref |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
136 |
// NOTE: before any error handling |
180
22967b165692
rename sock_ssl/sock_gnutls -> ssl/ssl_client
Tero Marttila <terom@fixme.fi>
parents:
177
diff
changeset
|
137 |
ssl_client_cred_get(info->ssl_cred); |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
138 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
139 |
log_debug("connecting to [%s]:%s using SSL", info->hostname, info->service); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
140 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
141 |
// connect |
180
22967b165692
rename sock_ssl/sock_gnutls -> ssl/ssl_client
Tero Marttila <terom@fixme.fi>
parents:
177
diff
changeset
|
142 |
if (ssl_connect(&transport_info, &transport, info->hostname, info->service, info->ssl_cred, err)) |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
143 |
goto error; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
144 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
145 |
net->connecting = true; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
146 |
|
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
147 |
} else if (info->hostname || info->service) { |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
148 |
log_debug("connecting to [%s]:%s", info->hostname, info->service); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
149 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
150 |
// begin async connect |
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:
156
diff
changeset
|
151 |
if (tcp_connect(&transport_info, &transport, info->hostname, info->service, err)) |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
152 |
goto error; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
153 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
154 |
net->connecting = true; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
155 |
|
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
156 |
} else { |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
157 |
RETURN_SET_ERROR_STR(err, ERR_MISC, "no connection info specified"); |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
158 |
|
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
159 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
160 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
161 |
return SUCCESS; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
162 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
163 |
error: |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
164 |
return ERROR_CODE(err); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
165 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
166 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
167 |
/** |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
168 |
* Reconnect timer callback |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
169 |
*/ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
170 |
static void irc_net_reconnect_timer_cb (int fd, short what, void *arg) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
171 |
{ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
172 |
struct irc_net *net = arg; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
173 |
struct error_info err; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
174 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
175 |
(void) fd; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
176 |
(void) what; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
177 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
178 |
// execute it? |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
179 |
if (irc_net_connect(net, true, &err)) |
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:
156
diff
changeset
|
180 |
log_error(&err, "unable to reconnect"); |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
181 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
182 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
183 |
/** |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
184 |
* Schedule a reconnection attempt in IRC_NET_RECONNECT_INTERVAL. |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
185 |
*/ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
186 |
static err_t irc_net_schedule_reconnect (struct irc_net *net, struct error_info *err) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
187 |
{ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
188 |
// ...for x seconds |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
189 |
struct timeval tv = { IRC_NET_RECONNECT_INTERVAL, 0 }; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
190 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
191 |
// schedule |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
192 |
if (event_add(net->reconnect_timer, &tv)) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
193 |
return SET_ERROR(err, ERR_EVENT_ADD); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
194 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
195 |
// oke |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
196 |
return SUCCESS; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
197 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
198 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
199 |
err_t irc_net_connect (struct irc_net *net, bool now, struct error_info *err) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
200 |
{ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
201 |
// attempt to reconnect now? |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
202 |
if (now) { |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
203 |
if (irc_net_do_connect(net, err)) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
204 |
// log error and continue below with schedule_reconnect |
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:
156
diff
changeset
|
205 |
log_error(err, "reconnect failed"); |
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
206 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
207 |
else |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
208 |
// connecting, done |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
209 |
return SUCCESS; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
210 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
211 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
212 |
// schedule for later |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
213 |
if (irc_net_schedule_reconnect(net, err)) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
214 |
goto error; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
215 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
216 |
// ok |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
217 |
return SUCCESS; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
218 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
219 |
error: |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
220 |
return ERROR_CODE(err); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
221 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
222 |
|
156
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
223 |
// XXX: to get the ev_base |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
224 |
#include "sock_internal.h" |
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
225 |
|
6534a4ac957b
add transport/sock/line_proto/etc code compiles
Tero Marttila <terom@fixme.fi>
parents:
154
diff
changeset
|
226 |
|
153
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
227 |
err_t irc_net_connect_init (struct irc_net *net, struct error_info *err) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
228 |
{ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
229 |
// look up the ev_base |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
230 |
struct event_base *ev_base = _sock_stream_ctx.ev_base; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
231 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
232 |
// reconnect timer |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
233 |
if ((net->reconnect_timer = evtimer_new(ev_base, irc_net_reconnect_timer_cb, net)) == NULL) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
234 |
return SET_ERROR(err, ERR_EVENT_NEW); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
235 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
236 |
// ok |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
237 |
return SUCCESS; |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
238 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
239 |
|
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
240 |
void irc_net_connect_destroy (struct irc_net *net) |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
241 |
{ |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
242 |
event_free(net->reconnect_timer); |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
243 |
} |
d35e7cb3a489
implement irc_net reconnect, requires testing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
244 |