| package daemon |
| |
| import ( |
| "context" |
| "errors" |
| "strconv" |
| "time" |
| |
| "github.com/moby/moby/api/types/events" |
| "github.com/moby/moby/v2/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(ctx context.Context, name string, height, width uint32) 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.WithoutCancel(ctx), width, height); err == nil { |
| daemon.LogContainerEventWithAttributes(container, events.ActionResize, map[string]string{ |
| "height": strconv.FormatUint(uint64(height), 10), |
| "width": strconv.FormatUint(uint64(width), 10), |
| }) |
| } |
| 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(ctx context.Context, name string, height, width uint32) 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.WithoutCancel(ctx), width, height) |
| case <-timeout.C: |
| return errors.New("timeout waiting for exec session ready") |
| } |
| } |