diff options
author | Greg Hazel <ghazel@gmail.com> | 2018-02-11 16:28:58 -0800 |
---|---|---|
committer | Azat Khuzhin <a3at.mail@gmail.com> | 2018-04-24 02:29:17 +0300 |
commit | 367cd9e5c2b8e3f9b8dbed40bfe8a0ed79285c36 (patch) | |
tree | 2ad76775b014805c91b543c8111d31b6c419aa00 /bufferevent_sock.c | |
parent | a3d8f2e09302536c6c0ffc3ccb1fc6f43b51dc4f (diff) | |
download | libevent-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.c | 19 |
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); |