1// Copyright 2017 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package testpty
6
7import (
8	"internal/syscall/unix"
9	"os"
10	"syscall"
11)
12
13func open() (pty *os.File, processTTY string, err error) {
14	m, err := unix.PosixOpenpt(syscall.O_RDWR)
15	if err != nil {
16		return nil, "", ptyError("posix_openpt", err)
17	}
18	if err := unix.Grantpt(m); err != nil {
19		syscall.Close(m)
20		return nil, "", ptyError("grantpt", err)
21	}
22	if err := unix.Unlockpt(m); err != nil {
23		syscall.Close(m)
24		return nil, "", ptyError("unlockpt", err)
25	}
26	processTTY, err = unix.Ptsname(m)
27	if err != nil {
28		syscall.Close(m)
29		return nil, "", ptyError("ptsname", err)
30	}
31	return os.NewFile(uintptr(m), "pty"), processTTY, nil
32}
33