option for console interaction;
authorwenzelm
Sat, 10 Mar 2018 12:34:07 +0100
changeset 67806 bd4c440c8be7
parent 67805 2d9a265b294e
child 67807 331619e6c8b0
option for console interaction;
src/Pure/Tools/server.scala
--- a/src/Pure/Tools/server.scala	Sat Mar 10 11:55:54 2018 +0100
+++ b/src/Pure/Tools/server.scala	Sat Mar 10 12:34:07 2018 +0100
@@ -7,7 +7,8 @@
 package isabelle
 
 
-import java.io.{BufferedInputStream, BufferedOutputStream, IOException}
+import java.io.{BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter,
+  InputStreamReader, OutputStreamWriter, IOException}
 import java.net.{Socket, SocketException, SocketTimeoutException, ServerSocket, InetAddress}
 
 
@@ -131,6 +132,18 @@
           case _: SocketException => false
           case _: SocketTimeoutException => false
         }
+
+      def console()
+      {
+        using(connection())(connection =>
+          {
+            val tty_loop =
+              new TTY_Loop(
+                new BufferedWriter(new OutputStreamWriter(connection.socket.getOutputStream)),
+                new BufferedReader(new InputStreamReader(connection.socket.getInputStream)))
+            tty_loop.join
+          })
+      }
     }
   }
 
@@ -201,6 +214,7 @@
   val isabelle_tool =
     Isabelle_Tool("server", "manage resident Isabelle servers", args =>
     {
+      var console = false
       var operation_list = false
       var name = ""
       var port = 0
@@ -210,12 +224,14 @@
 Usage: isabelle server [OPTIONS]
 
   Options are:
-    -L           list servers
+    -C           console interaction with specified server
+    -L           list servers only
     -n NAME      explicit server name
     -p PORT      explicit server port
 
   Manage resident Isabelle servers.
 """,
+          "C" -> (_ => console = true),
           "L" -> (_ => operation_list = true),
           "n:" -> (arg => name = arg),
           "p:" -> (arg => port = Value.Int.parse(arg)))
@@ -230,6 +246,7 @@
       else {
         val (entry, server) = init(name, port)
         Output.writeln(entry.toString, stdout = true)
+        if (console) entry.console()
         server.foreach(_.join)
       }
     })