summaryrefslogtreecommitdiff
path: root/bufferevent_sock.c
diff options
context:
space:
mode:
authorGreg Hazel <ghazel@gmail.com>2018-02-11 16:28:58 -0800
committerAzat Khuzhin <a3at.mail@gmail.com>2018-04-24 02:29:17 +0300
commit367cd9e5c2b8e3f9b8dbed40bfe8a0ed79285c36 (patch)
tree2ad76775b014805c91b543c8111d31b6c419aa00 /bufferevent_sock.c
parenta3d8f2e09302536c6c0ffc3ccb1fc6f43b51dc4f (diff)
downloadlibevent-367cd9e5c2b8e3f9b8dbed40bfe8a0ed79285c36.tar.gz
Fix evhttp_connection_get_addr() fox incomming http connections
Install conn_address of the bufferevent on incomping http connections (even though this is kind of subsytem violation, so let's fix it in a simplest way and thinkg about long-term solution). Fixes: #510 Closes: #595 (pick)
Diffstat (limited to 'bufferevent_sock.c')
-rw-r--r--bufferevent_sock.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/bufferevent_sock.c b/bufferevent_sock.c
index 8c78c045..c878aa95 100644
--- a/bufferevent_sock.c
+++ b/bufferevent_sock.c
@@ -104,19 +104,26 @@ bufferevent_socket_get_conn_address_(struct bufferevent *bev)
return (struct sockaddr *)&bev_p->conn_address;
}
-static void
-bufferevent_socket_set_conn_address_fd(struct bufferevent_private *bev_p, int fd)
+
+void
+bufferevent_socket_set_conn_address_fd_(struct bufferevent *bev, int fd)
{
+ struct bufferevent_private *bev_p =
+ EVUTIL_UPCAST(bev, struct bufferevent_private, bev);
+
socklen_t len = sizeof(bev_p->conn_address);
struct sockaddr *addr = (struct sockaddr *)&bev_p->conn_address;
if (addr->sa_family != AF_UNSPEC)
getpeername(fd, addr, &len);
}
-static void
-bufferevent_socket_set_conn_address(struct bufferevent_private *bev_p,
+
+void
+bufferevent_socket_set_conn_address_(struct bufferevent *bev,
struct sockaddr *addr, size_t addrlen)
{
+ struct bufferevent_private *bev_p =
+ EVUTIL_UPCAST(bev, struct bufferevent_private, bev);
EVUTIL_ASSERT(addrlen <= sizeof(bev_p->conn_address));
memcpy(&bev_p->conn_address, addr, addrlen);
}
@@ -264,7 +271,7 @@ bufferevent_writecb(evutil_socket_t fd, short event, void *arg)
goto done;
} else {
connected = 1;
- bufferevent_socket_set_conn_address_fd(bufev_p, fd);
+ bufferevent_socket_set_conn_address_fd_(bufev, fd);
#ifdef _WIN32
if (BEV_IS_ASYNC(bufev)) {
event_del(&bufev->ev_write);
@@ -483,7 +490,7 @@ bufferevent_connect_getaddrinfo_cb(int result, struct evutil_addrinfo *ai,
}
/* XXX use the other addrinfos? */
- bufferevent_socket_set_conn_address(bev_p, ai->ai_addr, (int)ai->ai_addrlen);
+ bufferevent_socket_set_conn_address_(bev, ai->ai_addr, (int)ai->ai_addrlen);
r = bufferevent_socket_connect(bev, ai->ai_addr, (int)ai->ai_addrlen);
if (r < 0)
bufferevent_run_eventcb_(bev, BEV_EVENT_ERROR, 0);