| package daemon // import "github.com/docker/docker/daemon" |
| |
| import ( |
| "context" |
| "errors" |
| "strconv" |
| "time" |
| |
| "github.com/docker/docker/api/types/events" |
| "github.com/docker/docker/errdefs" |
| ) |
| |
| // ContainerResize changes the size of the TTY of the process running |
| // in the container with the given name to the given height and width. |
| func (daemon *Daemon) ContainerResize(name string, height, width int) error { |
| container, err := daemon.GetContainer(name) |
| if err != nil { |
| return err |
| } |
| |
| container.Lock() |
| tsk, err := container.GetRunningTask() |
| container.Unlock() |
| if err != nil { |
| return err |
| } |
| |
| if err = tsk.Resize(context.Background(), uint32(width), uint32(height)); err == nil { |
| daemon.LogContainerEventWithAttributes(container, events.ActionResize, map[string]string{ |
| "height": strconv.Itoa(height), |
| "width": strconv.Itoa(width), |
| }) |
| } |
| return err |
| } |
| |
| // ContainerExecResize changes the size of the TTY of the process |
| // running in the exec with the given name to the given height and |
| // width. |
| func (daemon *Daemon) ContainerExecResize(name string, height, width int) error { |
| ec, err := daemon.getExecConfig(name) |
| if err != nil { |
| return err |
| } |
| |
| // TODO: the timeout is hardcoded here, it would be more flexible to make it |
| // a parameter in resize request context, which would need API changes. |
| timeout := time.NewTimer(10 * time.Second) |
| defer timeout.Stop() |
| |
| select { |
| case <-ec.Started: |
| // An error may have occurred, so ec.Process may be nil. |
| if ec.Process == nil { |
| return errdefs.InvalidParameter(errors.New("exec process is not started")) |
| } |
| return ec.Process.Resize(context.Background(), uint32(width), uint32(height)) |
| case <-timeout.C: |
| return errors.New("timeout waiting for exec session ready") |
| } |
| } |