aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShenghou Ma <minux@golang.org>2015-11-01 04:18:26 -0500
committerBrad Fitzpatrick <bradfitz@golang.org>2016-11-07 20:18:29 +0000
commitf335fcf0fc297b9d1318fb21fa608a7ebc751b3e (patch)
tree45823eb7eefbf114af96442d2d2f29db0056299c
parenta9ce0f96e1f2ab69ce3319c5a97c1d01beb9472c (diff)
downloadgo-f335fcf0fc297b9d1318fb21fa608a7ebc751b3e.tar.gz
go-f335fcf0fc297b9d1318fb21fa608a7ebc751b3e.zip
syscall: add Getexecname on Solaris for os.Executable
Change-Id: Icd77ccbfe6a31117a11effb949b5826950df75a9 Reviewed-on: https://go-review.googlesource.com/16550 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
-rw-r--r--src/syscall/syscall_solaris.go15
-rw-r--r--src/syscall/zsyscall_solaris_amd64.go14
2 files changed, 28 insertions, 1 deletions
diff --git a/src/syscall/syscall_solaris.go b/src/syscall/syscall_solaris.go
index 84d7c041e3..636de924cc 100644
--- a/src/syscall/syscall_solaris.go
+++ b/src/syscall/syscall_solaris.go
@@ -509,6 +509,21 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error)
//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt
//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom
//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg
+//sys getexecname() (path unsafe.Pointer, err error) = libc.getexecname
+
+func Getexecname() (path string, err error) {
+ ptr, err := getexecname()
+ if err != nil {
+ return "", err
+ }
+ bytes := (*[1 << 29]byte)(ptr)[:]
+ for i, b := range bytes {
+ if b == 0 {
+ return string(bytes[:i]), nil
+ }
+ }
+ panic("unreachable")
+}
func readlen(fd int, buf *byte, nbuf int) (n int, err error) {
r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&libc_read)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0)
diff --git a/src/syscall/zsyscall_solaris_amd64.go b/src/syscall/zsyscall_solaris_amd64.go
index 34849757f8..8cc3740e1d 100644
--- a/src/syscall/zsyscall_solaris_amd64.go
+++ b/src/syscall/zsyscall_solaris_amd64.go
@@ -89,6 +89,7 @@ import "unsafe"
//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so"
//go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so"
//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so"
+//go:cgo_import_dynamic libc_getexecname getexecname "libc.so"
//go:linkname libc_Getcwd libc_Getcwd
//go:linkname libc_getgroups libc_getgroups
@@ -172,6 +173,7 @@ import "unsafe"
//go:linkname libc_setsockopt libc_setsockopt
//go:linkname libc_recvfrom libc_recvfrom
//go:linkname libc___xnet_recvmsg libc___xnet_recvmsg
+//go:linkname libc_getexecname libc_getexecname
type libcFunc uintptr
@@ -257,7 +259,8 @@ var (
libc_getsockname,
libc_setsockopt,
libc_recvfrom,
- libc___xnet_recvmsg libcFunc
+ libc___xnet_recvmsg,
+ libc_getexecname libcFunc
)
func Getcwd(buf []byte) (n int, err error) {
@@ -1095,3 +1098,12 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
}
return
}
+
+func getexecname() (path unsafe.Pointer, err error) {
+ r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&libc_getexecname)), 0, 0, 0, 0, 0, 0, 0)
+ path = unsafe.Pointer(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}