mirror of https://github.com/docker/docs.git
				
				
				
			
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
| package reexec
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"os/exec"
 | |
| 	"path/filepath"
 | |
| )
 | |
| 
 | |
| var registeredInitializers = make(map[string]func())
 | |
| 
 | |
| // Register adds an initialization func under the specified name
 | |
| func Register(name string, initializer func()) {
 | |
| 	if _, exists := registeredInitializers[name]; exists {
 | |
| 		panic(fmt.Sprintf("reexec func already registred under name %q", name))
 | |
| 	}
 | |
| 
 | |
| 	registeredInitializers[name] = initializer
 | |
| }
 | |
| 
 | |
| // Init is called as the first part of the exec process and returns true if an
 | |
| // initialization function was called.
 | |
| func Init() bool {
 | |
| 	initializer, exists := registeredInitializers[os.Args[0]]
 | |
| 	if exists {
 | |
| 		initializer()
 | |
| 
 | |
| 		return true
 | |
| 	}
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| func naiveSelf() string {
 | |
| 	name := os.Args[0]
 | |
| 	if filepath.Base(name) == name {
 | |
| 		if lp, err := exec.LookPath(name); err == nil {
 | |
| 			return lp
 | |
| 		}
 | |
| 	}
 | |
| 	// handle conversion of relative paths to absolute
 | |
| 	if absName, err := filepath.Abs(name); err == nil {
 | |
| 		return absName
 | |
| 	}
 | |
| 	// if we couldn't get absolute name, return original
 | |
| 	// (NOTE: Go only errors on Abs() if os.Getwd fails)
 | |
| 	return name
 | |
| }
 |