diff options
author | Nicolas Lacasse <nlacasse@google.com> | 2018-08-24 17:42:30 -0700 |
---|---|---|
committer | Shentubot <shentubot@google.com> | 2018-08-24 17:43:21 -0700 |
commit | 106de2182d34197d76fb68863cd4a102ebac2dbb (patch) | |
tree | 9f3bce620feedb1c7f757c079157538c33b94a5a /runsc/sandbox/console.go | |
parent | c48708a041fcc9749e0162a7708f32e5a3d7e526 (diff) |
runsc: Terminal support for "docker exec -ti".
This CL adds terminal support for "docker exec". We previously only supported
consoles for the container process, but not exec processes.
The SYS_IOCTL syscall was added to the default seccomp filter list, but only
for ioctls that get/set winsize and termios structs. We need to allow these
ioctl for all containers because it's possible to run "exec -ti" on a
container that was started without an attached console, after the filters
have been installed.
Note that control-character signals are still not properly supported.
Tested with:
$ docker run --runtime=runsc -it alpine
In another terminial:
$ docker exec -it <containerid> /bin/sh
PiperOrigin-RevId: 210185456
Change-Id: I6d2401e53a7697bb988c120a8961505c335f96d9
Diffstat (limited to 'runsc/sandbox/console.go')
-rw-r--r-- | runsc/sandbox/console.go | 60 |
1 files changed, 0 insertions, 60 deletions
diff --git a/runsc/sandbox/console.go b/runsc/sandbox/console.go deleted file mode 100644 index 3f133e12a..000000000 --- a/runsc/sandbox/console.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2018 Google Inc. -// -// 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 sandbox - -import ( - "fmt" - "net" - "os" - - "github.com/kr/pty" - "golang.org/x/sys/unix" -) - -// setupConsole creates pty master/slave pair, sends the master FD over the -// given socket, and returns the slave. -func setupConsole(socketPath string) (*os.File, error) { - // Create a new pty master and slave. - ptyMaster, ptySlave, err := pty.Open() - if err != nil { - return nil, fmt.Errorf("error opening pty: %v", err) - } - defer ptyMaster.Close() - - // Get a connection to the socket path. - conn, err := net.Dial("unix", socketPath) - if err != nil { - ptySlave.Close() - return nil, fmt.Errorf("error dial socket %q: %v", socketPath, err) - } - uc, ok := conn.(*net.UnixConn) - if !ok { - ptySlave.Close() - return nil, fmt.Errorf("connection is not a UnixConn: %T", conn) - } - socket, err := uc.File() - if err != nil { - ptySlave.Close() - return nil, fmt.Errorf("error getting file for unix socket %v: %v", uc, err) - } - - // Send the master FD over the connection. - msg := unix.UnixRights(int(ptyMaster.Fd())) - if err := unix.Sendmsg(int(socket.Fd()), []byte("pty-master"), msg, nil, 0); err != nil { - ptySlave.Close() - return nil, fmt.Errorf("error sending console over unix socket %q: %v", socketPath, err) - } - return ptySlave, nil -} |