libcontainer/console_linux.go: Make SaneTerminal public
And use it only in local tooling that is forwarding the pseudoterminal master. That way runC no longer has an opinion on the onlcr setting for folks who are creating a terminal and detaching. They'll use --console-socket and can setup the pseudoterminal however they like without runC having an opinion. With this commit, the only cases where runC still has applies SaneTerminal is when *it* is the process consuming the master descriptor. Signed-off-by: W. Trevor King <wking@tremily.us>
This commit is contained in:
parent
ea35825a63
commit
830c0d70df
|
@ -24,6 +24,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/opencontainers/runc/libcontainer"
|
||||||
"github.com/opencontainers/runc/libcontainer/utils"
|
"github.com/opencontainers/runc/libcontainer/utils"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
@ -100,6 +101,9 @@ func handleSingle(path string) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err = libcontainer.SaneTerminal(master); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Copy from our stdio to the master fd.
|
// Copy from our stdio to the master fd.
|
||||||
quitChan := make(chan struct{})
|
quitChan := make(chan struct{})
|
||||||
|
|
|
@ -21,9 +21,6 @@ func newConsole() (Console, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := saneTerminal(master); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
console, err := ptsname(master)
|
console, err := ptsname(master)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -133,12 +130,12 @@ func ptsname(f *os.File) (string, error) {
|
||||||
return fmt.Sprintf("/dev/pts/%d", n), nil
|
return fmt.Sprintf("/dev/pts/%d", n), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// saneTerminal sets the necessary tty_ioctl(4)s to ensure that a pty pair
|
// SaneTerminal sets the necessary tty_ioctl(4)s to ensure that a pty pair
|
||||||
// created by us acts normally. In particular, a not-very-well-known default of
|
// created by us acts normally. In particular, a not-very-well-known default of
|
||||||
// Linux unix98 ptys is that they have +onlcr by default. While this isn't a
|
// Linux unix98 ptys is that they have +onlcr by default. While this isn't a
|
||||||
// problem for terminal emulators, because we relay data from the terminal we
|
// problem for terminal emulators, because we relay data from the terminal we
|
||||||
// also relay that funky line discipline.
|
// also relay that funky line discipline.
|
||||||
func saneTerminal(terminal *os.File) error {
|
func SaneTerminal(terminal *os.File) error {
|
||||||
// Go doesn't have a wrapper for any of the termios ioctls.
|
// Go doesn't have a wrapper for any of the termios ioctls.
|
||||||
var termios unix.Termios
|
var termios unix.Termios
|
||||||
|
|
||||||
|
|
|
@ -300,6 +300,7 @@ func TestExecInTTY(t *testing.T) {
|
||||||
err: err,
|
err: err,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
libcontainer.SaneTerminal(f)
|
||||||
dc <- &cdata{
|
dc <- &cdata{
|
||||||
c: libcontainer.ConsoleFromFile(f),
|
c: libcontainer.ConsoleFromFile(f),
|
||||||
}
|
}
|
||||||
|
|
3
tty.go
3
tty.go
|
@ -74,6 +74,9 @@ func (t *tty) recvtty(process *libcontainer.Process, socket *os.File) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err = libcontainer.SaneTerminal(f); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
console := libcontainer.ConsoleFromFile(f)
|
console := libcontainer.ConsoleFromFile(f)
|
||||||
go io.Copy(console, os.Stdin)
|
go io.Copy(console, os.Stdin)
|
||||||
t.wg.Add(1)
|
t.wg.Add(1)
|
||||||
|
|
Loading…
Reference in New Issue