status = getaddrinfo(node, /* service = */ NULL,
&ai_hints, &ai_list);
if(status) {
- free(node);
logger(LOG_WARNING, "Error looking up %s port %s: %s",
node, "any", gai_strerror(status));
+ free(node);
return false;
}
assert(ai_list != NULL);
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_t *c = data;
- size_t outlen = write(c->socket, c->outbuf.data + c->outbuf.offset, c->outbuf.len - c->outbuf.offset);
+ ssize_t outlen = send(c->socket, c->outbuf.data + c->outbuf.offset, c->outbuf.len - c->outbuf.offset, 0);
if(outlen <= 0) {
- logger(LOG_ERR, "Onoes, outlen = %zd (%s)", outlen, strerror(errno));
+ logger(LOG_ERR, "Onoes, outlen = %d (%s)", (int)outlen, strerror(errno));
terminate_connection(c, c->status.active);
return;
}
event_del(&c->outevent);
}
-static void handle_meta_connection_error(struct bufferevent *event, short what, void *data) {
- connection_t *c = data;
- logger(LOG_ERR, "handle_meta_connection_error() called: %d: %s", what, strerror(errno));
- terminate_connection(c, c->status.active);
-}
-
void setup_outgoing_connection(outgoing_t *outgoing) {
connection_t *c;
node_t *n;
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);
+ }
}
/*