| 662 | } |
| 663 | |
| 664 | func (cr *containerReference) waitForCommand(ctx context.Context, isTerminal bool, resp client.HijackedResponse) error { |
| 665 | logger := common.Logger(ctx) |
| 666 | |
| 667 | cmdResponse := make(chan error) |
| 668 | |
| 669 | go func() { |
| 670 | var outWriter io.Writer |
| 671 | outWriter = cr.input.Stdout |
| 672 | if outWriter == nil { |
| 673 | outWriter = os.Stdout |
| 674 | } |
| 675 | errWriter := cr.input.Stderr |
| 676 | if errWriter == nil { |
| 677 | errWriter = os.Stderr |
| 678 | } |
| 679 | |
| 680 | var err error |
| 681 | if !isTerminal || os.Getenv("NORAW") != "" { |
| 682 | _, err = stdcopy.StdCopy(outWriter, errWriter, resp.Reader) |
| 683 | } else { |
| 684 | _, err = io.Copy(outWriter, resp.Reader) |
| 685 | } |
| 686 | cmdResponse <- err |
| 687 | }() |
| 688 | |
| 689 | select { |
| 690 | case <-ctx.Done(): |
| 691 | // send ctrl + c |
| 692 | _, err := resp.Conn.Write([]byte{3}) |
| 693 | if err != nil { |
| 694 | logger.Warnf("Failed to send CTRL+C: %+s", err) |
| 695 | } |
| 696 | |
| 697 | // we return the context canceled error to prevent other steps |
| 698 | // from executing |
| 699 | return ctx.Err() |
| 700 | case err := <-cmdResponse: |
| 701 | if err != nil { |
| 702 | logger.Error(err) |
| 703 | } |
| 704 | |
| 705 | return nil |
| 706 | } |
| 707 | } |
| 708 | |
| 709 | func (cr *containerReference) CopyTarStream(ctx context.Context, destPath string, tarStream io.Reader) error { |
| 710 | if common.Dryrun(ctx) { |