/* Title: Pure/System/system_channel.scala
Author: Makarius
Socket-based system channel for inter-process communication.
*/
package isabelle
import java.io.{InputStream, OutputStream}
import java.net.{ServerSocket, InetAddress}
object System_Channel {
def apply(): System_Channel = new System_Channel
}
class System_Channel private {
private val server = new ServerSocket(0, 50, Server.localhost)
val address: String = Server.print_address(server.getLocalPort)
val password: String = UUID.random().toString
override def toString: String = address
def shutdown(): Unit = server.close()
def rendezvous(): (OutputStream, InputStream) = {
val socket = server.accept
try {
val out_stream = socket.getOutputStream
val in_stream = socket.getInputStream
Byte_Message.read_line(in_stream) match {
case Some(bs) if bs.text == password => (out_stream, in_stream)
case _ =>
out_stream.close()
in_stream.close()
error("Failed to connect system channel: bad password")
}
}
finally { shutdown() }
}
}