extern "C" void iocba_close( void* tls_channel ) { Botan::TLS::Channel* channel = (Botan::TLS::Channel*) tls_channel; try{ channel->close(); } catch (...) { printf("BotanTLS engine raised exception on close\n"); } }
extern "C" DLL_PUBLIC void iocba_close( buffers_t* buffers, char* out_enc_to_send, uint32_t *enc_to_send_length ) { // TRACE("Close called on buffer_t* %p\n", buffers); Botan::TLS::Channel* channel = buffers->channel; buffers -> enc_cursor = out_enc_to_send; buffers -> enc_end = out_enc_to_send + *enc_to_send_length; // No waiting cleartext data in this context buffers -> clr_cursor = 0; buffers -> clr_end = 0; try{ channel->close(); } catch (buffer_override_exception_t const& e) { TRACE("Buffer override at iocba_close!!\n"); return ; } catch (Botan::TLS::TLS_Exception const& e) { if (e.type() == Botan::TLS::Alert::INAPPROPRIATE_FALLBACK) { TRACE("BotanTLS engine (close) instance likely crashed before: %s \n", e.what()); return ; } else { TRACE("BotanTLS engine (close) instance crashed (normal if ALPN didn't go well): %s \n", e.what()); return ; } } catch (std::exception const& e) { // TODO: control messages //TRACE("BotanTLS engine crashed with generic exception: %s \n", e.what()); return ; }catch (...) { TRACE("BotanTLS engine raised exception on close\n"); } *enc_to_send_length = (uint32_t) ( buffers -> enc_cursor - out_enc_to_send ); buffers -> clear_cursors(); }