mirror of
https://github.com/creack/pty.git
synced 2026-03-31 18:47:10 +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.
52 lines
1004 B
Go
52 lines
1004 B
Go
package pty
|
|
|
|
import (
|
|
"os"
|
|
"strconv"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
func open() (pty, tty *os.File, err error) {
|
|
p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
// In case of error after this point, make sure we close the ptmx fd.
|
|
defer func() {
|
|
if err != nil {
|
|
_ = p.Close() // Best effort.
|
|
}
|
|
}()
|
|
|
|
sname, err := ptsname(p)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
if err := unlockpt(p); err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
t, err := os.OpenFile(sname, os.O_RDWR|syscall.O_NOCTTY, 0)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return p, t, nil
|
|
}
|
|
|
|
func ptsname(f *os.File) (string, error) {
|
|
var n _C_uint
|
|
err := ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n)))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return "/dev/pts/" + strconv.Itoa(int(n)), nil
|
|
}
|
|
|
|
func unlockpt(f *os.File) error {
|
|
var u _C_int
|
|
// use TIOCSPTLCK with a pointer to zero to clear the lock
|
|
return ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u)))
|
|
}
|