Skip to content

Commit

Permalink
syscall: export Tc{get,set}pgrp for testing
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: David Chase <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
Reviewed-by: Ian Lance Taylor <[email protected]>
Run-TryBot: Joel Sing <[email protected]>
  • Loading branch information
4a6f656c committed Mar 22, 2024
1 parent 4f0408a commit ac0b2f9
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 50 deletions.
11 changes: 10 additions & 1 deletion src/syscall/exec_aix_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
11 changes: 10 additions & 1 deletion src/syscall/exec_solaris_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
31 changes: 12 additions & 19 deletions src/syscall/exec_unix_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
"syscall"
"testing"
"time"
"unsafe"
)

type command struct {
Expand Down Expand Up @@ -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")
}
Expand All @@ -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()
Expand All @@ -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) {
Expand All @@ -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()
}()

Expand All @@ -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()
Expand Down
25 changes: 25 additions & 0 deletions src/syscall/export_bsd_test.go
Original file line number Diff line number Diff line change
@@ -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))
}
15 changes: 0 additions & 15 deletions src/syscall/export_darwin_test.go

This file was deleted.

20 changes: 20 additions & 0 deletions src/syscall/export_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

package syscall

import (
"unsafe"
)

var (
RawSyscallNoError = rawSyscallNoError
ForceClone3 = &forceClone3
Expand All @@ -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
}
14 changes: 0 additions & 14 deletions src/syscall/export_unix_test.go

This file was deleted.

0 comments on commit ac0b2f9

Please sign in to comment.