From fca53109c1ee4a4d1f1c8e897ce312a46d3c84f0 Mon Sep 17 00:00:00 2001 From: Christy Perez Date: Mon, 27 Mar 2017 16:46:57 -0500 Subject: [PATCH] Fix console syscalls Fixes opencontainers/runc/issues/1364 Signed-off-by: Christy Perez --- libcontainer/console_linux.go | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/libcontainer/console_linux.go b/libcontainer/console_linux.go index e431766b..5e364a88 100644 --- a/libcontainer/console_linux.go +++ b/libcontainer/console_linux.go @@ -3,8 +3,9 @@ package libcontainer import ( "fmt" "os" - "syscall" "unsafe" + + "golang.org/x/sys/unix" ) func ConsoleFromFile(f *os.File) Console { @@ -16,7 +17,7 @@ func ConsoleFromFile(f *os.File) Console { // newConsole returns an initialized console that can be used within a container by copying bytes // from the master side to the slave that is attached as the tty for the container's init process. func newConsole() (Console, error) { - master, err := os.OpenFile("/dev/ptmx", syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_CLOEXEC, 0) + master, err := os.OpenFile("/dev/ptmx", unix.O_RDWR|unix.O_NOCTTY|unix.O_CLOEXEC, 0) if err != nil { return nil, err } @@ -68,8 +69,8 @@ func (c *linuxConsole) Close() error { // mount initializes the console inside the rootfs mounting with the specified mount label // and applying the correct ownership of the console. func (c *linuxConsole) mount() error { - oldMask := syscall.Umask(0000) - defer syscall.Umask(oldMask) + oldMask := unix.Umask(0000) + defer unix.Umask(oldMask) f, err := os.Create("/dev/console") if err != nil && !os.IsExist(err) { return err @@ -77,19 +78,19 @@ func (c *linuxConsole) mount() error { if f != nil { f.Close() } - return syscall.Mount(c.slavePath, "/dev/console", "bind", syscall.MS_BIND, "") + return unix.Mount(c.slavePath, "/dev/console", "bind", unix.MS_BIND, "") } // dupStdio opens the slavePath for the console and dups the fds to the current // processes stdio, fd 0,1,2. func (c *linuxConsole) dupStdio() error { - slave, err := c.open(syscall.O_RDWR) + slave, err := c.open(unix.O_RDWR) if err != nil { return err } fd := int(slave.Fd()) for _, i := range []int{0, 1, 2} { - if err := syscall.Dup3(fd, i, 0); err != nil { + if err := unix.Dup3(fd, i, 0); err != nil { return err } } @@ -98,7 +99,7 @@ func (c *linuxConsole) dupStdio() error { // open is a clone of os.OpenFile without the O_CLOEXEC used to open the pty slave. func (c *linuxConsole) open(flag int) (*os.File, error) { - r, e := syscall.Open(c.slavePath, flag, 0) + r, e := unix.Open(c.slavePath, flag, 0) if e != nil { return nil, &os.PathError{ Op: "open", @@ -110,7 +111,7 @@ func (c *linuxConsole) open(flag int) (*os.File, error) { } func ioctl(fd uintptr, flag, data uintptr) error { - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, flag, data); err != 0 { + if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, flag, data); err != 0 { return err } return nil @@ -120,13 +121,13 @@ func ioctl(fd uintptr, flag, data uintptr) error { // unlockpt should be called before opening the slave side of a pty. func unlockpt(f *os.File) error { var u int32 - return ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u))) + return ioctl(f.Fd(), unix.TIOCSPTLCK, uintptr(unsafe.Pointer(&u))) } // ptsname retrieves the name of the first available pts for the given master. func ptsname(f *os.File) (string, error) { var n int32 - if err := ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n))); err != nil { + if err := ioctl(f.Fd(), unix.TIOCGPTN, uintptr(unsafe.Pointer(&n))); err != nil { return "", err } return fmt.Sprintf("/dev/pts/%d", n), nil @@ -139,16 +140,16 @@ func ptsname(f *os.File) (string, error) { // also relay that funky line discipline. func saneTerminal(terminal *os.File) error { // Go doesn't have a wrapper for any of the termios ioctls. - var termios syscall.Termios + var termios unix.Termios - if err := ioctl(terminal.Fd(), syscall.TCGETS, uintptr(unsafe.Pointer(&termios))); err != nil { + if err := ioctl(terminal.Fd(), unix.TCGETS, uintptr(unsafe.Pointer(&termios))); err != nil { return fmt.Errorf("ioctl(tty, tcgets): %s", err.Error()) } // Set -onlcr so we don't have to deal with \r. - termios.Oflag &^= syscall.ONLCR + termios.Oflag &^= unix.ONLCR - if err := ioctl(terminal.Fd(), syscall.TCSETS, uintptr(unsafe.Pointer(&termios))); err != nil { + if err := ioctl(terminal.Fd(), unix.TCSETS, uintptr(unsafe.Pointer(&termios))); err != nil { return fmt.Errorf("ioctl(tty, tcsets): %s", err.Error()) }