summaryrefslogtreecommitdiff
path: root/lib/buffers.h
blob: ef5171a0ce612eba9cd8077ad48ab3346709380b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * Copyright (C) 2000-2012 Free Software Foundation, Inc.
 *
 * Author: Nikos Mavrogiannopoulos
 *
 * This file is part of GnuTLS.
 *
 * The GnuTLS is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>
 *
 */

#ifndef GNUTLS_LIB_BUFFERS_H
#define GNUTLS_LIB_BUFFERS_H

#include "mbuffers.h"

#define MBUFFER_FLUSH 1

void
_gnutls_record_buffer_put(gnutls_session_t session,
			  content_type_t type, const gnutls_uint64 * seq,
			  mbuffer_st * bufel);

inline static int _gnutls_record_buffer_get_size(gnutls_session_t session)
{
	return session->internals.record_buffer.byte_length;
}

#define NO_TIMEOUT_FUNC_SET(session) unlikely(session->internals.pull_timeout_func == gnutls_system_recv_timeout \
	     && session->internals.pull_func != system_read)

/*-
 * record_check_unprocessed:
 * @session: is a #gnutls_session_t structure.
 *
 * This function checks if there are unprocessed data
 * in the gnutls record buffers. Those data might not
 * be complete records.
 *
 * Returns: Returns the size of the data or zero.
 -*/
inline static size_t record_check_unprocessed(gnutls_session_t session)
{
	return session->internals.record_recv_buffer.byte_length;
}

int _gnutls_record_buffer_get(content_type_t type,
			      gnutls_session_t session, uint8_t * data,
			      size_t length, uint8_t seq[8]);
int _gnutls_record_buffer_get_packet(content_type_t type,
				     gnutls_session_t session,
				     gnutls_packet_t *packet);
ssize_t _gnutls_io_read_buffered(gnutls_session_t, size_t n,
				 content_type_t, unsigned int *ms);
int _gnutls_io_clear_peeked_data(gnutls_session_t session);

ssize_t _gnutls_io_write_buffered(gnutls_session_t session,
				  mbuffer_st * bufel, unsigned int mflag);

int _gnutls_handshake_io_cache_int(gnutls_session_t,
				   gnutls_handshake_description_t,
				   mbuffer_st * bufel);

ssize_t
_gnutls_handshake_io_recv_int(gnutls_session_t session,
			      gnutls_handshake_description_t htype,
			      handshake_buffer_st * hsk,
			      unsigned int optional);

ssize_t _gnutls_io_write_flush(gnutls_session_t session);
int _gnutls_io_check_recv(gnutls_session_t session, unsigned int ms);
ssize_t _gnutls_handshake_io_write_flush(gnutls_session_t session);

inline static void _gnutls_handshake_buffer_clear(handshake_buffer_st *
						  hsk)
{
	_gnutls_buffer_clear(&hsk->data);
	hsk->htype = -1;
}

inline static void _gnutls_handshake_buffer_init(handshake_buffer_st * hsk)
{
	memset(hsk, 0, sizeof(*hsk));
	_gnutls_buffer_init(&hsk->data);
	hsk->htype = -1;
}

inline static void _gnutls_handshake_recv_buffer_clear(gnutls_session_t
						       session)
{
	int i;
	for (i = 0; i < session->internals.handshake_recv_buffer_size; i++)
		_gnutls_handshake_buffer_clear(&session->internals.
					       handshake_recv_buffer[i]);
	session->internals.handshake_recv_buffer_size = 0;
	_mbuffer_head_clear(&session->internals.handshake_header_recv_buffer);
}

inline static void _gnutls_handshake_recv_buffer_init(gnutls_session_t
						      session)
{
	int i;
	for (i = 0; i < MAX_HANDSHAKE_MSGS; i++) {
		_gnutls_handshake_buffer_init(&session->internals.
					      handshake_recv_buffer[i]);
	}
	session->internals.handshake_recv_buffer_size = 0;
	_mbuffer_head_init(&session->internals.handshake_header_recv_buffer);
}

int _gnutls_parse_record_buffered_msgs(gnutls_session_t session);

ssize_t
_gnutls_recv_in_buffers(gnutls_session_t session, content_type_t type,
			gnutls_handshake_description_t htype,
			unsigned int ms);

#define _gnutls_handshake_io_buffer_clear( session) \
	_mbuffer_head_clear( &session->internals.handshake_send_buffer); \
	_gnutls_handshake_recv_buffer_clear( session);

#endif /* GNUTLS_LIB_BUFFERS_H */