From 9e753a0d44b025d3d2ac585e42f62d480be48cbb Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Wed, 25 Apr 2018 17:50:47 +0900 Subject: [PATCH] Implement ttyname() in case /dev/tty is not available Close #1266 Close #447 --- src/tui/light.go | 6 ++++++ src/tui/ttyname_unix.go | 31 +++++++++++++++++++++++++++++++ src/tui/ttyname_windows.go | 7 +++++++ 3 files changed, 44 insertions(+) create mode 100644 src/tui/ttyname_unix.go create mode 100644 src/tui/ttyname_windows.go diff --git a/src/tui/light.go b/src/tui/light.go index a96a8440..e223f4ab 100644 --- a/src/tui/light.go +++ b/src/tui/light.go @@ -32,6 +32,12 @@ var offsetRegexp *regexp.Regexp = regexp.MustCompile("\x1b\\[([0-9]+);([0-9]+)R" func openTtyIn() *os.File { in, err := os.OpenFile(consoleDevice, syscall.O_RDONLY, 0) if err != nil { + tty := ttyname() + if len(tty) > 0 { + if in, err := os.OpenFile(tty, syscall.O_RDONLY, 0); err == nil { + return in + } + } fmt.Fprintln(os.Stderr, "Failed to open "+consoleDevice) os.Exit(2) } diff --git a/src/tui/ttyname_unix.go b/src/tui/ttyname_unix.go new file mode 100644 index 00000000..69bdfa54 --- /dev/null +++ b/src/tui/ttyname_unix.go @@ -0,0 +1,31 @@ +// +build !windows + +package tui + +import ( + "io/ioutil" + "syscall" +) + +var devPrefixes = [...]string{"/dev/pts/", "/dev/"} + +func ttyname() string { + var stderr syscall.Stat_t + if syscall.Fstat(2, &stderr) != nil { + return "" + } + + for _, prefix := range devPrefixes { + files, err := ioutil.ReadDir(prefix) + if err != nil { + continue + } + + for _, file := range files { + if stat, ok := file.Sys().(*syscall.Stat_t); ok && stat.Rdev == stderr.Rdev { + return prefix + file.Name() + } + } + } + return "" +} diff --git a/src/tui/ttyname_windows.go b/src/tui/ttyname_windows.go new file mode 100644 index 00000000..5354b747 --- /dev/null +++ b/src/tui/ttyname_windows.go @@ -0,0 +1,7 @@ +// +build windows + +package tui + +func ttyname() string { + return "" +}