summaryrefslogtreecommitdiff
path: root/bufferevent.c
diff options
context:
space:
mode:
authorAzat Khuzhin <azat@libevent.org>2021-03-23 09:00:24 +0300
committerAzat Khuzhin <azat@libevent.org>2021-03-23 09:06:58 +0300
commitaea752b62dde0f02195b9c2143bdfcdfe65fb6fb (patch)
tree04b3387d006a57ebfd890d488983ef627b642dbc /bufferevent.c
parent8e6090d001943241f57efb7329130ec86ba1dcd3 (diff)
downloadlibevent-aea752b62dde0f02195b9c2143bdfcdfe65fb6fb.tar.gz
bufferevent: introduce bufferevent_replacefd() (like setfd() but also close fd)
Diffstat (limited to 'bufferevent.c')
-rw-r--r--bufferevent.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/bufferevent.c b/bufferevent.c
index 27f2a9ba..53d3a995 100644
--- a/bufferevent.c
+++ b/bufferevent.c
@@ -881,6 +881,34 @@ bufferevent_setfd(struct bufferevent *bev, evutil_socket_t fd)
return res;
}
+int
+bufferevent_replacefd(struct bufferevent *bev, evutil_socket_t fd)
+{
+ union bufferevent_ctrl_data d;
+ int err = -1;
+ evutil_socket_t old_fd = EVUTIL_INVALID_SOCKET;
+
+ BEV_LOCK(bev);
+ if (bev->be_ops->ctrl) {
+ err = bev->be_ops->ctrl(bev, BEV_CTRL_GET_FD, &d);
+ if (!err) {
+ old_fd = d.fd;
+ if (old_fd != EVUTIL_INVALID_SOCKET) {
+ err = evutil_closesocket(old_fd);
+ }
+ }
+ if (!err) {
+ d.fd = fd;
+ err = bev->be_ops->ctrl(bev, BEV_CTRL_SET_FD, &d);
+ }
+ }
+ if (err)
+ event_debug(("%s: cannot replace fd for %p from "EV_SOCK_FMT" to "EV_SOCK_FMT, __func__, bev, old_fd, fd));
+ BEV_UNLOCK(bev);
+
+ return err;
+}
+
evutil_socket_t
bufferevent_getfd(struct bufferevent *bev)
{