summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/syscall/exec_solaris.go5
-rw-r--r--src/syscall/exec_unix.go24
2 files changed, 24 insertions, 5 deletions
diff --git a/src/syscall/exec_solaris.go b/src/syscall/exec_solaris.go
index 448207ee1b..8052ff1862 100644
--- a/src/syscall/exec_solaris.go
+++ b/src/syscall/exec_solaris.go
@@ -41,6 +41,11 @@ func setuid(uid uintptr) (err Errno)
func setpgid(pid uintptr, pgid uintptr) (err Errno)
func write1(fd uintptr, buf uintptr, nbyte uintptr) (n uintptr, err Errno)
+// syscall defines this global on our behalf to avoid a build dependency on other platforms
+func init() {
+ execveSolaris = execve
+}
+
// 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.)
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
}