TEXT ·libresolv_res_9_nsearch_trampoline(SB),NOSPLIT,$0-0
JMP libresolv_res_9_nsearch(SB)
+
+TEXT ·libc_grantpt_trampoline(SB),NOSPLIT,$0-0
+ JMP libc_grantpt(SB)
+
+TEXT ·libc_unlockpt_trampoline(SB),NOSPLIT,$0-0
+ JMP libc_unlockpt(SB)
+
+TEXT ·libc_ptsname_r_trampoline(SB),NOSPLIT,$0-0
+ JMP libc_ptsname_r(SB)
+
+TEXT ·libc_posix_openpt_trampoline(SB),NOSPLIT,$0-0
+ JMP libc_posix_openpt(SB)
--- /dev/null
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package unix
+
+import (
+ "internal/abi"
+ "unsafe"
+)
+
+//go:cgo_import_dynamic libc_grantpt grantpt "/usr/lib/libSystem.B.dylib"
+func libc_grantpt_trampoline()
+
+func Grantpt(fd int) error {
+ _, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_grantpt_trampoline), uintptr(fd), 0, 0, 0, 0, 0)
+ if errno != 0 {
+ return errno
+ }
+ return nil
+}
+
+//go:cgo_import_dynamic libc_unlockpt unlockpt "/usr/lib/libSystem.B.dylib"
+func libc_unlockpt_trampoline()
+
+func Unlockpt(fd int) error {
+ _, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_unlockpt_trampoline), uintptr(fd), 0, 0, 0, 0, 0)
+ if errno != 0 {
+ return errno
+ }
+ return nil
+}
+
+//go:cgo_import_dynamic libc_ptsname_r ptsname_r "/usr/lib/libSystem.B.dylib"
+func libc_ptsname_r_trampoline()
+
+func Ptsname(fd int) (string, error) {
+ buf := make([]byte, 256)
+ _, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_ptsname_r_trampoline),
+ uintptr(fd),
+ uintptr(unsafe.Pointer(&buf[0])),
+ uintptr(len(buf)-1),
+ 0, 0, 0)
+ if errno != 0 {
+ return "", errno
+ }
+ for i, c := range buf {
+ if c == 0 {
+ buf = buf[:i]
+ break
+ }
+ }
+ return string(buf), nil
+}
+
+//go:cgo_import_dynamic libc_posix_openpt posix_openpt "/usr/lib/libSystem.B.dylib"
+func libc_posix_openpt_trampoline()
+
+func PosixOpenpt(flag int) (fd int, err error) {
+ ufd, _, errno := syscall_syscall6(abi.FuncPCABI0(libc_posix_openpt_trampoline), uintptr(flag), 0, 0, 0, 0, 0)
+ if errno != 0 {
+ return -1, errno
+ }
+ return int(ufd), nil
+}
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build (aix || darwin || dragonfly || freebsd || (linux && !android) || netbsd || openbsd) && cgo
+//go:build ((aix || dragonfly || freebsd || (linux && !android) || netbsd || openbsd) && cgo) || darwin
// Package pty is a simple pseudo-terminal package for Unix systems,
// implemented by calling C functions via cgo.
// This is only used for testing the os/signal package.
package pty
-/*
-#define _XOPEN_SOURCE 600
-#include <fcntl.h>
-#include <stdlib.h>
-#include <unistd.h>
-*/
-import "C"
-
import (
"fmt"
"os"
// Open returns a control pty and the name of the linked process tty.
func Open() (pty *os.File, processTTY string, err error) {
- m, err := C.posix_openpt(C.O_RDWR)
- if err != nil {
- return nil, "", ptyError("posix_openpt", err)
- }
- if _, err := C.grantpt(m); err != nil {
- C.close(m)
- return nil, "", ptyError("grantpt", err)
- }
- if _, err := C.unlockpt(m); err != nil {
- C.close(m)
- return nil, "", ptyError("unlockpt", err)
- }
- processTTY = C.GoString(C.ptsname(m))
- return os.NewFile(uintptr(m), "pty"), processTTY, nil
+ return open()
}
--- /dev/null
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build cgo && (aix || dragonfly || freebsd || (linux && !android) || netbsd || openbsd)
+
+package pty
+
+/*
+#define _XOPEN_SOURCE 600
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+*/
+import "C"
+
+import "os"
+
+func open() (pty *os.File, processTTY string, err error) {
+ m, err := C.posix_openpt(C.O_RDWR)
+ if err != nil {
+ return nil, "", ptyError("posix_openpt", err)
+ }
+ if _, err := C.grantpt(m); err != nil {
+ C.close(m)
+ return nil, "", ptyError("grantpt", err)
+ }
+ if _, err := C.unlockpt(m); err != nil {
+ C.close(m)
+ return nil, "", ptyError("unlockpt", err)
+ }
+ processTTY = C.GoString(C.ptsname(m))
+ return os.NewFile(uintptr(m), "pty"), processTTY, nil
+}
--- /dev/null
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package pty
+
+import (
+ "internal/syscall/unix"
+ "os"
+ "syscall"
+)
+
+func open() (pty *os.File, processTTY string, err error) {
+ m, err := unix.PosixOpenpt(syscall.O_RDWR)
+ if err != nil {
+ return nil, "", ptyError("posix_openpt", err)
+ }
+ if err := unix.Grantpt(m); err != nil {
+ syscall.Close(m)
+ return nil, "", ptyError("grantpt", err)
+ }
+ if err := unix.Unlockpt(m); err != nil {
+ syscall.Close(m)
+ return nil, "", ptyError("unlockpt", err)
+ }
+ processTTY, err = unix.Ptsname(m)
+ if err != nil {
+ syscall.Close(m)
+ return nil, "", ptyError("ptsname", err)
+ }
+ return os.NewFile(uintptr(m), "pty"), processTTY, nil
+}