github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/pkg/termios/termios_plan9.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 // +build plan9 6 7 package termios 8 9 import ( 10 "fmt" 11 "os" 12 "path/filepath" 13 ) 14 15 // Termios is used to manipulate the control channel of a kernel. 16 type Termios struct { 17 } 18 19 // Winsize holds the window size information, it is modeled on unix.Winsize. 20 type Winsize struct { 21 Row uint16 22 Col uint16 23 Xpixel uint16 24 Ypixel uint16 25 } 26 27 // TTYIO is a wrapper that only allows Read and Write. 28 type TTYIO struct { 29 f *os.File 30 } 31 32 // New creates a new TTYIO using /dev/tty 33 func New() (*TTYIO, error) { 34 return NewWithDev("/dev/cons") 35 } 36 37 // NewWithDev creates a new TTYIO with the specified device 38 func NewWithDev(device string) (*TTYIO, error) { 39 f, err := os.OpenFile(device, os.O_RDWR, 0) 40 if err != nil { 41 return nil, err 42 } 43 return &TTYIO{f: f}, nil 44 } 45 46 // NewTTYS returns a new TTYIO. 47 func NewTTYS(port string) (*TTYIO, error) { 48 f, err := os.OpenFile(filepath.Join("/dev", port), os.O_RDWR, 0620) 49 if err != nil { 50 return nil, err 51 } 52 return &TTYIO{f: f}, nil 53 } 54 55 // GetTermios returns a filled-in Termios, from an fd. 56 func GetTermios(fd uintptr) (*Termios, error) { 57 return &Termios{}, nil 58 } 59 60 // Get terms a Termios from a TTYIO. 61 func (t *TTYIO) Get() (*Termios, error) { 62 return GetTermios(t.f.Fd()) 63 } 64 65 // SetTermios sets tty parameters for an fd from a Termios. 66 func SetTermios(fd uintptr, ti *Termios) error { 67 return fmt.Errorf("Plan 9: not yet") 68 } 69 70 // Set sets tty parameters for a TTYIO from a Termios. 71 func (t *TTYIO) Set(ti *Termios) error { 72 return SetTermios(t.f.Fd(), ti) 73 } 74 75 // GetWinSize gets window size from an fd. 76 func GetWinSize(fd uintptr) (*Winsize, error) { 77 return nil, fmt.Errorf("Plan 9: not yet") 78 } 79 80 // GetWinSize gets window size from a TTYIO. 81 func (t *TTYIO) GetWinSize() (*Winsize, error) { 82 return GetWinSize(t.f.Fd()) 83 } 84 85 // SetWinSize sets window size for an fd from a Winsize. 86 func SetWinSize(fd uintptr, w *Winsize) error { 87 return fmt.Errorf("Plan 9: not yet") 88 } 89 90 // SetWinSize sets window size for a TTYIO from a Winsize. 91 func (t *TTYIO) SetWinSize(w *Winsize) error { 92 return SetWinSize(t.f.Fd(), w) 93 } 94 95 // MakeRaw modifies Termio state so, if it used for an fd or tty, it will set it to raw mode. 96 func MakeRaw(term *Termios) *Termios { 97 raw := *term 98 return &raw 99 } 100 101 // MakeSerialBaud updates the Termios to set the baudrate 102 func MakeSerialBaud(term *Termios, baud int) (*Termios, error) { 103 t := *term 104 105 return &t, nil 106 } 107 108 // MakeSerialDefault updates the Termios to typical serial configuration: 109 // - Ignore all flow control (modem, hardware, software...) 110 // - Translate carriage return to newline on input 111 // - Enable canonical mode: Input is available line by line, with line editing 112 // enabled (ERASE, KILL are supported) 113 // - Local ECHO is added (and handled by line editing) 114 // - Map newline to carriage return newline on output 115 func MakeSerialDefault(term *Termios) *Termios { 116 t := *term 117 118 return &t 119 }