mirror of
https://github.com/golang/go.git
synced 2025-05-17 21:34:36 +00:00
syscall: export Tc{get,set}pgrp for testing
Provide appropriate implementations of Tc{get,set}pgrp and export these for use in the TestForeground* tests in exec_unix_test.go. This avoids calling ioctl via syscall.Syscall on BSDs. Fixes #59667 Updates #63900 Change-Id: Ice4dcedae1f0931c026bddf33043d3864a52d44e Reviewed-on: https://go-review.googlesource.com/c/go/+/572155 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@google.com> Run-TryBot: Joel Sing <joel@sing.id.au>
This commit is contained in:
parent
4f0408a3a2
commit
ac0b2f95a5
@ -34,4 +34,13 @@ func Getpgrp() (pgrp int) {
|
||||
return
|
||||
}
|
||||
|
||||
var IoctlPtr = ioctlPtr
|
||||
func Tcgetpgrp(fd int) (pgid int32, err error) {
|
||||
if errno := ioctlPtr(uintptr(fd), TIOCGPGRP, unsafe.Pointer(&pgid)); errno != 0 {
|
||||
return -1, errno
|
||||
}
|
||||
return pgid, nil
|
||||
}
|
||||
|
||||
func Tcsetpgrp(fd int, pgid int32) (err error) {
|
||||
return ioctlPtr(uintptr(fd), TIOCSPGRP, unsafe.Pointer(&pgid))
|
||||
}
|
||||
|
@ -34,4 +34,13 @@ func Getpgrp() (pgrp int) {
|
||||
return
|
||||
}
|
||||
|
||||
var IoctlPtr = ioctlPtr
|
||||
func Tcgetpgrp(fd int) (pgid int32, err error) {
|
||||
if errno := ioctlPtr(uintptr(fd), TIOCGPGRP, unsafe.Pointer(&pgid)); errno != 0 {
|
||||
return -1, errno
|
||||
}
|
||||
return pgid, nil
|
||||
}
|
||||
|
||||
func Tcsetpgrp(fd int, pgid int32) (err error) {
|
||||
return ioctlPtr(uintptr(fd), TIOCSPGRP, unsafe.Pointer(&pgid))
|
||||
}
|
||||
|
@ -19,7 +19,6 @@ import (
|
||||
"syscall"
|
||||
"testing"
|
||||
"time"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type command struct {
|
||||
@ -176,15 +175,12 @@ func TestForeground(t *testing.T) {
|
||||
}
|
||||
defer tty.Close()
|
||||
|
||||
// This should really be pid_t, however _C_int (aka int32) is generally
|
||||
// equivalent.
|
||||
fpgrp := int32(0)
|
||||
ttyFD := int(tty.Fd())
|
||||
|
||||
errno := syscall.IoctlPtr(tty.Fd(), syscall.TIOCGPGRP, unsafe.Pointer(&fpgrp))
|
||||
if errno != 0 {
|
||||
t.Fatalf("TIOCGPGRP failed with error code: %s", errno)
|
||||
fpgrp, err := syscall.Tcgetpgrp(ttyFD)
|
||||
if err != nil {
|
||||
t.Fatalf("Tcgetpgrp failed: %v", err)
|
||||
}
|
||||
|
||||
if fpgrp == 0 {
|
||||
t.Fatalf("Foreground process group is zero")
|
||||
}
|
||||
@ -194,7 +190,7 @@ func TestForeground(t *testing.T) {
|
||||
cmd := create(t)
|
||||
|
||||
cmd.proc.SysProcAttr = &syscall.SysProcAttr{
|
||||
Ctty: int(tty.Fd()),
|
||||
Ctty: ttyFD,
|
||||
Foreground: true,
|
||||
}
|
||||
cmd.Start()
|
||||
@ -217,7 +213,7 @@ func TestForeground(t *testing.T) {
|
||||
|
||||
// This call fails on darwin/arm64. The failure doesn't matter, though.
|
||||
// This is just best effort.
|
||||
syscall.IoctlPtr(tty.Fd(), syscall.TIOCSPGRP, unsafe.Pointer(&fpgrp))
|
||||
syscall.Tcsetpgrp(ttyFD, fpgrp)
|
||||
}
|
||||
|
||||
func TestForegroundSignal(t *testing.T) {
|
||||
@ -227,22 +223,19 @@ func TestForegroundSignal(t *testing.T) {
|
||||
}
|
||||
defer tty.Close()
|
||||
|
||||
// This should really be pid_t, however _C_int (aka int32) is generally
|
||||
// equivalent.
|
||||
fpgrp := int32(0)
|
||||
ttyFD := int(tty.Fd())
|
||||
|
||||
errno := syscall.IoctlPtr(tty.Fd(), syscall.TIOCGPGRP, unsafe.Pointer(&fpgrp))
|
||||
if errno != 0 {
|
||||
t.Fatalf("TIOCGPGRP failed with error code: %s", errno)
|
||||
fpgrp, err := syscall.Tcgetpgrp(ttyFD)
|
||||
if err != nil {
|
||||
t.Fatalf("Tcgetpgrp failed: %v", err)
|
||||
}
|
||||
|
||||
if fpgrp == 0 {
|
||||
t.Fatalf("Foreground process group is zero")
|
||||
}
|
||||
|
||||
defer func() {
|
||||
signal.Ignore(syscall.SIGTTIN, syscall.SIGTTOU)
|
||||
syscall.IoctlPtr(tty.Fd(), syscall.TIOCSPGRP, unsafe.Pointer(&fpgrp))
|
||||
syscall.Tcsetpgrp(ttyFD, fpgrp)
|
||||
signal.Reset()
|
||||
}()
|
||||
|
||||
@ -256,7 +249,7 @@ func TestForegroundSignal(t *testing.T) {
|
||||
|
||||
go func() {
|
||||
cmd.proc.SysProcAttr = &syscall.SysProcAttr{
|
||||
Ctty: int(tty.Fd()),
|
||||
Ctty: ttyFD,
|
||||
Foreground: true,
|
||||
}
|
||||
cmd.Start()
|
||||
|
25
src/syscall/export_bsd_test.go
Normal file
25
src/syscall/export_bsd_test.go
Normal file
@ -0,0 +1,25 @@
|
||||
// Copyright 2024 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 darwin || dragonfly || freebsd || netbsd || openbsd
|
||||
|
||||
package syscall
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// pgid should really be pid_t, however _C_int (aka int32) is generally
|
||||
// equivalent.
|
||||
|
||||
func Tcgetpgrp(fd int) (pgid int32, err error) {
|
||||
if err := ioctlPtr(fd, TIOCGPGRP, unsafe.Pointer(&pgid)); err != nil {
|
||||
return -1, err
|
||||
}
|
||||
return pgid, nil
|
||||
}
|
||||
|
||||
func Tcsetpgrp(fd int, pgid int32) (err error) {
|
||||
return ioctlPtr(fd, TIOCSPGRP, unsafe.Pointer(&pgid))
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
// Copyright 2020 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 syscall
|
||||
|
||||
import "unsafe"
|
||||
|
||||
func IoctlPtr(fd, req uintptr, arg unsafe.Pointer) Errno {
|
||||
err := ioctlPtr(int(fd), uint(req), arg)
|
||||
if err != nil {
|
||||
return err.(Errno)
|
||||
}
|
||||
return 0
|
||||
}
|
@ -4,6 +4,10 @@
|
||||
|
||||
package syscall
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
RawSyscallNoError = rawSyscallNoError
|
||||
ForceClone3 = &forceClone3
|
||||
@ -12,3 +16,19 @@ var (
|
||||
const (
|
||||
Sys_GETEUID = sys_GETEUID
|
||||
)
|
||||
|
||||
func Tcgetpgrp(fd int) (pgid int32, err error) {
|
||||
_, _, errno := Syscall6(SYS_IOCTL, uintptr(fd), uintptr(TIOCGPGRP), uintptr(unsafe.Pointer(&pgid)), 0, 0, 0)
|
||||
if errno != 0 {
|
||||
return -1, errno
|
||||
}
|
||||
return pgid, nil
|
||||
}
|
||||
|
||||
func Tcsetpgrp(fd int, pgid int32) (err error) {
|
||||
_, _, errno := Syscall6(SYS_IOCTL, uintptr(fd), uintptr(TIOCSPGRP), uintptr(unsafe.Pointer(&pgid)), 0, 0, 0)
|
||||
if errno != 0 {
|
||||
return errno
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -1,14 +0,0 @@
|
||||
// Copyright 2015 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 dragonfly || freebsd || linux || netbsd || openbsd
|
||||
|
||||
package syscall
|
||||
|
||||
import "unsafe"
|
||||
|
||||
func IoctlPtr(fd, req uintptr, arg unsafe.Pointer) (err Errno) {
|
||||
_, _, err = Syscall(SYS_IOCTL, fd, req, uintptr(arg))
|
||||
return err
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user