package runc import ( "fmt" "io/ioutil" "os/exec" "strconv" "syscall" ) // ReadPidFile reads the pid file at the provided path and returns // the pid or an error if the read and conversion is unsuccessful func ReadPidFile(path string) (int, error) { data, err := ioutil.ReadFile(path) if err != nil { return -1, err } return strconv.Atoi(string(data)) } // runOrError will run the provided command. If an error is // encountered and neither Stdout or Stderr was set the error and the // stderr of the command will be returned in the format of : // func runOrError(cmd *exec.Cmd) error { if cmd.Stdout != nil || cmd.Stderr != nil { return cmd.Run() } data, err := cmd.CombinedOutput() if err != nil { return fmt.Errorf("%s: %s", err, data) } return nil } const exitSignalOffset = 128 // exitStatus returns the correct exit status for a process based on if it // was signaled or exited cleanly func exitStatus(status syscall.WaitStatus) int { if status.Signaled() { return exitSignalOffset + int(status.Signal()) } return status.ExitStatus() }