github.com/rootless-containers/rootlesskit/v2@v2.3.4/pkg/common/exec.go (about)

     1  package common
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  	"os/exec"
     7  	"syscall"
     8  
     9  	"github.com/sirupsen/logrus"
    10  )
    11  
    12  // ErrorWithSys is implemented by *exec.ExitError and *child.reaperErr
    13  type ErrorWithSys interface {
    14  	error
    15  	Sys() interface{}
    16  }
    17  
    18  func GetExecExitStatus(err error) (int, bool) {
    19  	err = errors.Unwrap(err)
    20  	if err == nil {
    21  		return 0, false
    22  	}
    23  	exitErr, ok := err.(ErrorWithSys)
    24  	if !ok {
    25  		return 0, false
    26  	}
    27  	status, ok := exitErr.Sys().(syscall.WaitStatus)
    28  	if !ok {
    29  		return 0, false
    30  	}
    31  	return status.ExitStatus(), true
    32  }
    33  
    34  func Execs(o io.Writer, env []string, cmds [][]string) error {
    35  	for _, cmd := range cmds {
    36  		var args []string
    37  		if len(cmd) > 1 {
    38  			args = cmd[1:]
    39  		}
    40  		x := exec.Command(cmd[0], args...)
    41  		x.Stdin = nil
    42  		x.Stdout = o
    43  		x.Stderr = o
    44  		x.Env = env
    45  		x.SysProcAttr = &syscall.SysProcAttr{
    46  			Pdeathsig: syscall.SIGKILL,
    47  		}
    48  		logrus.Debugf("executing %v", cmd)
    49  		if err := x.Run(); err != nil {
    50  			return err
    51  		}
    52  	}
    53  	return nil
    54  }