summaryrefslogtreecommitdiff
path: root/bufferevent_ssl.c
diff options
context:
space:
mode:
authorAzat Khuzhin <azat@libevent.org>2020-10-31 21:45:22 +0300
committerAzat Khuzhin <azat@libevent.org>2020-10-31 22:51:40 +0300
commit7e0fc878c5646f45273f38dbf5b8d325a20c81df (patch)
treee68ab53a93f59853b6bd2dfc21774e789d11c971 /bufferevent_ssl.c
parent587f6c83a3557c048fce6e541e7fc534082b0e85 (diff)
downloadlibevent-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.c84
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);
}