| // 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. | 
 |  | 
 | //go:build linux || netbsd | 
 |  | 
 | package os | 
 |  | 
 | import ( | 
 | 	"errors" | 
 | 	"runtime" | 
 | ) | 
 |  | 
 | func executable() (string, error) { | 
 | 	var procfn string | 
 | 	switch runtime.GOOS { | 
 | 	default: | 
 | 		return "", errors.New("Executable not implemented for " + runtime.GOOS) | 
 | 	case "linux", "android": | 
 | 		procfn = "/proc/self/exe" | 
 | 	case "netbsd": | 
 | 		procfn = "/proc/curproc/exe" | 
 | 	} | 
 | 	path, err := Readlink(procfn) | 
 |  | 
 | 	// 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 | 
 | } |