...
Source file src/os/signal/internal/pty/pty.go
1
2
3
4
5
6
7
8
9
10
11 package pty
12
13
19 import "C"
20
21 import (
22 "fmt"
23 "os"
24 "syscall"
25 )
26
27 type PtyError struct {
28 FuncName string
29 ErrorString string
30 Errno syscall.Errno
31 }
32
33 func ptyError(name string, err error) *PtyError {
34 return &PtyError{name, err.Error(), err.(syscall.Errno)}
35 }
36
37 func (e *PtyError) Error() string {
38 return fmt.Sprintf("%s: %s", e.FuncName, e.ErrorString)
39 }
40
41 func (e *PtyError) Unwrap() error { return e.Errno }
42
43
44 func Open() (master *os.File, slave string, err error) {
45 m, err := C.posix_openpt(C.O_RDWR)
46 if err != nil {
47 return nil, "", ptyError("posix_openpt", err)
48 }
49 if _, err := C.grantpt(m); err != nil {
50 C.close(m)
51 return nil, "", ptyError("grantpt", err)
52 }
53 if _, err := C.unlockpt(m); err != nil {
54 C.close(m)
55 return nil, "", ptyError("unlockpt", err)
56 }
57 slave = C.GoString(C.ptsname(m))
58 return os.NewFile(uintptr(m), "pty-master"), slave, nil
59 }
60
View as plain text