mirror of
https://github.com/Llewellynvdm/fzf.git
synced 2024-09-29 21:49:08 +00:00
ab182e276b
Due to go std lib uses poller for os.File introducing in this commit:
c05b06a12d
There are two changes to watch out:
1. os.File.Fd will always return a blocking fd except on bsd.
2. os.File.Read won't return EAGAIN error for nonblocking fd.
So
For 1, we just get tty's fd in advance and then set its block mode.
For 2, we use read syscall directly to get what we wanted error(EAGAIN).
Fix issue #910.
Signed-off-by: Tw <tw19881113@gmail.com>
34 lines
655 B
Go
34 lines
655 B
Go
// +build !windows
|
|
|
|
package util
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"syscall"
|
|
)
|
|
|
|
// ExecCommand executes the given command with $SHELL
|
|
func ExecCommand(command string) *exec.Cmd {
|
|
shell := os.Getenv("SHELL")
|
|
if len(shell) == 0 {
|
|
shell = "sh"
|
|
}
|
|
return exec.Command(shell, "-c", command)
|
|
}
|
|
|
|
// IsWindows returns true on Windows
|
|
func IsWindows() bool {
|
|
return false
|
|
}
|
|
|
|
// SetNonBlock executes syscall.SetNonblock on file descriptor
|
|
func SetNonblock(file *os.File, nonblock bool) {
|
|
syscall.SetNonblock(int(file.Fd()), nonblock)
|
|
}
|
|
|
|
// Read executes syscall.Read on file descriptor
|
|
func Read(fd int, b []byte) (int, error) {
|
|
return syscall.Read(int(fd), b)
|
|
}
|