diff options
| author | Junegunn Choi <junegunn.c@gmail.com> | 2025-10-09 01:05:26 +0900 |
|---|---|---|
| committer | Junegunn Choi <junegunn.c@gmail.com> | 2025-10-09 01:07:59 +0900 |
| commit | 01cb38a5fb11224807452be28122de7066e1a2fa (patch) | |
| tree | 4f65383763500e10c21cb1dcfde6cd8f37ff9faf /src | |
| parent | c38c6cad794c040e5ef66485922f4d1a9fdab678 (diff) | |
| download | fzf-01cb38a5fb11224807452be28122de7066e1a2fa.tar.gz | |
Add Unix domain socket support for --listen
Close #4541
Diffstat (limited to 'src')
| -rw-r--r-- | src/options.go | 4 | ||||
| -rw-r--r-- | src/server.go | 48 | ||||
| -rw-r--r-- | src/terminal.go | 7 |
3 files changed, 41 insertions, 18 deletions
diff --git a/src/options.go b/src/options.go index a0b6f514..c1f75585 100644 --- a/src/options.go +++ b/src/options.go @@ -206,7 +206,9 @@ Usage: fzf [options] ADVANCED --with-shell=STR Shell command and flags to start child processes with - --listen[=[ADDR:]PORT] Start HTTP server to receive actions (POST /) + --listen[=SOCKET_PATH] Start HTTP server to receive actions via Unix domain socket + (Path should end with .sock) + --listen[=[ADDR:]PORT] Start HTTP server to receive actions via TCP (To allow remote process execution, use --listen-unsafe) DIRECTORY TRAVERSAL (Only used when $FZF_DEFAULT_COMMAND is not set) diff --git a/src/server.go b/src/server.go index 5757e160..9f1200da 100644 --- a/src/server.go +++ b/src/server.go @@ -46,15 +46,20 @@ type httpServer struct { type listenAddress struct { host string port int + sock string } func (addr listenAddress) IsLocal() bool { - return addr.host == "localhost" || addr.host == "127.0.0.1" + return addr.host == "localhost" || addr.host == "127.0.0.1" || len(addr.sock) > 0 } -var defaultListenAddr = listenAddress{"localhost", 0} +var defaultListenAddr = listenAddress{"localhost", 0, ""} func parseListenAddress(address string) (listenAddress, error) { + if strings.HasSuffix(address, ".sock") { + return listenAddress{"", 0, address}, nil + } + parts := strings.SplitN(address, ":", 3) if len(parts) == 1 { parts = []string{"localhost", parts[0]} @@ -70,7 +75,7 @@ func parseListenAddress(address string) (listenAddress, error) { if len(parts[0]) == 0 { parts[0] = "localhost" } - return listenAddress{parts[0], port}, nil + return listenAddress{parts[0], port, ""}, nil } func startHttpServer(address listenAddress, actionChannel chan []*action, getHandler func(getParams) string) (net.Listener, int, error) { @@ -80,21 +85,32 @@ func startHttpServer(address listenAddress, actionChannel chan []*action, getHan if !address.IsLocal() && len(apiKey) == 0 { return nil, port, errors.New("FZF_API_KEY is required to allow remote access") } - addrStr := fmt.Sprintf("%s:%d", host, port) - listener, err := net.Listen("tcp", addrStr) - if err != nil { - return nil, port, fmt.Errorf("failed to listen on %s", addrStr) - } - if port == 0 { - addr := listener.Addr().String() - parts := strings.Split(addr, ":") - if len(parts) < 2 { - return nil, port, fmt.Errorf("cannot extract port: %s", addr) + + var listener net.Listener + var err error + if len(address.sock) > 0 { + os.Remove(address.sock) + listener, err = net.Listen("unix", address.sock) + if err != nil { + return nil, 0, fmt.Errorf("failed to listen on %s", address.sock) } - var err error - port, err = strconv.Atoi(parts[len(parts)-1]) + } else { + addrStr := fmt.Sprintf("%s:%d", host, port) + listener, err = net.Listen("tcp", addrStr) if err != nil { - return nil, port, err + return nil, port, fmt.Errorf("failed to listen on %s", addrStr) + } + if port == 0 { + addr := listener.Addr().String() + parts := strings.Split(addr, ":") + if len(parts) < 2 { + return nil, port, fmt.Errorf("cannot extract port: %s", addr) + } + var err error + port, err = strconv.Atoi(parts[len(parts)-1]) + if err != nil { + return nil, port, err + } } } diff --git a/src/terminal.go b/src/terminal.go index 9a014d14..cf95623c 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -1268,7 +1268,9 @@ func NewTerminal(opts *Options, eventBox *util.EventBox, executor *util.Executor return nil, err } t.listener = listener - t.listenPort = &port + if port > 0 { + t.listenPort = &port + } } if t.hasStartActions { @@ -1292,6 +1294,9 @@ func (t *Terminal) environForPreview() []string { func (t *Terminal) environImpl(forPreview bool) []string { env := os.Environ() + if t.listenAddr != nil && len(t.listenAddr.sock) > 0 { + env = append(env, "FZF_SOCK="+t.listenAddr.sock) + } if t.listenPort != nil { env = append(env, fmt.Sprintf("FZF_PORT=%d", *t.listenPort)) } |
