os/signal/internal/pty: use libc (not cgo) on macOS

This package is only used by tests anyway, but might as well
remove the cgo use on macOS so that it doesn't show up as
a cgo user, as part of our overall strategy to remove cgo use
in the standard library on macOS.

Change-Id: I5a1a39ed56373385f9d43a5e17098035dc1a451a
Reviewed-on: https://go-review.googlesource.com/c/go/+/449315
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
Russ Cox 2022-11-09 15:43:54 -05:00 committed by Gopher Robot
parent 1e11eaa902
commit 059c3ed09f
5 changed files with 145 additions and 23 deletions

View File

@ -27,3 +27,15 @@ TEXT ·libresolv_res_9_nclose_trampoline(SB),NOSPLIT,$0-0
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)

View File

@ -0,0 +1,65 @@
// 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
}

View File

@ -2,21 +2,13 @@
// 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"
@ -41,18 +33,5 @@ func (e *PtyError) Unwrap() error { return e.Errno }
// 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()
}

View File

@ -0,0 +1,34 @@
// 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
}

View File

@ -0,0 +1,32 @@
// 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
}