MCPcopy
hub / github.com/containerd/containerd / NewBinaryProcessor

Function NewBinaryProcessor

core/diff/stream_unix.go:36–103  ·  view source on GitHub ↗

NewBinaryProcessor returns a binary processor for use with processing content streams

(ctx context.Context, imt, rmt string, stream StreamProcessor, name string, args, env []string, payload typeurl.Any)

Source from the content-addressed store, hash-verified

34
35// NewBinaryProcessor returns a binary processor for use with processing content streams
36func NewBinaryProcessor(ctx context.Context, imt, rmt string, stream StreamProcessor, name string, args, env []string, payload typeurl.Any) (StreamProcessor, error) {
37 cmd := exec.CommandContext(ctx, name, args...)
38 cmd.Env = os.Environ()
39 cmd.Env = append(cmd.Env, env...)
40
41 var payloadC io.Closer
42 if payload != nil {
43 pb := typeurl.MarshalProto(payload)
44 data, err := proto.Marshal(pb)
45 if err != nil {
46 return nil, err
47 }
48 r, w, err := os.Pipe()
49 if err != nil {
50 return nil, err
51 }
52 go func() {
53 io.Copy(w, bytes.NewReader(data))
54 w.Close()
55 }()
56
57 cmd.ExtraFiles = append(cmd.ExtraFiles, r)
58 payloadC = r
59 }
60 cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", mediaTypeEnvVar, imt))
61 var (
62 stdin io.Reader
63 closer func() error
64 err error
65 )
66 if f, ok := stream.(RawProcessor); ok {
67 stdin = f.File()
68 closer = f.File().Close
69 } else {
70 stdin = stream
71 }
72 cmd.Stdin = stdin
73 r, w, err := os.Pipe()
74 if err != nil {
75 return nil, err
76 }
77 cmd.Stdout = w
78
79 stderr := bytes.NewBuffer(nil)
80 cmd.Stderr = stderr
81
82 if err := cmd.Start(); err != nil {
83 return nil, err
84 }
85 p := &binaryProcessor{
86 cmd: cmd,
87 r: r,
88 mt: rmt,
89 stderr: stderr,
90 done: make(chan struct{}),
91 }
92 go p.wait()
93

Callers 1

BinaryHandlerFunction · 0.70

Calls 7

waitMethod · 0.95
MarshalFunction · 0.92
PipeMethod · 0.80
CopyMethod · 0.80
CloseMethod · 0.65
FileMethod · 0.65
StartMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…