Skip to content

Commit

Permalink
Set console mode for windows
Browse files Browse the repository at this point in the history
Windows terminal handling is different than darwin and linux.  It needs to have the terminal mode set to enable virtual terminal processing.  This allows colors and other things to work.

Signed-off-by: Brent Baude <bbaude@redhat.com>

<MH: Tweaked imports to compile>

Signed-off-by: Matt Heon <matthew.heon@pm.me>
  • Loading branch information
baude authored and mheon committed Jul 6, 2020
1 parent 1c02d5a commit de6a860
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
6 changes: 6 additions & 0 deletions cmd/podman/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ import (
_ "github.com/containers/libpod/v2/cmd/podman/system"
_ "github.com/containers/libpod/v2/cmd/podman/volumes"
"github.com/containers/libpod/v2/pkg/rootless"
"github.com/containers/libpod/pkg/terminal"
"github.com/containers/storage/pkg/reexec"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

Expand Down Expand Up @@ -58,6 +60,10 @@ func main() {
}
}
}
if err := terminal.SetConsole(); err != nil {
logrus.Error(err)
os.Exit(1)
}

Execute()
os.Exit(0)
Expand Down
8 changes: 8 additions & 0 deletions pkg/terminal/console_unix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// +build !windows

package terminal

// SetConsole for non-windows environments is a no-op
func SetConsole() error {
return nil
}
37 changes: 37 additions & 0 deletions pkg/terminal/console_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// +build windows

package terminal

import (
"github.com/sirupsen/logrus"
"golang.org/x/sys/windows"
)

// SetConsole switches the windows terminal mode to be able to handle colors, etc
func SetConsole() error {
if err := setConsoleMode(windows.Stdout, windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err != nil {
return err
}
if err := setConsoleMode(windows.Stderr, windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err != nil {
return err
}
if err := setConsoleMode(windows.Stdin, windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err != nil {
return err
}
return nil
}

func setConsoleMode(handle windows.Handle, flags uint32) error {
var mode uint32
err := windows.GetConsoleMode(handle, &mode)
if err != nil {
return err
}
if err := windows.SetConsoleMode(handle, mode|flags); err != nil {
// In similar code, it is not considered an error if we cannot set the
// console mode. Following same line of thinking here.
logrus.WithError(err).Error("Failed to set console mode for cli")
}

return nil
}

0 comments on commit de6a860

Please sign in to comment.