mirror of
https://github.com/golang/go
synced 2024-09-05 16:04:50 +00:00
syscall: use fcntl F_DUP2FD_CLOEXEC in forkAndExecInChild on dragonfly
Use fcntl(oldfd, F_DUP2FD_CLOEXEC, newfd) to duplicate the file descriptor and mark is as close-on-exec instead of dup2 & fcntl. DragonFly BSD implements dup3 like this in libc since version 5.4. Change-Id: I80c765faa288add8ffb236284c9e8c4f8e6c6769 Reviewed-on: https://go-review.googlesource.com/c/go/+/430535 Auto-Submit: Tobias Klauser <tobias.klauser@gmail.com> Reviewed-by: Jenny Rakoczy <jenny@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Jenny Rakoczy <jenny@golang.org> Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> Auto-Submit: Jenny Rakoczy <jenny@golang.org> Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
parent
95ec579eb6
commit
f15582c477
|
@ -184,6 +184,8 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
|
|||
if pipe < nextfd {
|
||||
if runtime.GOOS == "netbsd" || (runtime.GOOS == "openbsd" && runtime.GOARCH == "mips64") {
|
||||
_, _, err1 = RawSyscall(_SYS_DUP3, uintptr(pipe), uintptr(nextfd), O_CLOEXEC)
|
||||
} else if runtime.GOOS == "dragonfly" {
|
||||
_, _, err1 = RawSyscall(SYS_FCNTL, uintptr(pipe), _F_DUP2FD_CLOEXEC, uintptr(nextfd))
|
||||
} else {
|
||||
_, _, err1 = RawSyscall(SYS_DUP2, uintptr(pipe), uintptr(nextfd), 0)
|
||||
if err1 != 0 {
|
||||
|
@ -204,6 +206,8 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
|
|||
}
|
||||
if runtime.GOOS == "netbsd" || (runtime.GOOS == "openbsd" && runtime.GOARCH == "mips64") {
|
||||
_, _, err1 = RawSyscall(_SYS_DUP3, uintptr(fd[i]), uintptr(nextfd), O_CLOEXEC)
|
||||
} else if runtime.GOOS == "dragonfly" {
|
||||
_, _, err1 = RawSyscall(SYS_FCNTL, uintptr(fd[i]), _F_DUP2FD_CLOEXEC, uintptr(nextfd))
|
||||
} else {
|
||||
_, _, err1 = RawSyscall(SYS_DUP2, uintptr(fd[i]), uintptr(nextfd), 0)
|
||||
if err1 != 0 {
|
||||
|
|
|
@ -22,7 +22,10 @@ func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
|
|||
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
|
||||
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
|
||||
|
||||
const _SYS_DUP3 = 0
|
||||
const (
|
||||
_SYS_DUP3 = 0
|
||||
_F_DUP2FD_CLOEXEC = F_DUP2FD_CLOEXEC
|
||||
)
|
||||
|
||||
// See version list in https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/sys/sys/param.h
|
||||
var (
|
||||
|
|
|
@ -20,7 +20,10 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr,
|
|||
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
|
||||
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
|
||||
|
||||
const _SYS_DUP3 = SYS_DUP3
|
||||
const (
|
||||
_SYS_DUP3 = SYS_DUP3
|
||||
_F_DUP2FD_CLOEXEC = 0
|
||||
)
|
||||
|
||||
type SockaddrDatalink struct {
|
||||
Len uint8
|
||||
|
|
|
@ -4,7 +4,10 @@
|
|||
|
||||
package syscall
|
||||
|
||||
const _SYS_DUP3 = SYS_DUP3
|
||||
const (
|
||||
_SYS_DUP3 = SYS_DUP3
|
||||
_F_DUP2FD_CLOEXEC = 0
|
||||
)
|
||||
|
||||
func setTimespec(sec, nsec int64) Timespec {
|
||||
return Timespec{Sec: sec, Nsec: nsec}
|
||||
|
|
Loading…
Reference in a new issue