From 0deb464c5a1b48110355376f934e733e43b483bf Mon Sep 17 00:00:00 2001 From: Kevin Burke Date: Sat, 17 Mar 2018 20:02:54 -0700 Subject: [PATCH] unix: add Exec call The syscall execve has no wrapper in this library, which it seems like it should - Ian seemed to concur in CL 72550. Add a docstring and an example, because I always get confused about how to invoke the syscall. Change-Id: I6100bbbf4ace9e3e341bf186a04cc03301da9aea Reviewed-on: https://go-review.googlesource.com/101282 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- unix/example_test.go | 16 ++++++++++++++++ unix/syscall_unix.go | 9 +++++++++ 2 files changed, 25 insertions(+) create mode 100644 unix/example_test.go diff --git a/unix/example_test.go b/unix/example_test.go new file mode 100644 index 00000000..3ddf90fe --- /dev/null +++ b/unix/example_test.go @@ -0,0 +1,16 @@ +// Copyright 2018 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. + +package unix + +import ( + "log" + "os" + "syscall" +) + +func ExampleExec() { + err := syscall.Exec("/bin/ls", []string{"ls", "-al"}, os.Environ()) + log.Fatal(err) +} diff --git a/unix/syscall_unix.go b/unix/syscall_unix.go index 80b05a40..95ce5557 100644 --- a/unix/syscall_unix.go +++ b/unix/syscall_unix.go @@ -305,3 +305,12 @@ func SetNonblock(fd int, nonblocking bool) (err error) { _, err = fcntl(fd, F_SETFL, flag) return err } + +// Exec calls execve(2), which replaces the calling executable in the process +// tree. argv0 should be the full path to an executable ("/bin/ls") and the +// executable name should also be the first argument in argv (["ls", "-l"]). +// envv are the environment variables that should be passed to the new +// process (["USER=go", "PWD=/tmp"]). +func Exec(argv0 string, argv []string, envv []string) error { + return syscall.Exec(argv0, argv, envv) +}