From 8e7dfb4b203e6d14924db0604e81429ca990f3b5 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Thu, 8 Feb 2018 09:08:13 +0000 Subject: [PATCH] Handle very long socket file paths on UNIX Fixes #3930 --- .../scala/sbt/internal/CommandExchange.scala | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/main/src/main/scala/sbt/internal/CommandExchange.scala b/main/src/main/scala/sbt/internal/CommandExchange.scala index 69cb89477..cfc48c69a 100644 --- a/main/src/main/scala/sbt/internal/CommandExchange.scala +++ b/main/src/main/scala/sbt/internal/CommandExchange.scala @@ -9,6 +9,7 @@ package sbt package internal import java.io.IOException +import java.nio.file.Files import java.util.concurrent.ConcurrentLinkedQueue import java.util.concurrent.atomic._ import scala.collection.mutable.ListBuffer @@ -23,6 +24,7 @@ import BasicKeys.{ logLevel } import java.net.Socket +import org.scalasbt.ipcsocket.UnixDomainSocketLibrary import sjsonnew.JsonFormat import sjsonnew.shaded.scalajson.ast.unsafe._ import scala.concurrent.Await @@ -32,7 +34,7 @@ import sbt.io.syntax._ import sbt.io.{ Hash, IO } import sbt.internal.server._ import sbt.internal.langserver.{ LogMessageParams, MessageType } -import sbt.internal.util.{ StringEvent, ObjectEvent, MainAppender } +import sbt.internal.util.{ StringEvent, ObjectEvent, MainAppender, Util } import sbt.internal.util.codec.JValueFormats import sbt.protocol.{ EventMessage, ExecStatusEvent } import sbt.util.{ Level, Logger, LogExchange } @@ -140,7 +142,18 @@ private[sbt] final class CommandExchange { val portfile = s.baseDir / "project" / "target" / "active.json" val h = Hash.halfHashString(IO.toURI(portfile).toString) val tokenfile = BuildPaths.getGlobalBase(s) / "server" / h / "token.json" - val socketfile = BuildPaths.getGlobalBase(s) / "server" / h / "sock" + val socketfile = { + val socketfile = BuildPaths.getGlobalBase(s) / "server" / h / "sock" + connectionType match { + case ConnectionType.Local if !Util.isWindows => + val maxSocketLength = new UnixDomainSocketLibrary.SockaddrUn().sunPath.length - 1 + if (socketfile.absolutePath.length > maxSocketLength) + Files.createTempFile("sbt-server", ".sock").toFile // assuming this is short enough.. + else + socketfile + case _ => socketfile + } + } val pipeName = "sbt-server-" + h val connection = ServerConnection( connectionType,