tcp_terminal: fix handling of read characters

Fixes #1167
This commit is contained in:
Alexander Boettcher 2014-06-04 15:28:32 +02:00 committed by Christian Helmuth
parent aae541f9c0
commit 0a8c419dee

View File

@ -73,6 +73,7 @@ class Open_socket : public Genode::List<Open_socket>::Element
enum { READ_BUF_SIZE = 4096 }; enum { READ_BUF_SIZE = 4096 };
char _read_buf[READ_BUF_SIZE]; char _read_buf[READ_BUF_SIZE];
Genode::size_t _read_buf_bytes_used; Genode::size_t _read_buf_bytes_used;
Genode::size_t _read_buf_bytes_read;
/** /**
* Establish remote connection * Establish remote connection
@ -196,13 +197,18 @@ class Open_socket : public Genode::List<Open_socket>::Element
} }
/** /**
* Flush internal read buffer into destination buffer * Read out internal read buffer and copy into destination buffer.
*/ */
Genode::size_t flush_read_buffer(char *dst, Genode::size_t dst_len) Genode::size_t read_buffer(char *dst, Genode::size_t dst_len)
{ {
Genode::size_t num_bytes = Genode::min(dst_len, _read_buf_bytes_used); Genode::size_t num_bytes = Genode::min(dst_len, _read_buf_bytes_used -
Genode::memcpy(dst, _read_buf, num_bytes); _read_buf_bytes_read);
_read_buf_bytes_used = 0; Genode::memcpy(dst, _read_buf + _read_buf_bytes_read, num_bytes);
_read_buf_bytes_read += num_bytes;
if (_read_buf_bytes_read >= _read_buf_bytes_used)
_read_buf_bytes_used = _read_buf_bytes_read = 0;
return num_bytes; return num_bytes;
} }
@ -359,7 +365,9 @@ Open_socket_pool *open_socket_pool()
Open_socket::Open_socket(int tcp_port) Open_socket::Open_socket(int tcp_port)
: _listen_sd(_remote_listen(tcp_port)), _sd(-1) :
_listen_sd(_remote_listen(tcp_port)), _sd(-1),
_read_buf_bytes_used(0), _read_buf_bytes_read(0)
{ {
open_socket_pool()->insert(this); open_socket_pool()->insert(this);
} }
@ -403,7 +411,7 @@ namespace Terminal {
Genode::size_t _read(Genode::size_t dst_len) Genode::size_t _read(Genode::size_t dst_len)
{ {
Genode::size_t num_bytes = Genode::size_t num_bytes =
flush_read_buffer(_io_buffer.local_addr<char>(), read_buffer(_io_buffer.local_addr<char>(),
Genode::min(_io_buffer.size(), dst_len)); Genode::min(_io_buffer.size(), dst_len));
/* /*