| /* |
| Copyright The containerd Authors. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| package console |
| |
| import ( |
| "errors" |
| "io" |
| "os" |
| ) |
| |
| var ErrNotAConsole = errors.New("provided file is not a console") |
| |
| type File interface { |
| io.ReadWriteCloser |
| |
| // Fd returns its file descriptor |
| Fd() uintptr |
| // Name returns its file name |
| Name() string |
| } |
| |
| type Console interface { |
| File |
| |
| // Resize resizes the console to the provided window size |
| Resize(WinSize) error |
| // ResizeFrom resizes the calling console to the size of the |
| // provided console |
| ResizeFrom(Console) error |
| // SetRaw sets the console in raw mode |
| SetRaw() error |
| // DisableEcho disables echo on the console |
| DisableEcho() error |
| // Reset restores the console to its orignal state |
| Reset() error |
| // Size returns the window size of the console |
| Size() (WinSize, error) |
| } |
| |
| // WinSize specifies the window size of the console |
| type WinSize struct { |
| // Height of the console |
| Height uint16 |
| // Width of the console |
| Width uint16 |
| x uint16 |
| y uint16 |
| } |
| |
| // Current returns the current process' console |
| func Current() (c Console) { |
| var err error |
| // Usually all three streams (stdin, stdout, and stderr) |
| // are open to the same console, but some might be redirected, |
| // so try all three. |
| for _, s := range []*os.File{os.Stderr, os.Stdout, os.Stdin} { |
| if c, err = ConsoleFromFile(s); err == nil { |
| return c |
| } |
| } |
| // One of the std streams should always be a console |
| // for the design of this function. |
| panic(err) |
| } |
| |
| // ConsoleFromFile returns a console using the provided file |
| // nolint:golint |
| func ConsoleFromFile(f File) (Console, error) { |
| if err := checkConsole(f); err != nil { |
| return nil, err |
| } |
| return newMaster(f) |
| } |