+static ssize_t gnutls_pull_wrapper(gnutls_transport_ptr_t user_wrap, void* buffer, size_t size)
+{
+ StreamSocket* user = reinterpret_cast<StreamSocket*>(user_wrap);
+ if (user->GetEventMask() & FD_READ_WILL_BLOCK)
+ {
+ errno = EAGAIN;
+ return -1;
+ }
+ int rv = recv(user->GetFd(), buffer, size, 0);
+ if (rv < (int)size)
+ ServerInstance->SE->ChangeEventMask(user, FD_READ_WILL_BLOCK);
+ return rv;
+}
+
+static ssize_t gnutls_push_wrapper(gnutls_transport_ptr_t user_wrap, const void* buffer, size_t size)
+{
+ StreamSocket* user = reinterpret_cast<StreamSocket*>(user_wrap);
+ if (user->GetEventMask() & FD_WRITE_WILL_BLOCK)
+ {
+ errno = EAGAIN;
+ return -1;
+ }
+ int rv = send(user->GetFd(), buffer, size, 0);
+ if (rv < (int)size)
+ ServerInstance->SE->ChangeEventMask(user, FD_WRITE_WILL_BLOCK);
+ return rv;
+}
+