github.com/rck/u-root@v0.0.0-20180106144920-7eb602e381bb/pkg/termios/termios_linux.go (about)

     1  // Copyright 2015-2017 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package termios
     6  
     7  import (
     8  	"os"
     9  
    10  	"golang.org/x/sys/unix"
    11  )
    12  
    13  type TTY struct {
    14  	f *os.File
    15  }
    16  
    17  func New() (*TTY, error) {
    18  	f, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  	t := &TTY{f: f}
    23  
    24  	return t, nil
    25  }
    26  
    27  func GetTermios(fd uintptr) (*unix.Termios, error) {
    28  	return unix.IoctlGetTermios(int(fd), unix.TCGETS)
    29  }
    30  
    31  func (t *TTY) Get() (*unix.Termios, error) {
    32  	return GetTermios(t.f.Fd())
    33  }
    34  
    35  func SetTermios(fd uintptr, ti *unix.Termios) error {
    36  	return unix.IoctlSetTermios(int(fd), unix.TCSETS, ti)
    37  }
    38  
    39  func (t *TTY) Set(ti *unix.Termios) error {
    40  	return SetTermios(t.f.Fd(), ti)
    41  }
    42  
    43  func MakeRaw(term *unix.Termios) *unix.Termios {
    44  	raw := *term
    45  	raw.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
    46  	raw.Oflag &^= unix.OPOST
    47  	raw.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
    48  	raw.Cflag &^= unix.CSIZE | unix.PARENB
    49  	raw.Cflag |= unix.CS8
    50  
    51  	raw.Cc[unix.VMIN] = 1
    52  	raw.Cc[unix.VTIME] = 0
    53  
    54  	return &raw
    55  }
    56  
    57  func GetWinSize(fd uintptr) (*unix.Winsize, error) {
    58  	return unix.IoctlGetWinsize(int(fd), unix.TIOCGWINSZ)
    59  }
    60  
    61  func (t *TTY) GetWinSize() (*unix.Winsize, error) {
    62  	return GetWinSize(t.f.Fd())
    63  }
    64  
    65  func SetWinSize(fd uintptr, w *unix.Winsize) error {
    66  	return unix.IoctlSetWinsize(int(fd), unix.TIOCSWINSZ, w)
    67  }
    68  
    69  func (t *TTY) SetWinSize(w *unix.Winsize) error {
    70  	return SetWinSize(t.f.Fd(), w)
    71  }