diff options
-rw-r--r-- | libpod/define/exec_codes.go | 17 | ||||
-rw-r--r-- | pkg/adapter/containers.go | 8 | ||||
-rw-r--r-- | pkg/varlinkapi/containers.go | 10 |
3 files changed, 20 insertions, 15 deletions
diff --git a/libpod/define/exec_codes.go b/libpod/define/exec_codes.go index 90a68cf93..7184f1e59 100644 --- a/libpod/define/exec_codes.go +++ b/libpod/define/exec_codes.go @@ -1,5 +1,9 @@ package define +import ( + "github.com/pkg/errors" +) + const ( // ExecErrorCodeGeneric is the default error code to return from an exec session if libpod failed // prior to calling the runtime @@ -11,3 +15,16 @@ const ( // ExecErrorCodeNotFound is the error code to return when a command cannot be found ExecErrorCodeNotFound = 127 ) + +// TranslateExecErrorToExitCode takes an error and checks whether it +// has a predefined exit code associated. If so, it returns that, otherwise it returns +// the exit code originally stated in libpod.Exec() +func TranslateExecErrorToExitCode(originalEC int, err error) int { + if errors.Cause(err) == ErrOCIRuntimePermissionDenied { + return ExecErrorCodeCannotInvoke + } + if errors.Cause(err) == ErrOCIRuntimeNotFound { + return ExecErrorCodeNotFound + } + return originalEC +} diff --git a/pkg/adapter/containers.go b/pkg/adapter/containers.go index a8bff187c..faaef3e60 100644 --- a/pkg/adapter/containers.go +++ b/pkg/adapter/containers.go @@ -1001,13 +1001,7 @@ func (r *LocalRuntime) ExecContainer(ctx context.Context, cli *cliconfig.ExecVal streams.AttachError = true ec, err = ExecAttachCtr(ctx, ctr.Container, cli.Tty, cli.Privileged, envs, cmd, cli.User, cli.Workdir, streams, cli.PreserveFDs, cli.DetachKeys) - if errors.Cause(err) == define.ErrOCIRuntimePermissionDenied { - ec = 126 - } - if errors.Cause(err) == define.ErrOCIRuntimeNotFound { - ec = 127 - } - return ec, err + return define.TranslateExecErrorToExitCode(ec, err), err } // Prune removes stopped containers diff --git a/pkg/varlinkapi/containers.go b/pkg/varlinkapi/containers.go index 6e2b26c0e..cd5f305c9 100644 --- a/pkg/varlinkapi/containers.go +++ b/pkg/varlinkapi/containers.go @@ -837,15 +837,9 @@ func (i *LibpodAPI) ExecContainer(call iopodman.VarlinkCall, opts iopodman.ExecO ecErr := <-ecErrChan - exitCode := ecErr.ExitCode - if errors.Cause(ecErr.Error) == define.ErrOCIRuntimePermissionDenied { - exitCode = define.ExecErrorCodeCannotInvoke - } - if errors.Cause(ecErr.Error) == define.ErrOCIRuntimeNotFound { - exitCode = define.ExecErrorCodeNotFound - } + exitCode := define.TranslateExecErrorToExitCode(int(ecErr.ExitCode), ecErr.Error) - if err = virtwriter.HangUp(writer, exitCode); err != nil { + if err = virtwriter.HangUp(writer, uint32(exitCode)); err != nil { logrus.Errorf("ExecContainer failed to HANG-UP on %s: %s", ctr.ID(), err.Error()) } |