/* 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
if (Byte_Message.read_line(in_stream).map(_.text) == Some(password)) (out_stream, in_stream)
else {
out_stream.close()
in_stream.close()
error("Failed to connect system channel: bad password")
}
}
finally { shutdown() }
}
}