1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Add a chan to hijack() to block until the hijack is completed

This commit is contained in:
Guillaume J. Charmes 2013-10-10 11:20:50 -07:00 committed by Victor Vieux
parent e7269b9841
commit 9bceae2440

View file

@ -605,7 +605,7 @@ func (cli *DockerCli) CmdStart(args ...string) error {
v.Set("stderr", "1") v.Set("stderr", "1")
cErr = utils.Go(func() error { cErr = utils.Go(func() error {
return cli.hijack("POST", "/containers/"+cmd.Arg(0)+"/attach?"+v.Encode(), container.Config.Tty, cli.in, cli.out, cli.err) return cli.hijack("POST", "/containers/"+cmd.Arg(0)+"/attach?"+v.Encode(), container.Config.Tty, cli.in, cli.out, cli.err, nil)
}) })
} }
@ -1298,7 +1298,7 @@ func (cli *DockerCli) CmdLogs(args ...string) error {
return nil return nil
} }
if err := cli.hijack("POST", "/containers/"+cmd.Arg(0)+"/attach?logs=1&stdout=1&stderr=1", false, nil, cli.out, cli.err); err != nil { if err := cli.hijack("POST", "/containers/"+cmd.Arg(0)+"/attach?logs=1&stdout=1&stderr=1", false, nil, cli.out, cli.err, nil); err != nil {
return err return err
} }
return nil return nil
@ -1349,7 +1349,7 @@ func (cli *DockerCli) CmdAttach(args ...string) error {
cli.forwardAllSignals(cmd.Arg(0)) cli.forwardAllSignals(cmd.Arg(0))
} }
if err := cli.hijack("POST", "/containers/"+cmd.Arg(0)+"/attach?"+v.Encode(), container.Config.Tty, cli.in, cli.out, cli.err); err != nil { if err := cli.hijack("POST", "/containers/"+cmd.Arg(0)+"/attach?"+v.Encode(), container.Config.Tty, cli.in, cli.out, cli.err, nil); err != nil {
return err return err
} }
return nil return nil
@ -1611,6 +1611,8 @@ func (cli *DockerCli) CmdRun(args ...string) error {
}() }()
} }
hijacked := make(chan bool)
if config.AttachStdin || config.AttachStdout || config.AttachStderr { if config.AttachStdin || config.AttachStdout || config.AttachStderr {
if config.Tty { if config.Tty {
if err := cli.monitorTtySize(runResult.ID); err != nil { if err := cli.monitorTtySize(runResult.ID); err != nil {
@ -1639,8 +1641,20 @@ func (cli *DockerCli) CmdRun(args ...string) error {
} }
errCh = utils.Go(func() error { errCh = utils.Go(func() error {
return cli.hijack("POST", "/containers/"+runResult.ID+"/attach?"+v.Encode(), config.Tty, cli.in, out, stderr) return cli.hijack("POST", "/containers/"+runResult.ID+"/attach?"+v.Encode(), config.Tty, cli.in, out, stderr, hijacked)
}) })
} else {
close(hijacked)
}
// Acknowledge the hijack before starting
select {
case <-hijacked:
case err := <-errCh:
if err != nil {
utils.Debugf("Error hijack: %s", err)
return err
}
} }
//start the container //start the container
@ -1829,7 +1843,7 @@ func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer, h
return nil return nil
} }
func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.ReadCloser, stdout, stderr io.Writer) error { func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.ReadCloser, stdout, stderr io.Writer, started chan bool) error {
req, err := http.NewRequest(method, fmt.Sprintf("/v%g%s", APIVERSION, path), nil) req, err := http.NewRequest(method, fmt.Sprintf("/v%g%s", APIVERSION, path), nil)
if err != nil { if err != nil {
@ -1855,6 +1869,10 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea
rwc, br := clientconn.Hijack() rwc, br := clientconn.Hijack()
defer rwc.Close() defer rwc.Close()
if started != nil {
started <- true
}
var receiveStdout chan error var receiveStdout chan error
if stdout != nil { if stdout != nil {