diff options
-rw-r--r-- | bufferevent-internal.h | 2 | ||||
-rw-r--r-- | bufferevent.c | 12 | ||||
-rw-r--r-- | http.c | 4 |
3 files changed, 17 insertions, 1 deletions
diff --git a/bufferevent-internal.h b/bufferevent-internal.h index 9ecede17..0c4df871 100644 --- a/bufferevent-internal.h +++ b/bufferevent-internal.h @@ -367,6 +367,8 @@ void bufferevent_init_generic_timeout_cbs_(struct bufferevent *bev); * that enabled EV_READ or EV_WRITE, or that disables EV_READ or EV_WRITE. */ int bufferevent_generic_adj_timeouts_(struct bufferevent *bev); +enum bufferevent_options bufferevent_get_options_(struct bufferevent *bev); + /** Internal use: We have just successfully read data into an inbuf, so * reset the read timeout (if any). */ #define BEV_RESET_GENERIC_READ_TIMEOUT(bev) \ diff --git a/bufferevent.c b/bufferevent.c index 49c1f2bc..f2f84438 100644 --- a/bufferevent.c +++ b/bufferevent.c @@ -820,6 +820,18 @@ bufferevent_getfd(struct bufferevent *bev) return (res<0) ? -1 : d.fd; } +enum bufferevent_options +bufferevent_get_options_(struct bufferevent *bev) +{ + struct bufferevent_private *bev_p = + EVUTIL_UPCAST(bev, struct bufferevent_private, bev); + + BEV_LOCK(bev); + return bev_p->options; + BEV_UNLOCK(bev); +} + + static void bufferevent_cancel_all_(struct bufferevent *bev) { @@ -1155,7 +1155,9 @@ evhttp_connection_free(struct evhttp_connection *evcon) if (evcon->fd != -1) { shutdown(evcon->fd, EVUTIL_SHUT_WR); - evutil_closesocket(evcon->fd); + if (!(bufferevent_get_options_(evcon->bufev) & BEV_OPT_CLOSE_ON_FREE)) { + evutil_closesocket(evcon->fd); + } } if (evcon->bind_address != NULL) |