Source File
exec_libc2.go
Belonging Package
syscall
package syscall
import (
)
type SysProcAttr struct {
Chroot string // Chroot.
Credential *Credential // Credential.
Ptrace bool // Enable tracing.
Foreground bool
Pgid int // Child's process group ID if Setpgid.
}
func ()
func ()
func ()
runtime_BeforeFork()
, _, = rawSyscall(funcPC(libc_fork_trampoline), 0, 0, 0)
if != 0 {
runtime_AfterFork()
return 0,
}
runtime_AfterFork()
return int(), 0
}
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
}
}
_, _, = 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 == { // don't stomp on pipe
++
}
_, _, = 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
}
_, _, = 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_write_trampoline), uintptr(), uintptr(unsafe.Pointer(&)), unsafe.Sizeof())
for {
rawSyscall(funcPC(libc_exit_trampoline), 253, 0, 0)
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |