mirror of
https://github.com/creack/pty.git
synced 2026-03-31 10:37:09 +09:00
The words "master" and "slave" in this context are both harmful and, as a technical matter, confusing and misleading. It was never my intention to use those terms in this library, but they snuck in while I wasn't paying attention. This change replaces them with "pty" and "tty", respectively, to be consistent with the other files in this package and with the device names on BSD platforms. These terms are not harmful (to the best of my knowledge) and they're more specific. In editing the comment in pty_linux.go, this patch also corrects a factual error. The ioctl argument is not "zero valued", it is a nonzero pointer to the number 0.
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
// +build !windows
|
|
|
|
package pty
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
// InheritSize applies the terminal size of pty to tty. This should be run
|
|
// in a signal handler for syscall.SIGWINCH to automatically resize the tty when
|
|
// the pty receives a window size change notification.
|
|
func InheritSize(pty, tty *os.File) error {
|
|
size, err := GetsizeFull(pty)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = Setsize(tty, size)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Setsize resizes t to s.
|
|
func Setsize(t *os.File, ws *Winsize) error {
|
|
return windowRectCall(ws, t.Fd(), syscall.TIOCSWINSZ)
|
|
}
|
|
|
|
// GetsizeFull returns the full terminal size description.
|
|
func GetsizeFull(t *os.File) (size *Winsize, err error) {
|
|
var ws Winsize
|
|
err = windowRectCall(&ws, t.Fd(), syscall.TIOCGWINSZ)
|
|
return &ws, err
|
|
}
|
|
|
|
// Getsize returns the number of rows (lines) and cols (positions
|
|
// in each line) in terminal t.
|
|
func Getsize(t *os.File) (rows, cols int, err error) {
|
|
ws, err := GetsizeFull(t)
|
|
return int(ws.Rows), int(ws.Cols), err
|
|
}
|
|
|
|
// Winsize describes the terminal size.
|
|
type Winsize struct {
|
|
Rows uint16 // ws_row: Number of rows (in cells)
|
|
Cols uint16 // ws_col: Number of columns (in cells)
|
|
X uint16 // ws_xpixel: Width in pixels
|
|
Y uint16 // ws_ypixel: Height in pixels
|
|
}
|
|
|
|
func windowRectCall(ws *Winsize, fd, a2 uintptr) error {
|
|
_, _, errno := syscall.Syscall(
|
|
syscall.SYS_IOCTL,
|
|
fd,
|
|
a2,
|
|
uintptr(unsafe.Pointer(ws)),
|
|
)
|
|
if errno != 0 {
|
|
return syscall.Errno(errno)
|
|
}
|
|
return nil
|
|
}
|