Pass hostname in connector's success callback

This commit is contained in:
Přemysl Eric Janouch 2015-12-09 00:57:45 +01:00
parent f6d74544f8
commit 80815519b3
1 changed files with 17 additions and 15 deletions

View File

@ -3583,8 +3583,9 @@ struct connector
// You may destroy the connector object in these two main callbacks: // You may destroy the connector object in these two main callbacks:
/// Connection has been successfully established /// Connection has been successfully established;
void (*on_connected) (void *user_data, int socket); /// the hostname is mainly intended for TLS Server Name Indication
void (*on_connected) (void *user_data, int socket, const char *hostname);
/// Failed to establish a connection to either target /// Failed to establish a connection to either target
void (*on_failure) (void *user_data); void (*on_failure) (void *user_data);
@ -3626,6 +3627,13 @@ connector_notify_error (struct connector *self, const char *error)
self->on_error (self->user_data, error); self->on_error (self->user_data, error);
} }
static void
connector_notify_connected (struct connector *self, int fd)
{
set_blocking (fd, true);
self->on_connected (self->user_data, fd, self->targets->hostname);
}
static void static void
connector_prepare_next (struct connector *self) connector_prepare_next (struct connector *self)
{ {
@ -3672,25 +3680,20 @@ connector_step (struct connector *self)
&yes, sizeof yes) != -1); &yes, sizeof yes) != -1);
if (!connect (fd, gai_iter->ai_addr, gai_iter->ai_addrlen)) if (!connect (fd, gai_iter->ai_addr, gai_iter->ai_addrlen))
connector_notify_connected (self, fd);
else if (errno == EINPROGRESS)
{ {
set_blocking (fd, true); self->connected_event.fd = self->socket = fd;
self->on_connected (self->user_data, fd); poller_fd_set (&self->connected_event, POLLOUT);
return;
} }
if (errno != EINPROGRESS) else
{ {
connector_notify_error (self, strerror (errno)); connector_notify_error (self, strerror (errno));
xclose (fd); xclose (fd);
connector_prepare_next (self); connector_prepare_next (self);
connector_step (self); connector_step (self);
return;
} }
self->connected_event.fd = self->socket = fd;
poller_fd_set (&self->connected_event, POLLOUT);
connector_prepare_next (self);
} }
static void static void
@ -3712,15 +3715,14 @@ connector_on_ready (const struct pollfd *pfd, struct connector *self)
xclose (self->socket); xclose (self->socket);
self->socket = -1; self->socket = -1;
connector_prepare_next (self);
connector_step (self); connector_step (self);
} }
else else
{ {
poller_fd_reset (&self->connected_event); poller_fd_reset (&self->connected_event);
self->socket = -1; self->socket = -1;
connector_notify_connected (self, pfd->fd);
set_blocking (pfd->fd, true);
self->on_connected (self->user_data, pfd->fd);
} }
} }