From d1a955a534133ab25274cc97cb53e93c905473e4 Mon Sep 17 00:00:00 2001 From: better0fdead Date: Fri, 28 Oct 2022 14:42:06 +0300 Subject: [PATCH] connect: add fix for long socket paths Now relative path is used instead of real for console socket. It is used to prevent console socket path from being too long. Closes #124 --- cli/connector/connector.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/cli/connector/connector.go b/cli/connector/connector.go index 769b31841..3d7dbf0cc 100644 --- a/cli/connector/connector.go +++ b/cli/connector/connector.go @@ -3,6 +3,9 @@ package connector import ( "fmt" "net" + "os" + "path/filepath" + "runtime" "time" "github.com/tarantool/go-tarantool" @@ -10,6 +13,8 @@ import ( const ( greetingOperationTimeout = 3 * time.Second + maxSocketPathLinux = 108 + maxSocketPathMac = 106 ) // RequestOpts describes the parameters of a request to be executed. @@ -37,6 +42,29 @@ type Connector interface { // Connect connects to the tarantool instance according to options. func Connect(opts ConnectOpts) (Connector, error) { + // It became common that address is longer than 108 symbols(sun_path limit). + // To reduce length of address we use relative path + // with chdir into a directory of socket. + // e.g foo/bar/123.sock -> ./123.sock + workDir, err := os.Getwd() + if err != nil { + return nil, err + } + + maxSocketPath := maxSocketPathLinux + if runtime.GOOS == "darwin" { + maxSocketPath = maxSocketPathMac + } + + if _, err := os.Stat(opts.Address); err == nil { + os.Chdir(filepath.Dir(opts.Address)) + opts.Address = "./" + filepath.Base(opts.Address) + if len(opts.Address)+1 > maxSocketPath { + return nil, fmt.Errorf("socket name is longer than %d symbols: %s", + maxSocketPath-3, filepath.Base(opts.Address)) + } + defer os.Chdir(workDir) + } // Connect to specified address. greetingConn, err := net.Dial(opts.Network, opts.Address) if err != nil {