static void openssl_poll(ErDtlsConnection *self) { int ret; char buf[512]; int error; log_state(self, "poll: before handshake"); ret = SSL_do_handshake(self->priv->ssl); log_state(self, "poll: after handshake"); if (ret == 1) { if (!self->priv->keys_exported) { LOG_INFO(self, "handshake just completed successfully, exporting keys"); export_srtp_keys(self); } else { LOG_INFO(self, "handshake is completed"); } return; } else { if (ret == 0) { LOG_DEBUG(self, "do_handshake encountered EOF"); } else if (ret == -1) { LOG_WARNING(self, "do_handshake encountered BIO error"); } else { LOG_DEBUG(self, "do_handshake returned %d", ret); } } error = SSL_get_error(self->priv->ssl, ret); switch (error) { case SSL_ERROR_NONE: LOG_WARNING(self, "no error, handshake should be done"); break; case SSL_ERROR_SSL: LOG_LOG(self, "SSL error %d: %s", error, ERR_error_string(ERR_get_error(), buf)); break; case SSL_ERROR_WANT_READ: LOG_LOG(self, "SSL wants read"); break; case SSL_ERROR_WANT_WRITE: LOG_LOG(self, "SSL wants write"); break; case SSL_ERROR_SYSCALL: { LOG_LOG(self, "SSL syscall (error) : %lu", ERR_get_error()); break; } default: LOG_WARNING(self, "Unknown SSL error: %d, ret: %d", error, ret); } }
static void openssl_poll (GstDtlsConnection * self) { int ret; int error; log_state (self, "poll: before handshake"); ERR_clear_error (); ret = SSL_do_handshake (self->priv->ssl); log_state (self, "poll: after handshake"); switch (ret) { case 1: if (!self->priv->keys_exported) { GST_INFO_OBJECT (self, "handshake just completed successfully, exporting keys"); export_srtp_keys (self); } else { GST_INFO_OBJECT (self, "handshake is completed"); } return; case 0: GST_DEBUG_OBJECT (self, "do_handshake encountered EOF"); break; case -1: GST_DEBUG_OBJECT (self, "do_handshake encountered BIO error"); break; default: GST_DEBUG_OBJECT (self, "do_handshake returned %d", ret); } error = SSL_get_error (self->priv->ssl, ret); switch (error) { case SSL_ERROR_NONE: GST_WARNING_OBJECT (self, "no error, handshake should be done"); break; case SSL_ERROR_SSL: GST_ERROR_OBJECT (self, "SSL error"); ERR_print_errors_cb (ssl_err_cb, self); return; case SSL_ERROR_WANT_READ: GST_LOG_OBJECT (self, "SSL wants read"); break; case SSL_ERROR_WANT_WRITE: GST_LOG_OBJECT (self, "SSL wants write"); break; case SSL_ERROR_SYSCALL:{ gchar message[1024] = "<unknown>"; gint syserror; #ifdef G_OS_WIN32 syserror = WSAGetLastError (); FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, syserror, 0, message, sizeof message, NULL); #else syserror = errno; strerror_r (syserror, message, sizeof message); #endif GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, syserror != 0 ? GST_LEVEL_WARNING : GST_LEVEL_LOG, self, "SSL syscall error: errno %d: %s", syserror, message); break; } default: GST_WARNING_OBJECT (self, "Unknown SSL error: %d, ret: %d", error, ret); } ERR_print_errors_cb (ssl_warn_cb, self); }