diff options
Diffstat (limited to 'src/syscall/exec_unix.go')
-rw-r--r-- | src/syscall/exec_unix.go | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/syscall/exec_unix.go b/src/syscall/exec_unix.go index e8ca29ab40..9a950ac17f 100644 --- a/src/syscall/exec_unix.go +++ b/src/syscall/exec_unix.go @@ -246,6 +246,10 @@ func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle func runtime_BeforeExec() func runtime_AfterExec() +// execveSolaris is non-nil on Solaris, set to execve in exec_solaris.go; this +// avoids a build dependency for other platforms. +var execveSolaris func(path uintptr, argv uintptr, envp uintptr) (err Errno) + // Exec invokes the execve(2) system call. func Exec(argv0 string, argv []string, envv []string) (err error) { argv0p, err := BytePtrFromString(argv0) @@ -261,10 +265,20 @@ func Exec(argv0 string, argv []string, envv []string) (err error) { return err } runtime_BeforeExec() - _, _, err1 := RawSyscall(SYS_EXECVE, - uintptr(unsafe.Pointer(argv0p)), - uintptr(unsafe.Pointer(&argvp[0])), - uintptr(unsafe.Pointer(&envvp[0]))) + + var err1 Errno + if runtime.GOOS == "solaris" { + // RawSyscall should never be used on Solaris. + err1 = execveSolaris( + uintptr(unsafe.Pointer(argv0p)), + uintptr(unsafe.Pointer(&argvp[0])), + uintptr(unsafe.Pointer(&envvp[0]))) + } else { + _, _, err1 = RawSyscall(SYS_EXECVE, + uintptr(unsafe.Pointer(argv0p)), + uintptr(unsafe.Pointer(&argvp[0])), + uintptr(unsafe.Pointer(&envvp[0]))) + } runtime_AfterExec() - return Errno(err1) + return err1 } |