diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2018-04-25 17:50:47 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2018-04-25 17:50:47 +0900 |
commit | 9e753a0d44b025d3d2ac585e42f62d480be48cbb (patch) | |
tree | 369a511e86af75c9ca94019d86153fad0077e9ff /src | |
parent | f57920ad903105381b02502580be2bb11e4e6714 (diff) |
Implement ttyname() in case /dev/tty is not available
Close #1266
Close #447
Diffstat (limited to 'src')
-rw-r--r-- | src/tui/light.go | 6 | ||||
-rw-r--r-- | src/tui/ttyname_unix.go | 31 | ||||
-rw-r--r-- | src/tui/ttyname_windows.go | 7 |
3 files changed, 44 insertions, 0 deletions
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 "" +} |