/* Create and return the ssl_vconn. */
sslv = xmalloc(sizeof *sslv);
- vconn_init(&sslv->vconn, &ssl_vconn_class, EAGAIN, sin->sin_addr.s_addr,
- name, true);
+ vconn_init(&sslv->vconn, &ssl_vconn_class, EAGAIN,
+ sin->sin_addr.s_addr, sin->sin_port, name, true);
sslv->state = state;
sslv->type = type;
sslv->fd = fd;
sslv->state = STATE_SSL_CONNECTING;
/* Fall through. */
- case STATE_SSL_CONNECTING:
+ case STATE_SSL_CONNECTING: {
+ struct sockaddr_in local_addr;
+ socklen_t addrlen = sizeof(local_addr);
+
+ /* Get the local IP and port information */
+ retval = getsockname(sslv->fd, (struct sockaddr *)&local_addr,
+ &addrlen);
+ if (retval) {
+ memset(&local_addr, 0, sizeof local_addr);
+ }
+ vconn_set_local_ip(vconn, local_addr.sin_addr.s_addr);
+ vconn_set_local_port(vconn, local_addr.sin_port);
+
retval = (sslv->type == CLIENT
? SSL_connect(sslv->ssl) : SSL_accept(sslv->ssl));
if (retval != 1) {
} else {
return 0;
}
+
+ }
}
NOT_REACHED();