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 "" +}