diff options
author | Azat Khuzhin <azat@libevent.org> | 2021-03-23 09:00:24 +0300 |
---|---|---|
committer | Azat Khuzhin <azat@libevent.org> | 2021-03-23 09:06:58 +0300 |
commit | aea752b62dde0f02195b9c2143bdfcdfe65fb6fb (patch) | |
tree | 04b3387d006a57ebfd890d488983ef627b642dbc /bufferevent.c | |
parent | 8e6090d001943241f57efb7329130ec86ba1dcd3 (diff) | |
download | libevent-aea752b62dde0f02195b9c2143bdfcdfe65fb6fb.tar.gz |
bufferevent: introduce bufferevent_replacefd() (like setfd() but also close fd)
Diffstat (limited to 'bufferevent.c')
-rw-r--r-- | bufferevent.c | 28 |
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) { |