diff options
author | Azat Khuzhin <azat@libevent.org> | 2020-10-31 21:45:22 +0300 |
---|---|---|
committer | Azat Khuzhin <azat@libevent.org> | 2020-10-31 22:51:40 +0300 |
commit | 7e0fc878c5646f45273f38dbf5b8d325a20c81df (patch) | |
tree | e68ab53a93f59853b6bd2dfc21774e789d11c971 /bufferevent_ssl.c | |
parent | 587f6c83a3557c048fce6e541e7fc534082b0e85 (diff) | |
download | libevent-7e0fc878c5646f45273f38dbf5b8d325a20c81df.tar.gz |
Introduce new API for flags of the SSL bufferevent
Introduce more generic API (like for evbuffer):
- bufferevent_ssl_set_flags()
- bufferevent_ssl_clear_flags()
- bufferevent_ssl_get_flags()
And deprecate existing:
- bufferevent_openssl_get_allow_dirty_shutdown()
- bufferevent_openssl_set_allow_dirty_shutdown()
- bufferevent_mbedtls_get_allow_dirty_shutdown()
- bufferevent_mbedtls_set_allow_dirty_shutdown()
Diffstat (limited to 'bufferevent_ssl.c')
-rw-r--r-- | bufferevent_ssl.c | 84 |
1 files changed, 67 insertions, 17 deletions
diff --git a/bufferevent_ssl.c b/bufferevent_ssl.c index 5c6956d5..dd013c98 100644 --- a/bufferevent_ssl.c +++ b/bufferevent_ssl.c @@ -581,7 +581,7 @@ be_ssl_eventcb(struct bufferevent *bev_base, short what, void *ctx) int event = 0; if (what & BEV_EVENT_EOF) { - if (bev_ssl->allow_dirty_shutdown) + if (bev_ssl->flags & BUFFEREVENT_SSL_DIRTY_SHUTDOWN) event = BEV_EVENT_EOF; else event = BEV_EVENT_ERROR; @@ -1052,41 +1052,91 @@ err: return NULL; } -int -bufferevent_ssl_get_allow_dirty_shutdown(struct bufferevent *bev) +unsigned long +bufferevent_get_ssl_error(struct bufferevent *bev) { - int allow_dirty_shutdown = -1; + unsigned long err = 0; struct bufferevent_ssl *bev_ssl; BEV_LOCK(bev); bev_ssl = bufferevent_ssl_upcast(bev); - if (bev_ssl) - allow_dirty_shutdown = bev_ssl->allow_dirty_shutdown; + if (bev_ssl && bev_ssl->n_errors) { + err = bev_ssl->errors[--bev_ssl->n_errors]; + } BEV_UNLOCK(bev); - return allow_dirty_shutdown; + return err; } -void -bufferevent_ssl_set_allow_dirty_shutdown(struct bufferevent *bev, - int allow_dirty_shutdown) +ev_uint64_t bufferevent_ssl_get_flags(struct bufferevent *bev) { + ev_uint64_t flags = EV_UINT64_MAX; struct bufferevent_ssl *bev_ssl; + BEV_LOCK(bev); bev_ssl = bufferevent_ssl_upcast(bev); if (bev_ssl) - bev_ssl->allow_dirty_shutdown = !!allow_dirty_shutdown; + flags = bev_ssl->flags; BEV_UNLOCK(bev); + + return flags; } +ev_uint64_t bufferevent_ssl_set_flags(struct bufferevent *bev, ev_uint64_t flags) +{ + ev_uint64_t old_flags = EV_UINT64_MAX; + struct bufferevent_ssl *bev_ssl; -unsigned long -bufferevent_get_ssl_error(struct bufferevent *bev) + flags &= (BUFFEREVENT_SSL_DIRTY_SHUTDOWN); + if (!flags) + return old_flags; + + BEV_LOCK(bev); + bev_ssl = bufferevent_ssl_upcast(bev); + if (bev_ssl) { + old_flags = bev_ssl->flags; + bev_ssl->flags |= flags; + } + BEV_UNLOCK(bev); + + return old_flags; +} +ev_uint64_t bufferevent_ssl_clear_flags(struct bufferevent *bev, ev_uint64_t flags) { - unsigned long err = 0; + ev_uint64_t old_flags = EV_UINT64_MAX; struct bufferevent_ssl *bev_ssl; + + flags &= (BUFFEREVENT_SSL_DIRTY_SHUTDOWN); + if (!flags) + return old_flags; + BEV_LOCK(bev); bev_ssl = bufferevent_ssl_upcast(bev); - if (bev_ssl && bev_ssl->n_errors) { - err = bev_ssl->errors[--bev_ssl->n_errors]; + if (bev_ssl) { + old_flags = bev_ssl->flags; + bev_ssl->flags &= ~flags; } BEV_UNLOCK(bev); - return err; + + return old_flags; +} + +int +bufferevent_ssl_get_allow_dirty_shutdown(struct bufferevent *bev) +{ + ev_uint64_t flags = bufferevent_ssl_get_flags(bev); + if (flags == EV_UINT64_MAX) + return flags; + return !!(flags & BUFFEREVENT_SSL_DIRTY_SHUTDOWN); +} + +void +bufferevent_ssl_set_allow_dirty_shutdown( + struct bufferevent *bev, int allow_dirty_shutdown) +{ + BEV_LOCK(bev); + + if (allow_dirty_shutdown) + bufferevent_ssl_set_flags(bev, BUFFEREVENT_SSL_DIRTY_SHUTDOWN); + else + bufferevent_ssl_clear_flags(bev, BUFFEREVENT_SSL_DIRTY_SHUTDOWN); + + BEV_UNLOCK(bev); } |