MCPcopy Index your code
hub / github.com/docker/cli / runDialStdio

Function runDialStdio

cli/command/system/dial_stdio.go:32–73  ·  view source on GitHub ↗
(ctx context.Context, dockerCli command.Cli)

Source from the content-addressed store, hash-verified

30}
31
32func runDialStdio(ctx context.Context, dockerCli command.Cli) error {
33 ctx, cancel := context.WithCancel(ctx)
34 defer cancel()
35
36 dialer := dockerCli.Client().Dialer()
37 conn, err := dialer(ctx)
38 if err != nil {
39 return fmt.Errorf("failed to open the raw stream connection: %w", err)
40 }
41 defer conn.Close()
42
43 var connHalfCloser halfCloser
44 switch t := conn.(type) {
45 case halfCloser:
46 connHalfCloser = t
47 case halfReadWriteCloser:
48 connHalfCloser = &nopCloseReader{t}
49 default:
50 return errors.New("the raw stream connection does not implement halfCloser")
51 }
52
53 stdin2conn := make(chan error, 1)
54 conn2stdout := make(chan error, 1)
55 go func() {
56 stdin2conn <- copier(connHalfCloser, &halfReadCloserWrapper{os.Stdin}, "stdin to stream")
57 }()
58 go func() {
59 conn2stdout <- copier(&halfWriteCloserWrapper{os.Stdout}, connHalfCloser, "stream to stdout")
60 }()
61 select {
62 case err = <-stdin2conn:
63 if err != nil {
64 return err
65 }
66 // wait for stdout
67 err = <-conn2stdout
68 case err = <-conn2stdout:
69 // return immediately without waiting for stdin to be closed.
70 // (stdin is never closed when tty)
71 }
72 return err
73}
74
75func copier(to halfWriteCloser, from halfReadCloser, debugDescription string) error {
76 defer func() {

Callers 1

newDialStdioCommandFunction · 0.85

Calls 3

copierFunction · 0.85
ClientMethod · 0.65
CloseMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…