diff --git a/repos/gems/src/server/tcp_terminal/main.cc b/repos/gems/src/server/tcp_terminal/main.cc index cff9466083..b363ef85f7 100644 --- a/repos/gems/src/server/tcp_terminal/main.cc +++ b/repos/gems/src/server/tcp_terminal/main.cc @@ -441,39 +441,46 @@ class Terminal::Session_component : public Genode::Rpc_object(), - Genode::min(_io_buffer.size(), dst_len)); - - /* - * If read buffer was in use, look if more data is buffered in - * the TCP/IP stack. - */ - if (num_bytes) - open_socket_pool()->update_sockets_to_watch(); + Genode::size_t num_bytes = 0; + Libc::with_libc([&] () { + num_bytes = read_buffer(_io_buffer.local_addr(), + Genode::min(_io_buffer.size(), dst_len)); + /* + * If read buffer was in use, look if more data is buffered in + * the TCP/IP stack. + */ + if (num_bytes) + open_socket_pool()->update_sockets_to_watch(); + }); return num_bytes; } Genode::size_t _write(Genode::size_t num_bytes) { - /* sanitize argument */ - num_bytes = Genode::min(num_bytes, _io_buffer.size()); + ssize_t written_bytes = 0; - /* write data to socket, assuming that it won't block */ - ssize_t written_bytes = ::write(sd(), - _io_buffer.local_addr(), - num_bytes); + Libc::with_libc([&] () { + /* sanitize argument */ + num_bytes = Genode::min(num_bytes, _io_buffer.size()); - if (written_bytes < 0) { - Genode::error("write error, dropping data"); - return 0; - } + /* write data to socket, assuming that it won't block */ + written_bytes = ::write(sd(), + _io_buffer.local_addr(), + num_bytes); + + if (written_bytes < 0) { + Genode::error("write error, dropping data"); + written_bytes = 0; + } + }); return written_bytes; } @@ -522,8 +529,12 @@ class Terminal::Root_component : public Genode::Root_component