terminal_notwindows.go 574 B

123456789101112131415161718192021222324
  1. //go:build (linux || darwin || freebsd || openbsd || netbsd || dragonfly) && !appengine
  2. // +build linux darwin freebsd openbsd netbsd dragonfly
  3. // +build !appengine
  4. package terminal
  5. import (
  6. "io"
  7. "os"
  8. "syscall"
  9. "unsafe"
  10. )
  11. // IsTerminal returns true if stderr's file descriptor is a terminal.
  12. func IsTerminal(f io.Writer) bool {
  13. var termios Termios
  14. switch v := f.(type) {
  15. case *os.File:
  16. _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(v.Fd()), ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)
  17. return err == 0
  18. default:
  19. return false
  20. }
  21. }