extern void retry_outgoing(outgoing_t *);
extern void handle_incoming_vpn_data(int, short, void *);
extern void finish_connecting(struct connection_t *);
-extern void do_outgoing_connection(struct connection_t *);
+extern bool do_outgoing_connection(struct connection_t *);
extern void handle_new_meta_connection(int, short, void *);
extern int setup_listen_socket(const sockaddr_t *);
extern int setup_vpn_in_socket(const sockaddr_t *);
send_id(c);
}
-void do_outgoing_connection(connection_t *c) {
+bool do_outgoing_connection(connection_t *c) {
char *address, *port, *space;
int result;
retry_outgoing(c->outgoing);
c->outgoing = NULL;
connection_del(c);
- return;
+ return false;
}
get_config_string(c->outgoing->cfg, &address);
if(result == -1) {
if(sockinprogress(sockerrno)) {
c->status.connecting = true;
- return;
+ return true;
}
closesocket(c->socket);
finish_connecting(c);
- return;
+ return true;
}
static void handle_meta_write(int sock, short events, void *data) {
connection_add(c);
- do_outgoing_connection(c);
-
- event_set(&c->inevent, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c);
- event_set(&c->outevent, c->socket, EV_WRITE | EV_PERSIST, handle_meta_write, c);
- event_add(&c->inevent, NULL);
+ if (do_outgoing_connection(c)) {
+ event_set(&c->inevent, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c);
+ event_set(&c->outevent, c->socket, EV_WRITE | EV_PERSIST, handle_meta_write, c);
+ event_add(&c->inevent, NULL);
+ }
}
/*