package syscall
import (
)
type SysProcAttr struct {
Chroot string
Credential *Credential
Ptrace bool
Setsid bool
Setpgid bool
Setctty bool
Noctty bool
Ctty int
Foreground bool
Pgid int
}
func ()
func ()
func ()
func ( *byte, , []*byte, , *byte, *ProcAttr, *SysProcAttr, int) ( int, Errno) {
var (
uintptr
Errno
int
int
)
:= make([]int, len(.Files))
= len(.Files)
for , := range .Files {
if < int() {
= int()
}
[] = int()
}
++
runtime_BeforeFork()
, _, = rawSyscall(funcPC(libc_fork_trampoline), 0, 0, 0)
if != 0 {
runtime_AfterFork()
return 0,
}
if != 0 {
runtime_AfterFork()
return int(), 0
}
runtime_AfterForkInChild()
if .Ptrace {
if := ptrace(PTRACE_TRACEME, 0, 0, 0); != nil {
= .(Errno)
goto
}
}
if .Setsid {
_, _, = rawSyscall(funcPC(libc_setsid_trampoline), 0, 0, 0)
if != 0 {
goto
}
}
if .Setpgid || .Foreground {
_, _, = rawSyscall(funcPC(libc_setpgid_trampoline), 0, uintptr(.Pgid), 0)
if != 0 {
goto
}
}
if .Foreground {
:= .Pgid
if == 0 {
, _, = rawSyscall(funcPC(libc_getpid_trampoline), 0, 0, 0)
if != 0 {
goto
}
= int()
}
_, _, = rawSyscall(funcPC(libc_ioctl_trampoline), uintptr(.Ctty), uintptr(TIOCSPGRP), uintptr(unsafe.Pointer(&)))
if != 0 {
goto
}
}
if != nil {
_, _, = rawSyscall(funcPC(libc_chroot_trampoline), uintptr(unsafe.Pointer()), 0, 0)
if != 0 {
goto
}
}
if := .Credential; != nil {
:= uintptr(len(.Groups))
:= uintptr(0)
if > 0 {
= uintptr(unsafe.Pointer(&.Groups[0]))
}
if !.NoSetGroups {
_, _, = rawSyscall(funcPC(libc_setgroups_trampoline), , , 0)
if != 0 {
goto
}
}
_, _, = rawSyscall(funcPC(libc_setgid_trampoline), uintptr(.Gid), 0, 0)
if != 0 {
goto
}
_, _, = rawSyscall(funcPC(libc_setuid_trampoline), uintptr(.Uid), 0, 0)
if != 0 {
goto
}
}
if != nil {
_, _, = rawSyscall(funcPC(libc_chdir_trampoline), uintptr(unsafe.Pointer()), 0, 0)
if != 0 {
goto
}
}
if < {
_, _, = rawSyscall(funcPC(libc_dup2_trampoline), uintptr(), uintptr(), 0)
if != 0 {
goto
}
rawSyscall(funcPC(libc_fcntl_trampoline), uintptr(), F_SETFD, FD_CLOEXEC)
=
++
}
for = 0; < len(); ++ {
if [] >= 0 && [] < int() {
if == {
++
}
_, _, = rawSyscall(funcPC(libc_dup2_trampoline), uintptr([]), uintptr(), 0)
if != 0 {
goto
}
rawSyscall(funcPC(libc_fcntl_trampoline), uintptr(), F_SETFD, FD_CLOEXEC)
[] =
++
}
}
for = 0; < len(); ++ {
if [] == -1 {
rawSyscall(funcPC(libc_close_trampoline), uintptr(), 0, 0)
continue
}
if [] == int() {
_, _, = rawSyscall(funcPC(libc_fcntl_trampoline), uintptr([]), F_SETFD, 0)
if != 0 {
goto
}
continue
}
_, _, = rawSyscall(funcPC(libc_dup2_trampoline), uintptr([]), uintptr(), 0)
if != 0 {
goto
}
}
for = len(); < 3; ++ {
rawSyscall(funcPC(libc_close_trampoline), uintptr(), 0, 0)
}
if .Noctty {
_, _, = rawSyscall(funcPC(libc_ioctl_trampoline), 0, uintptr(TIOCNOTTY), 0)
if != 0 {
goto
}
}
if .Setctty {
_, _, = rawSyscall(funcPC(libc_ioctl_trampoline), uintptr(.Ctty), uintptr(TIOCSCTTY), 0)
if != 0 {
goto
}
}
_, _, = rawSyscall(funcPC(libc_execve_trampoline),
uintptr(unsafe.Pointer()),
uintptr(unsafe.Pointer(&[0])),
uintptr(unsafe.Pointer(&[0])))
:
rawSyscall(funcPC(libc_write_trampoline), uintptr(), uintptr(unsafe.Pointer(&)), unsafe.Sizeof())
for {
rawSyscall(funcPC(libc_exit_trampoline), 253, 0, 0)
}
}