mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 14:13:58 +08:00
13e8f6e589
It's never used and not needed. Our pipe is created with syscall.SOCK_CLOEXEC, so pipe will be closed once container process executed successfully, parent process will read EOF and continue. If container process got error before executed, we'll write procError to sync with parent. Signed-off-by: Qiang Huang <h.huangqiang@huawei.com>
87 lines
1.5 KiB
Go
87 lines
1.5 KiB
Go
package libcontainer
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"text/template"
|
|
"time"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/stacktrace"
|
|
)
|
|
|
|
type syncType uint8
|
|
|
|
const (
|
|
procReady syncType = iota
|
|
procError
|
|
procRun
|
|
)
|
|
|
|
type syncT struct {
|
|
Type syncType `json:"type"`
|
|
}
|
|
|
|
var errorTemplate = template.Must(template.New("error").Parse(`Timestamp: {{.Timestamp}}
|
|
Code: {{.ECode}}
|
|
{{if .Message }}
|
|
Message: {{.Message}}
|
|
{{end}}
|
|
Frames:{{range $i, $frame := .Stack.Frames}}
|
|
---
|
|
{{$i}}: {{$frame.Function}}
|
|
Package: {{$frame.Package}}
|
|
File: {{$frame.File}}@{{$frame.Line}}{{end}}
|
|
`))
|
|
|
|
func newGenericError(err error, c ErrorCode) Error {
|
|
if le, ok := err.(Error); ok {
|
|
return le
|
|
}
|
|
gerr := &genericError{
|
|
Timestamp: time.Now(),
|
|
Err: err,
|
|
ECode: c,
|
|
Stack: stacktrace.Capture(1),
|
|
}
|
|
if err != nil {
|
|
gerr.Message = err.Error()
|
|
}
|
|
return gerr
|
|
}
|
|
|
|
func newSystemError(err error) Error {
|
|
if le, ok := err.(Error); ok {
|
|
return le
|
|
}
|
|
gerr := &genericError{
|
|
Timestamp: time.Now(),
|
|
Err: err,
|
|
ECode: SystemError,
|
|
Stack: stacktrace.Capture(1),
|
|
}
|
|
if err != nil {
|
|
gerr.Message = err.Error()
|
|
}
|
|
return gerr
|
|
}
|
|
|
|
type genericError struct {
|
|
Timestamp time.Time
|
|
ECode ErrorCode
|
|
Err error `json:"-"`
|
|
Message string
|
|
Stack stacktrace.Stacktrace
|
|
}
|
|
|
|
func (e *genericError) Error() string {
|
|
return fmt.Sprintf("[%d] %s: %s", e.ECode, e.ECode, e.Message)
|
|
}
|
|
|
|
func (e *genericError) Code() ErrorCode {
|
|
return e.ECode
|
|
}
|
|
|
|
func (e *genericError) Detail(w io.Writer) error {
|
|
return errorTemplate.Execute(w, e)
|
|
}
|