// XServerProxy creates a TCP proxy on port 6000 to a the Unix // socket that XQuartz is listening on. // // NOTE: this function does not start/install the XQuartz service func XServerProxy(port int) { if runtime.GOOS != "darwin" { log.Debug("Not running an OSX environment, skip run X Server Proxy") return } l, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) if err != nil { log.Fatal(err) } defer l.Close() // Send all traffic back to unix $DISPLAY socket on a running XQuartz server addr, err := net.ResolveUnixAddr("unix", os.Getenv("DISPLAY")) if err != nil { log.Error("Error: ", err.Error()) } log.Info("X Service Proxy available on all network interfaces on port %d", port) if host, err := utils.DockerVMHost(); err == nil { log.Info("Parity has detected your Docker environment and recommends running 'export DISPLAY=%s:0' in your container to forward the X display", host) } for { xServerClient, err := net.DialUnix("unix", nil, addr) if err != nil { log.Error("Error: ", err.Error()) } defer xServerClient.Close() conn, err := l.Accept() log.Debug("X Service Proxy connected to client on: %s (remote: %s)", conn.LocalAddr(), conn.RemoteAddr()) if err != nil { log.Fatal(err) } go func(c net.Conn, s *net.UnixConn) { buf := make([]byte, 8092) io.CopyBuffer(s, c, buf) s.CloseWrite() }(conn, xServerClient) go func(c net.Conn, s *net.UnixConn) { buf := make([]byte, 8092) io.CopyBuffer(c, s, buf) c.Close() }(conn, xServerClient) } }
func injectDisplayEnvironmentVariables(p *project.Project) { if host, err := utils.DockerVMHost(); err == nil { injectEnvironmentVariable([]string{fmt.Sprintf("DISPLAY=%s:0", host)}, p) } }