diff --git a/src/os/executable_other.go b/src/os/executable_other.go new file mode 100644 index 00000000..15a9f9f7 --- /dev/null +++ b/src/os/executable_other.go @@ -0,0 +1,9 @@ +// +build !linux + +package os + +import "errors" + +func Executable() (string, error) { + return "", errors.New("Executable not implemented") +} diff --git a/src/os/executable_procfs.go b/src/os/executable_procfs.go new file mode 100644 index 00000000..2f9d0b63 --- /dev/null +++ b/src/os/executable_procfs.go @@ -0,0 +1,25 @@ +// The following is copied from Go 1.17 official implementation. + +// Copyright 2016 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. + +// +build linux + +package os + +func Executable() (string, error) { + path, err := Readlink("/proc/self/exe") + + // When the executable has been deleted then Readlink returns a + // path appended with " (deleted)". + return stringsTrimSuffix(path, " (deleted)"), err +} + +// stringsTrimSuffix is the same as strings.TrimSuffix. +func stringsTrimSuffix(s, suffix string) string { + if len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix { + return s[:len(s)-len(suffix)] + } + return s +}