diff options
author | Simon Josefsson <simon@josefsson.org> | 2005-12-15 10:52:19 +0000 |
---|---|---|
committer | Simon Josefsson <simon@josefsson.org> | 2005-12-15 10:52:19 +0000 |
commit | 3860714e697158a17086fff6a87fa9d22877895a (patch) | |
tree | db6ae00dc003790ce52fc23fb7c100db8498ffeb /lib/gnutls_buffers.c | |
parent | 1b6f0a191d7dd2ab25da837494a53992e01b9229 (diff) | |
download | gnutls-3860714e697158a17086fff6a87fa9d22877895a.tar.gz |
Add TLS/IA support.
Diffstat (limited to 'lib/gnutls_buffers.c')
-rw-r--r-- | lib/gnutls_buffers.c | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/lib/gnutls_buffers.c b/lib/gnutls_buffers.c index 2923232cac..7034e5e868 100644 --- a/lib/gnutls_buffers.c +++ b/lib/gnutls_buffers.c @@ -85,42 +85,43 @@ _gnutls_record_buffer_put (content_type_t type, gnutls_session_t session, opaque * data, size_t length) { + gnutls_buffer *buf; + if (length == 0) return 0; + switch (type) { case GNUTLS_APPLICATION_DATA: - - if (_gnutls_buffer_append - (&session->internals.application_data_buffer, data, length) < 0) - { - gnutls_assert (); - return GNUTLS_E_MEMORY_ERROR; - } - _gnutls_buffers_log ("BUF[REC]: Inserted %d bytes of Data(%d)\n", - length, type); - + buf = &session->internals.application_data_buffer; + _gnutls_buffers_log("BUF[REC]: Inserted %d bytes of Data(%d)\n", + length, type); break; - case GNUTLS_HANDSHAKE: - if (_gnutls_buffer_append - (&session->internals.handshake_data_buffer, data, length) < 0) - { - gnutls_assert (); - return GNUTLS_E_MEMORY_ERROR; - } - _gnutls_buffers_log ("BUF[HSK]: Inserted %d bytes of Data(%d)\n", - length, type); + case GNUTLS_HANDSHAKE: + buf = &session->internals.handshake_data_buffer; + _gnutls_buffers_log("BUF[HSK]: Inserted %d bytes of Data(%d)\n", + length, type); + break; + case GNUTLS_INNER_APPLICATION: + buf = &session->internals.ia_data_buffer; + _gnutls_buffers_log("BUF[IA]: Inserted %d bytes of Data(%d)\n", + length, type); break; default: - gnutls_assert (); + gnutls_assert(); return GNUTLS_E_INVALID_REQUEST; } - return 0; + if (_gnutls_buffer_append (buf, data, length) < 0) + { + gnutls_assert(); + return GNUTLS_E_MEMORY_ERROR; + } + return 0; } int @@ -134,6 +135,9 @@ _gnutls_record_buffer_get_size (content_type_t type, gnutls_session_t session) case GNUTLS_HANDSHAKE: return session->internals.handshake_data_buffer.length; + case GNUTLS_INNER_APPLICATION: + return session->internals.ia_data_buffer.length; + default: return GNUTLS_E_INVALID_REQUEST; } @@ -211,6 +215,24 @@ _gnutls_record_buffer_get (content_type_t type, session->internals.handshake_data_buffer.length); break; + + case GNUTLS_INNER_APPLICATION: + if (length > session->internals.ia_data_buffer.length) + length = session->internals.ia_data_buffer.length; + + _gnutls_buffers_log("BUF[REC][IA]: Read %d bytes of Data(%d)\n", + length, type); + + session->internals.ia_data_buffer.length -= length; + memcpy(data, session->internals.ia_data_buffer.data, length); + + /* overwrite buffer */ + memmove(session->internals.ia_data_buffer.data, + &session->internals.ia_data_buffer.data[length], + session->internals.ia_data_buffer.length); + + break; + default: gnutls_assert (); return GNUTLS_E_INVALID_REQUEST; |