Skip to content

Commit

Permalink
Improve error management for openpty (#57)
Browse files Browse the repository at this point in the history
Signed-off-by: Guillaume J. Charmes <guillaume@charmes.net>
  • Loading branch information
creack committed Jan 13, 2018
1 parent f8811ff commit 282ce0e
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 17 deletions.
12 changes: 8 additions & 4 deletions pty_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,23 @@ func open() (pty, tty *os.File, err error) {
return nil, nil, err
}
p := os.NewFile(uintptr(pFD), "/dev/ptmx")
// 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
}

err = grantpt(p)
if err != nil {
if err := grantpt(p); err != nil {
return nil, nil, err
}

err = unlockpt(p)
if err != nil {
if err := unlockpt(p); err != nil {
return nil, nil, err
}

Expand Down
12 changes: 8 additions & 4 deletions pty_dragonfly.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,23 @@ func open() (pty, tty *os.File, err error) {
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
}

err = grantpt(p)
if err != nil {
if err := grantpt(p); err != nil {
return nil, nil, err
}

err = unlockpt(p)
if err != nil {
if err := unlockpt(p); err != nil {
return nil, nil, err
}

Expand Down
19 changes: 12 additions & 7 deletions pty_freebsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,28 @@ import (
"unsafe"
)

func posix_openpt(oflag int) (fd int, err error) {
func posixOpenpt(oflag int) (fd int, err error) {
r0, _, e1 := syscall.Syscall(syscall.SYS_POSIX_OPENPT, uintptr(oflag), 0, 0)
fd = int(r0)
if e1 != 0 {
err = e1
}
return
return fd, err
}

func open() (pty, tty *os.File, err error) {
fd, err := posix_openpt(syscall.O_RDWR | syscall.O_CLOEXEC)
fd, err := posixOpenpt(syscall.O_RDWR | syscall.O_CLOEXEC)
if err != nil {
return nil, nil, err
}

p := os.NewFile(uintptr(fd), "/dev/pts")
// In case of error after this point, make sure we close the pts fd.
defer func() {
if err != nil {
_ = p.Close() // Best effort.
}
}()

sname, err := ptsname(p)
if err != nil {
return nil, nil, err
Expand All @@ -42,7 +48,7 @@ func isptmaster(fd uintptr) (bool, error) {

var (
emptyFiodgnameArg fiodgnameArg
ioctl_FIODGNAME = _IOW('f', 120, unsafe.Sizeof(emptyFiodgnameArg))
ioctlFIODGNAME = _IOW('f', 120, unsafe.Sizeof(emptyFiodgnameArg))
)

func ptsname(f *os.File) (string, error) {
Expand All @@ -59,8 +65,7 @@ func ptsname(f *os.File) (string, error) {
buf = make([]byte, n)
arg = fiodgnameArg{Len: n, Buf: (*byte)(unsafe.Pointer(&buf[0]))}
)
err = ioctl(f.Fd(), ioctl_FIODGNAME, uintptr(unsafe.Pointer(&arg)))
if err != nil {
if err := ioctl(f.Fd(), ioctlFIODGNAME, uintptr(unsafe.Pointer(&arg))); err != nil {
return "", err
}

Expand Down
9 changes: 7 additions & 2 deletions pty_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,19 @@ func open() (pty, tty *os.File, err error) {
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
}

err = unlockpt(p)
if err != nil {
if err := unlockpt(p); err != nil {
return nil, nil, err
}

Expand Down

0 comments on commit 282ce0e

Please sign in to comment.