130 lines
4.7 KiB
Diff
130 lines
4.7 KiB
Diff
|
|
From 17199cf842a86765a21e2054e10e0c64f28353c8 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Christy Perez <christy@linux.vnet.ibm.com>
|
||
|
|
Date: Mon, 27 Mar 2017 16:46:57 -0500
|
||
|
|
Subject: [PATCH 16/94] Fix console syscalls
|
||
|
|
|
||
|
|
Fixes opencontainers/runc/issues/1364
|
||
|
|
|
||
|
|
Change-Id: Ic12237e2ce327f4d9eab3145d0c4c2cff9fb641a
|
||
|
|
Signed-off-by: Christy Perez <christy@linux.vnet.ibm.com>
|
||
|
|
---
|
||
|
|
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 e431766..5e364a8 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())
|
||
|
|
}
|
||
|
|
|
||
|
|
--
|
||
|
|
2.7.4.3
|
||
|
|
|