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