{"record":{"id":"5bd3e36ecc198588","repo":"wavetermdev/waveterm","slug":"error-creating-listener-at-v-v","errorCode":null,"errorMessage":"error creating listener at %v: %v","messagePattern":"error creating listener at (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/wsh/cmd/wshcmd-connserver.go","lineNumber":127,"sourceCode":"\t\tdefer ticker.Stop()\n\n\t\tfor range ticker.C {\n\t\t\tcleanupOldJobLogs()\n\t\t}\n\t}()\n}\n\nfunc getRemoteDomainSocketName() string {\n\thomeDir := wavebase.GetHomeDir()\n\treturn filepath.Join(homeDir, wavebase.RemoteWaveHomeDirName, wavebase.RemoteDomainSocketBaseName)\n}\n\nfunc MakeRemoteUnixListener() (net.Listener, error) {\n\tserverAddr := getRemoteDomainSocketName()\n\tos.Remove(serverAddr) // ignore error\n\trtn, err := net.Listen(\"unix\", serverAddr)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error creating listener at %v: %v\", serverAddr, err)\n\t}\n\tos.Chmod(serverAddr, 0700)\n\tlog.Printf(\"Server [unix-domain] listening on %s\\n\", serverAddr)\n\treturn rtn, nil\n}\n\nfunc handleNewListenerConn(conn net.Conn, router *wshutil.WshRouter) {\n\tdefer func() {\n\t\tpanichandler.PanicHandler(\"handleNewListenerConn\", recover())\n\t}()\n\tvar linkIdContainer atomic.Int32\n\tproxy := wshutil.MakeRpcProxy(fmt.Sprintf(\"connserver:%s\", conn.RemoteAddr().String()))\n\tgo func() {\n\t\tdefer func() {\n\t\t\tpanichandler.PanicHandler(\"handleNewListenerConn:AdaptOutputChToStream\", recover())\n\t\t}()\n\t\twriteErr := wshutil.AdaptOutputChToStream(proxy.ToRemoteCh, conn)\n\t\tif writeErr != nil {","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/cmd/wsh/cmd/wshcmd-connserver.go#L109-L145","documentation":"Returned by MakeRemoteUnixListener when net.Listen(\"unix\", serverAddr) fails while creating the remote wsh domain socket. The path is derived from getRemoteDomainSocketName() and any stale socket is removed first; failure means the OS refused to bind the unix socket at that path.","triggerScenarios":"The socket path's parent directory does not exist, the path exceeds unix socket path limits (108 bytes), permission denied on the directory, or the address is already in use by a live process.","commonSituations":"Running the connserver in a container/sandbox with a read-only or missing temp dir, another wshserver instance still holding the socket, overly restrictive permissions, deeply nested paths making the socket name too long.","solutions":["Check whether another process is bound to the socket (`ss -x | grep <sockname>` or lsof) and kill the stale holder","Ensure the socket's parent directory exists and is writable by the current user","Shorten the socket path if it exceeds the ~108-char unix socket limit","Remove a stale socket file manually if os.Remove failed (e.g. permissions) and retry"],"exampleFix":"// before\nos.Remove(serverAddr) // ignore error\nrtn, err := net.Listen(\"unix\", serverAddr)\n// after\nif dir := filepath.Dir(serverAddr); dir != \".\" {\n    os.MkdirAll(dir, 0700)\n}\nos.Remove(serverAddr)\nrtn, err := net.Listen(\"unix\", serverAddr)","handlingStrategy":"fallback","validationCode":"sockDir := filepath.Dir(getRemoteDomainSocketName())\nif info, err := os.Stat(sockDir); err != nil || !info.IsDir() {\n    os.MkdirAll(sockDir, 0700)\n}\nif len(serverAddr) >= 108 {\n    return fmt.Errorf(\"socket path too long (%d chars): %s\", len(serverAddr), serverAddr)\n}","typeGuard":null,"tryCatchPattern":"ln, err := MakeRemoteUnixListener()\nif err != nil {\n    var oe *net.OpError\n    if errors.As(err, &oe) && os.IsExist(oe.Err) {\n        os.Remove(getRemoteDomainSocketName())\n        ln, err = MakeRemoteUnixListener() // retry once after removing stale socket\n    }\n    if err != nil {\n        return err\n    }\n}","preventionTips":["Ensure the socket directory exists and is writable before startup","Keep socket paths short (under ~108 chars)","Clean up stale sockets on shutdown and on startup","Run only one connserver instance per user/host"],"tags":["unix-socket","network","filesystem","permissions"],"backgroundTag":"address-already-in-use","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}