X7ROOT File Manager
Current Path:
/opt/golang/1.19.4/src/syscall
opt
/
golang
/
1.19.4
/
src
/
syscall
/
📁
..
📄
asan.go
(410 B)
📄
asan0.go
(342 B)
📄
asm9_unix2_amd64.s
(1.24 KB)
📄
asm_aix_ppc64.s
(540 B)
📄
asm_darwin_amd64.s
(2.93 KB)
📄
asm_darwin_arm64.s
(2.83 KB)
📄
asm_freebsd_arm.s
(2.96 KB)
📄
asm_freebsd_arm64.s
(2.79 KB)
📄
asm_linux_386.s
(3.06 KB)
📄
asm_linux_amd64.s
(1.31 KB)
📄
asm_linux_arm.s
(1.74 KB)
📄
asm_linux_arm64.s
(894 B)
📄
asm_linux_loong64.s
(927 B)
📄
asm_linux_mips64x.s
(892 B)
📄
asm_linux_mipsx.s
(1.61 KB)
📄
asm_linux_ppc64x.s
(891 B)
📄
asm_linux_riscv64.s
(843 B)
📄
asm_linux_s390x.s
(2.13 KB)
📄
asm_netbsd_amd64.s
(1.02 KB)
📄
asm_netbsd_arm.s
(2.85 KB)
📄
asm_netbsd_arm64.s
(2.88 KB)
📄
asm_openbsd_386.s
(1.04 KB)
📄
asm_openbsd_amd64.s
(1.04 KB)
📄
asm_openbsd_arm.s
(1.04 KB)
📄
asm_openbsd_arm64.s
(1.04 KB)
📄
asm_openbsd_mips64.s
(2.85 KB)
📄
asm_plan9_386.s
(3.14 KB)
📄
asm_plan9_amd64.s
(3.36 KB)
📄
asm_plan9_arm.s
(3.25 KB)
📄
asm_solaris_amd64.s
(1.73 KB)
📄
asm_unix_386.s
(2.74 KB)
📄
asm_unix_amd64.s
(2.15 KB)
📄
bpf_bsd.go
(4.62 KB)
📄
bpf_darwin.go
(3.97 KB)
📄
const_plan9.go
(1.2 KB)
📄
creds_test.go
(3.37 KB)
📄
dir_plan9.go
(5.62 KB)
📄
dirent.go
(2.95 KB)
📄
dirent_test.go
(3.44 KB)
📄
dll_windows.go
(8.22 KB)
📄
endian_big.go
(249 B)
📄
endian_little.go
(309 B)
📄
env_unix.go
(2.85 KB)
📄
env_windows.go
(1.75 KB)
📄
errors_plan9.go
(1.61 KB)
📄
exec_aix_test.go
(817 B)
📄
exec_bsd.go
(7.42 KB)
📄
exec_freebsd.go
(7.79 KB)
📄
exec_libc.go
(7.74 KB)
📄
exec_libc2.go
(7.89 KB)
📄
exec_linux.go
(18.39 KB)
📄
exec_linux_test.go
(17.49 KB)
📄
exec_pdeathsig_test.go
(3 KB)
📄
exec_plan9.go
(13.25 KB)
📄
exec_solaris_test.go
(809 B)
📄
exec_unix.go
(8.75 KB)
📄
exec_unix_test.go
(7.03 KB)
📄
exec_windows.go
(11.34 KB)
📄
exec_windows_test.go
(3.1 KB)
📄
export_darwin_test.go
(314 B)
📄
export_freebsd_test.go
(304 B)
📄
export_linux_test.go
(252 B)
📄
export_unix_test.go
(347 B)
📄
export_windows_test.go
(439 B)
📄
flock.go
(704 B)
📄
flock_aix.go
(564 B)
📄
flock_darwin.go
(405 B)
📄
flock_linux_32bit.go
(511 B)
📄
forkpipe.go
(487 B)
📄
forkpipe2.go
(307 B)
📄
fs_js.go
(10.53 KB)
📄
getdirentries_test.go
(2.07 KB)
📁
js
📄
lsf_linux.go
(2.12 KB)
📄
mkall.sh
(13.19 KB)
📄
mkasm.go
(1.75 KB)
📄
mkerrors.sh
(10.67 KB)
📄
mkpost.go
(1.98 KB)
📄
mksyscall.pl
(9.94 KB)
📄
mksyscall_libc.pl
(7.96 KB)
📄
mksyscall_windows.go
(1.99 KB)
📄
mksysctl_openbsd.pl
(5.04 KB)
📄
mksysnum_dragonfly.pl
(866 B)
📄
mksysnum_freebsd.pl
(1.35 KB)
📄
mksysnum_linux.pl
(1.26 KB)
📄
mksysnum_netbsd.pl
(1.01 KB)
📄
mksysnum_openbsd.pl
(872 B)
📄
mksysnum_plan9.sh
(459 B)
📄
mmap_unix_test.go
(563 B)
📄
msan.go
(410 B)
📄
msan0.go
(342 B)
📄
net.go
(1.19 KB)
📄
net_js.go
(2.11 KB)
📄
netlink_linux.go
(4.63 KB)
📄
ptrace_darwin.go
(381 B)
📄
ptrace_ios.go
(368 B)
📄
pwd_plan9.go
(1.55 KB)
📄
route_bsd.go
(9.1 KB)
📄
route_darwin.go
(2.01 KB)
📄
route_dragonfly.go
(2.61 KB)
📄
route_freebsd.go
(2.67 KB)
📄
route_freebsd_32bit.go
(1.3 KB)
📄
route_freebsd_64bit.go
(738 B)
📄
route_netbsd.go
(1.43 KB)
📄
route_openbsd.go
(1.46 KB)
📄
security_windows.go
(10.12 KB)
📄
setuidgid_32_linux.go
(435 B)
📄
setuidgid_linux.go
(421 B)
📄
sock_cloexec_linux.go
(632 B)
📄
sockcmsg_dragonfly.go
(547 B)
📄
sockcmsg_linux.go
(1.12 KB)
📄
sockcmsg_unix.go
(2.51 KB)
📄
sockcmsg_unix_other.go
(1.08 KB)
📄
syscall.go
(3.62 KB)
📄
syscall_aix.go
(17.88 KB)
📄
syscall_aix_ppc64.go
(405 B)
📄
syscall_bsd.go
(13.55 KB)
📄
syscall_bsd_test.go
(1.17 KB)
📄
syscall_darwin.go
(11.24 KB)
📄
syscall_darwin_amd64.go
(1.92 KB)
📄
syscall_darwin_arm64.go
(1.84 KB)
📄
syscall_dragonfly.go
(8.57 KB)
📄
syscall_dragonfly_amd64.go
(1.12 KB)
📄
syscall_freebsd.go
(16.02 KB)
📄
syscall_freebsd_386.go
(1.17 KB)
📄
syscall_freebsd_amd64.go
(1.12 KB)
📄
syscall_freebsd_arm.go
(1.16 KB)
📄
syscall_freebsd_arm64.go
(1.12 KB)
📄
syscall_freebsd_test.go
(1.55 KB)
📄
syscall_illumos.go
(566 B)
📄
syscall_js.go
(6.62 KB)
📄
syscall_linux.go
(33.47 KB)
📄
syscall_linux_386.go
(9.75 KB)
📄
syscall_linux_amd64.go
(4.61 KB)
📄
syscall_linux_arm.go
(6.46 KB)
📄
syscall_linux_arm64.go
(5.94 KB)
📄
syscall_linux_loong64.go
(7 KB)
📄
syscall_linux_mips64x.go
(5.8 KB)
📄
syscall_linux_mipsx.go
(6.26 KB)
📄
syscall_linux_ppc64x.go
(4.46 KB)
📄
syscall_linux_riscv64.go
(5.63 KB)
📄
syscall_linux_s390x.go
(7.75 KB)
📄
syscall_linux_test.go
(20.17 KB)
📄
syscall_netbsd.go
(7.82 KB)
📄
syscall_netbsd_386.go
(716 B)
📄
syscall_netbsd_amd64.go
(709 B)
📄
syscall_netbsd_arm.go
(716 B)
📄
syscall_netbsd_arm64.go
(709 B)
📄
syscall_openbsd.go
(6.92 KB)
📄
syscall_openbsd1.go
(609 B)
📄
syscall_openbsd_386.go
(715 B)
📄
syscall_openbsd_amd64.go
(701 B)
📄
syscall_openbsd_arm.go
(715 B)
📄
syscall_openbsd_arm64.go
(906 B)
📄
syscall_openbsd_libc.go
(3.49 KB)
📄
syscall_openbsd_mips64.go
(934 B)
📄
syscall_plan9.go
(8.97 KB)
📄
syscall_plan9_test.go
(1.15 KB)
📄
syscall_ptrace_test.go
(768 B)
📄
syscall_solaris.go
(15.47 KB)
📄
syscall_solaris_amd64.go
(487 B)
📄
syscall_test.go
(1.44 KB)
📄
syscall_unix.go
(12.05 KB)
📄
syscall_unix_test.go
(9.43 KB)
📄
syscall_windows.go
(48.92 KB)
📄
syscall_windows_test.go
(3.38 KB)
📄
tables_js.go
(19.17 KB)
📄
time_fake.go
(677 B)
📄
time_nofake.go
(351 B)
📄
timestruct.go
(944 B)
📄
types_aix.go
(3.35 KB)
📄
types_darwin.go
(5.03 KB)
📄
types_dragonfly.go
(5.05 KB)
📄
types_freebsd.go
(6.96 KB)
📄
types_illumos_amd64.go
(379 B)
📄
types_linux.go
(10.9 KB)
📄
types_netbsd.go
(4.77 KB)
📄
types_openbsd.go
(5.04 KB)
📄
types_solaris.go
(4.88 KB)
📄
types_windows.go
(27.71 KB)
📄
types_windows_386.go
(477 B)
📄
types_windows_amd64.go
(477 B)
📄
types_windows_arm.go
(477 B)
📄
types_windows_arm64.go
(477 B)
📄
zerrors_aix_ppc64.go
(47.16 KB)
📄
zerrors_darwin_amd64.go
(55.28 KB)
📄
zerrors_darwin_arm64.go
(55.79 KB)
📄
zerrors_dragonfly_amd64.go
(59.62 KB)
📄
zerrors_freebsd_386.go
(67.35 KB)
📄
zerrors_freebsd_amd64.go
(67.4 KB)
📄
zerrors_freebsd_arm.go
(67.34 KB)
📄
zerrors_freebsd_arm64.go
(67.41 KB)
📄
zerrors_linux_386.go
(58.31 KB)
📄
zerrors_linux_amd64.go
(58.35 KB)
📄
zerrors_linux_arm.go
(58.84 KB)
📄
zerrors_linux_arm64.go
(69.52 KB)
📄
zerrors_linux_loong64.go
(83.67 KB)
📄
zerrors_linux_mips.go
(70.14 KB)
📄
zerrors_linux_mips64.go
(69.46 KB)
📄
zerrors_linux_mips64le.go
(69.46 KB)
📄
zerrors_linux_mipsle.go
(70.14 KB)
📄
zerrors_linux_ppc64.go
(71.84 KB)
📄
zerrors_linux_ppc64le.go
(72.8 KB)
📄
zerrors_linux_riscv64.go
(71.76 KB)
📄
zerrors_linux_s390x.go
(74.28 KB)
📄
zerrors_netbsd_386.go
(67.48 KB)
📄
zerrors_netbsd_amd64.go
(67.07 KB)
📄
zerrors_netbsd_arm.go
(66.49 KB)
📄
zerrors_netbsd_arm64.go
(67.07 KB)
📄
zerrors_openbsd_386.go
(62.52 KB)
📄
zerrors_openbsd_amd64.go
(62.48 KB)
📄
zerrors_openbsd_arm.go
(62.47 KB)
📄
zerrors_openbsd_arm64.go
(66.36 KB)
📄
zerrors_openbsd_mips64.go
(66.66 KB)
📄
zerrors_solaris_amd64.go
(50.72 KB)
📄
zerrors_windows.go
(9.97 KB)
📄
zsyscall_aix_ppc64.go
(40.56 KB)
📄
zsyscall_darwin_amd64.go
(51.17 KB)
📄
zsyscall_darwin_amd64.s
(8.63 KB)
📄
zsyscall_darwin_arm64.go
(51.13 KB)
📄
zsyscall_darwin_arm64.s
(8.61 KB)
📄
zsyscall_dragonfly_amd64.go
(31.19 KB)
📄
zsyscall_freebsd_386.go
(33.56 KB)
📄
zsyscall_freebsd_amd64.go
(33.42 KB)
📄
zsyscall_freebsd_arm.go
(33.58 KB)
📄
zsyscall_freebsd_arm64.go
(33.42 KB)
📄
zsyscall_linux_386.go
(34.12 KB)
📄
zsyscall_linux_amd64.go
(38.93 KB)
📄
zsyscall_linux_arm.go
(38.03 KB)
📄
zsyscall_linux_arm64.go
(37.4 KB)
📄
zsyscall_linux_loong64.go
(36.29 KB)
📄
zsyscall_linux_mips.go
(39.78 KB)
📄
zsyscall_linux_mips64.go
(39.78 KB)
📄
zsyscall_linux_mips64le.go
(39.79 KB)
📄
zsyscall_linux_mipsle.go
(39.78 KB)
📄
zsyscall_linux_ppc64.go
(40.42 KB)
📄
zsyscall_linux_ppc64le.go
(40.43 KB)
📄
zsyscall_linux_riscv64.go
(37.43 KB)
📄
zsyscall_linux_s390x.go
(34.74 KB)
📄
zsyscall_netbsd_386.go
(29.63 KB)
📄
zsyscall_netbsd_amd64.go
(29.48 KB)
📄
zsyscall_netbsd_arm.go
(29.63 KB)
📄
zsyscall_netbsd_arm64.go
(29.48 KB)
📄
zsyscall_openbsd_386.go
(47.17 KB)
📄
zsyscall_openbsd_386.s
(7.95 KB)
📄
zsyscall_openbsd_amd64.go
(47.03 KB)
📄
zsyscall_openbsd_amd64.s
(7.95 KB)
📄
zsyscall_openbsd_arm.go
(47.19 KB)
📄
zsyscall_openbsd_arm.s
(7.95 KB)
📄
zsyscall_openbsd_arm64.go
(47.03 KB)
📄
zsyscall_openbsd_arm64.s
(7.95 KB)
📄
zsyscall_openbsd_mips64.go
(30.33 KB)
📄
zsyscall_plan9_386.go
(6.17 KB)
📄
zsyscall_plan9_amd64.go
(6.18 KB)
📄
zsyscall_plan9_arm.go
(6.17 KB)
📄
zsyscall_solaris_amd64.go
(37.08 KB)
📄
zsyscall_windows.go
(56.68 KB)
📄
zsysctl_openbsd.go
(11.71 KB)
📄
zsysnum_darwin_amd64.go
(14.55 KB)
📄
zsysnum_darwin_arm64.go
(14.39 KB)
📄
zsysnum_dragonfly_amd64.go
(22.94 KB)
📄
zsysnum_freebsd_386.go
(25.65 KB)
📄
zsysnum_freebsd_amd64.go
(25.65 KB)
📄
zsysnum_freebsd_arm.go
(25.65 KB)
📄
zsysnum_freebsd_arm64.go
(36.09 KB)
📄
zsysnum_linux_386.go
(11.27 KB)
📄
zsysnum_linux_amd64.go
(10.11 KB)
📄
zsysnum_linux_arm.go
(11.55 KB)
📄
zsysnum_linux_arm64.go
(8.95 KB)
📄
zsysnum_linux_loong64.go
(10.28 KB)
📄
zsysnum_linux_mips.go
(12.1 KB)
📄
zsysnum_linux_mips64.go
(10.93 KB)
📄
zsysnum_linux_mips64le.go
(10.93 KB)
📄
zsysnum_linux_mipsle.go
(12.1 KB)
📄
zsysnum_linux_ppc64.go
(11.47 KB)
📄
zsysnum_linux_ppc64le.go
(11.49 KB)
📄
zsysnum_linux_riscv64.go
(8.88 KB)
📄
zsysnum_linux_s390x.go
(10.64 KB)
📄
zsysnum_netbsd_386.go
(25.69 KB)
📄
zsysnum_netbsd_amd64.go
(25.69 KB)
📄
zsysnum_netbsd_arm.go
(25.69 KB)
📄
zsysnum_netbsd_arm64.go
(25.69 KB)
📄
zsysnum_openbsd_386.go
(14.16 KB)
📄
zsysnum_openbsd_amd64.go
(14.16 KB)
📄
zsysnum_openbsd_arm.go
(14.46 KB)
📄
zsysnum_openbsd_arm64.go
(14.72 KB)
📄
zsysnum_openbsd_mips64.go
(14.93 KB)
📄
zsysnum_plan9.go
(1.03 KB)
📄
zsysnum_solaris_amd64.go
(293 B)
📄
ztypes_aix_ppc64.go
(4.17 KB)
📄
ztypes_darwin_amd64.go
(6.95 KB)
📄
ztypes_darwin_arm64.go
(6.95 KB)
📄
ztypes_dragonfly_amd64.go
(6.7 KB)
📄
ztypes_freebsd_386.go
(9.01 KB)
📄
ztypes_freebsd_amd64.go
(9.01 KB)
📄
ztypes_freebsd_arm.go
(9.01 KB)
📄
ztypes_freebsd_arm64.go
(9.01 KB)
📄
ztypes_linux_386.go
(11.55 KB)
📄
ztypes_linux_amd64.go
(11.92 KB)
📄
ztypes_linux_arm.go
(11.44 KB)
📄
ztypes_linux_arm64.go
(10.13 KB)
📄
ztypes_linux_loong64.go
(10.77 KB)
📄
ztypes_linux_mips.go
(9.93 KB)
📄
ztypes_linux_mips64.go
(10.05 KB)
📄
ztypes_linux_mips64le.go
(10.05 KB)
📄
ztypes_linux_mipsle.go
(9.93 KB)
📄
ztypes_linux_ppc64.go
(10.21 KB)
📄
ztypes_linux_ppc64le.go
(10.35 KB)
📄
ztypes_linux_riscv64.go
(10.2 KB)
📄
ztypes_linux_s390x.go
(10.39 KB)
📄
ztypes_netbsd_386.go
(5.99 KB)
📄
ztypes_netbsd_amd64.go
(6.17 KB)
📄
ztypes_netbsd_arm.go
(6.13 KB)
📄
ztypes_netbsd_arm64.go
(6.17 KB)
📄
ztypes_openbsd_386.go
(6.73 KB)
📄
ztypes_openbsd_amd64.go
(6.89 KB)
📄
ztypes_openbsd_arm.go
(6.84 KB)
📄
ztypes_openbsd_arm64.go
(6.66 KB)
📄
ztypes_openbsd_mips64.go
(6.66 KB)
📄
ztypes_solaris_amd64.go
(5.57 KB)
Editing: exec_libc2.go
// Copyright 2011 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 || (openbsd && !mips64) package syscall import ( "internal/abi" "runtime" "unsafe" ) type SysProcAttr struct { Chroot string // Chroot. Credential *Credential // Credential. Ptrace bool // Enable tracing. Setsid bool // Create session. // Setpgid sets the process group ID of the child to Pgid, // or, if Pgid == 0, to the new child's process ID. Setpgid bool // Setctty sets the controlling terminal of the child to // file descriptor Ctty. Ctty must be a descriptor number // in the child process: an index into ProcAttr.Files. // This is only meaningful if Setsid is true. Setctty bool Noctty bool // Detach fd 0 from controlling terminal Ctty int // Controlling TTY fd // Foreground places the child process group in the foreground. // This implies Setpgid. The Ctty field must be set to // the descriptor of the controlling TTY. // Unlike Setctty, in this case Ctty must be a descriptor // number in the parent process. Foreground bool Pgid int // Child's process group ID if Setpgid. } // Implemented in runtime package. func runtime_BeforeFork() func runtime_AfterFork() func runtime_AfterForkInChild() // Fork, dup fd onto 0..len(fd), and exec(argv0, argvv, envv) in child. // If a dup or exec fails, write the errno error to pipe. // (Pipe is close-on-exec so if exec succeeds, it will be closed.) // In the child, this function must not acquire any locks, because // they might have been locked at the time of the fork. This means // no rescheduling, no malloc calls, and no new stack segments. // For the same reason compiler does not race instrument it. // The calls to rawSyscall are okay because they are assembly // functions that do not grow the stack. // //go:norace func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (pid int, err Errno) { // Declare all variables at top in case any // declarations require heap allocation (e.g., err1). var ( r1 uintptr err1 Errno nextfd int i int ) // guard against side effects of shuffling fds below. // Make sure that nextfd is beyond any currently open files so // that we can't run the risk of overwriting any of them. fd := make([]int, len(attr.Files)) nextfd = len(attr.Files) for i, ufd := range attr.Files { if nextfd < int(ufd) { nextfd = int(ufd) } fd[i] = int(ufd) } nextfd++ // About to call fork. // No more allocation or calls of non-assembly functions. runtime_BeforeFork() r1, _, err1 = rawSyscall(abi.FuncPCABI0(libc_fork_trampoline), 0, 0, 0) if err1 != 0 { runtime_AfterFork() return 0, err1 } if r1 != 0 { // parent; return PID runtime_AfterFork() return int(r1), 0 } // Fork succeeded, now in child. // Enable tracing if requested. if sys.Ptrace { if err := ptrace(PTRACE_TRACEME, 0, 0, 0); err != nil { err1 = err.(Errno) goto childerror } } // Session ID if sys.Setsid { _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_setsid_trampoline), 0, 0, 0) if err1 != 0 { goto childerror } } // Set process group if sys.Setpgid || sys.Foreground { // Place child in process group. _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_setpgid_trampoline), 0, uintptr(sys.Pgid), 0) if err1 != 0 { goto childerror } } if sys.Foreground { // This should really be pid_t, however _C_int (aka int32) is // generally equivalent. pgrp := _C_int(sys.Pgid) if pgrp == 0 { r1, _, err1 = rawSyscall(abi.FuncPCABI0(libc_getpid_trampoline), 0, 0, 0) if err1 != 0 { goto childerror } pgrp = _C_int(r1) } // Place process group in foreground. _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_ioctl_trampoline), uintptr(sys.Ctty), uintptr(TIOCSPGRP), uintptr(unsafe.Pointer(&pgrp))) if err1 != 0 { goto childerror } } // Restore the signal mask. We do this after TIOCSPGRP to avoid // having the kernel send a SIGTTOU signal to the process group. runtime_AfterForkInChild() // Chroot if chroot != nil { _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_chroot_trampoline), uintptr(unsafe.Pointer(chroot)), 0, 0) if err1 != 0 { goto childerror } } // User and groups if cred := sys.Credential; cred != nil { ngroups := uintptr(len(cred.Groups)) groups := uintptr(0) if ngroups > 0 { groups = uintptr(unsafe.Pointer(&cred.Groups[0])) } if !cred.NoSetGroups { _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_setgroups_trampoline), ngroups, groups, 0) if err1 != 0 { goto childerror } } _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_setgid_trampoline), uintptr(cred.Gid), 0, 0) if err1 != 0 { goto childerror } _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_setuid_trampoline), uintptr(cred.Uid), 0, 0) if err1 != 0 { goto childerror } } // Chdir if dir != nil { _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_chdir_trampoline), uintptr(unsafe.Pointer(dir)), 0, 0) if err1 != 0 { goto childerror } } // Pass 1: look for fd[i] < i and move those up above len(fd) // so that pass 2 won't stomp on an fd it needs later. if pipe < nextfd { if runtime.GOOS == "openbsd" { _, _, err1 = rawSyscall(dupTrampoline, uintptr(pipe), uintptr(nextfd), O_CLOEXEC) } else { _, _, err1 = rawSyscall(dupTrampoline, uintptr(pipe), uintptr(nextfd), 0) if err1 != 0 { goto childerror } _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_fcntl_trampoline), uintptr(nextfd), F_SETFD, FD_CLOEXEC) } if err1 != 0 { goto childerror } pipe = nextfd nextfd++ } for i = 0; i < len(fd); i++ { if fd[i] >= 0 && fd[i] < int(i) { if nextfd == pipe { // don't stomp on pipe nextfd++ } if runtime.GOOS == "openbsd" { _, _, err1 = rawSyscall(dupTrampoline, uintptr(fd[i]), uintptr(nextfd), O_CLOEXEC) } else { _, _, err1 = rawSyscall(dupTrampoline, uintptr(fd[i]), uintptr(nextfd), 0) if err1 != 0 { goto childerror } _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_fcntl_trampoline), uintptr(nextfd), F_SETFD, FD_CLOEXEC) } if err1 != 0 { goto childerror } fd[i] = nextfd nextfd++ } } // Pass 2: dup fd[i] down onto i. for i = 0; i < len(fd); i++ { if fd[i] == -1 { rawSyscall(abi.FuncPCABI0(libc_close_trampoline), uintptr(i), 0, 0) continue } if fd[i] == int(i) { // dup2(i, i) won't clear close-on-exec flag on Linux, // probably not elsewhere either. _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_fcntl_trampoline), uintptr(fd[i]), F_SETFD, 0) if err1 != 0 { goto childerror } continue } // The new fd is created NOT close-on-exec, // which is exactly what we want. _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_dup2_trampoline), uintptr(fd[i]), uintptr(i), 0) if err1 != 0 { goto childerror } } // By convention, we don't close-on-exec the fds we are // started with, so if len(fd) < 3, close 0, 1, 2 as needed. // Programs that know they inherit fds >= 3 will need // to set them close-on-exec. for i = len(fd); i < 3; i++ { rawSyscall(abi.FuncPCABI0(libc_close_trampoline), uintptr(i), 0, 0) } // Detach fd 0 from tty if sys.Noctty { _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_ioctl_trampoline), 0, uintptr(TIOCNOTTY), 0) if err1 != 0 { goto childerror } } // Set the controlling TTY to Ctty if sys.Setctty { _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_ioctl_trampoline), uintptr(sys.Ctty), uintptr(TIOCSCTTY), 0) if err1 != 0 { goto childerror } } // Time to exec. _, _, err1 = rawSyscall(abi.FuncPCABI0(libc_execve_trampoline), uintptr(unsafe.Pointer(argv0)), uintptr(unsafe.Pointer(&argv[0])), uintptr(unsafe.Pointer(&envv[0]))) childerror: // send error code on pipe rawSyscall(abi.FuncPCABI0(libc_write_trampoline), uintptr(pipe), uintptr(unsafe.Pointer(&err1)), unsafe.Sizeof(err1)) for { rawSyscall(abi.FuncPCABI0(libc_exit_trampoline), 253, 0, 0) } }
Upload File
Create Folder