From cd21074201512c8c79cfcbe0d5fb4a53e7dbbeb1 Mon Sep 17 00:00:00 2001
From: Emery Hemingway <emery@vfemail.net>
Date: Wed, 4 Oct 2017 10:00:03 -0500
Subject: [PATCH] server/tcp_terminal: wrap RPC functions in 'with_libc'

---
 repos/gems/src/server/tcp_terminal/main.cc | 65 +++++++++++++---------
 1 file changed, 38 insertions(+), 27 deletions(-)

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<Session, Session_c
 
 		bool avail()
 		{
-			return !read_buffer_empty();
+			bool ret = false;
+			Libc::with_libc([&] () { ret = !read_buffer_empty(); });
+			return ret;
 		}
 
 		Genode::size_t _read(Genode::size_t dst_len)
 		{
-			Genode::size_t num_bytes =
-				read_buffer(_io_buffer.local_addr<char>(),
-				            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<char>(),
+				                        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<char>(),
-			                                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<char>(),
+				                        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<Session_component
 
 				unsigned tcp_port = 0;
 				policy.attribute("port").value(&tcp_port);
-				return new (md_alloc())
-				       Session_component(_env, io_buffer_size, tcp_port);
+				Session_component *session = nullptr;
+				Libc::with_libc([&] () {
+					session = new (md_alloc())
+						Session_component(_env, io_buffer_size, tcp_port);
+				});
+				return session;
 			}
 			catch (Xml_node::Nonexistent_attribute) {
 				error("Missing \"port\" attribute in policy definition");
@@ -566,13 +577,13 @@ struct Main
 	Main(Genode::Env &env) : _env(env)
 	{
 		Genode::log("--- TCP terminal started ---");
-
-		/* start thread blocking in select */
-		open_socket_pool(&_env);
+		Libc::with_libc([&] () {
+			/* start thread blocking in select */
+			open_socket_pool(&_env);
+		});
 
 		/* announce service at our parent */
 		_env.parent().announce(env.ep().manage(_root));
-
 	}
 };