github.com/cdoern/storage@v1.12.13/pkg/system/exitcode.go (about)

     1  package system
     2  
     3  import (
     4  	"fmt"
     5  	"os/exec"
     6  	"syscall"
     7  )
     8  
     9  // GetExitCode returns the ExitStatus of the specified error if its type is
    10  // exec.ExitError, returns 0 and an error otherwise.
    11  func GetExitCode(err error) (int, error) {
    12  	exitCode := 0
    13  	if exiterr, ok := err.(*exec.ExitError); ok {
    14  		if procExit, ok := exiterr.Sys().(syscall.WaitStatus); ok {
    15  			return procExit.ExitStatus(), nil
    16  		}
    17  	}
    18  	return exitCode, fmt.Errorf("failed to get exit code")
    19  }
    20  
    21  // ProcessExitCode process the specified error and returns the exit status code
    22  // if the error was of type exec.ExitError, returns nothing otherwise.
    23  func ProcessExitCode(err error) (exitCode int) {
    24  	if err != nil {
    25  		var exiterr error
    26  		if exitCode, exiterr = GetExitCode(err); exiterr != nil {
    27  			// TODO: Fix this so we check the error's text.
    28  			// we've failed to retrieve exit code, so we set it to 127
    29  			exitCode = 127
    30  		}
    31  	}
    32  	return
    33  }