Fix cases where ctr wouldn't properly restore the terminal termios

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
This commit is contained in:
Kenfe-Mickael Laventure 2016-03-22 09:47:35 -07:00
parent 54c213e8a7
commit cad6fb95ab
2 changed files with 38 additions and 16 deletions

View file

@ -145,6 +145,7 @@ var startCommand = cli.Command{
fatal(err.Error(), 1) fatal(err.Error(), 1)
} }
var ( var (
restoreAndCloseStdin func()
tty bool tty bool
c = getClient(context) c = getClient(context)
r = &types.CreateContainerRequest{ r = &types.CreateContainerRequest{
@ -157,6 +158,15 @@ var startCommand = cli.Command{
Labels: context.StringSlice("label"), Labels: context.StringSlice("label"),
} }
) )
restoreAndCloseStdin = func() {
if state != nil {
term.RestoreTerminal(os.Stdin.Fd(), state)
}
if stdin != nil {
stdin.Close()
}
}
defer restoreAndCloseStdin()
if context.Bool("attach") { if context.Bool("attach") {
mkterm, err := readTermSetting(bpath) mkterm, err := readTermSetting(bpath)
if err != nil { if err != nil {
@ -182,12 +192,6 @@ var startCommand = cli.Command{
fatal(err.Error(), 1) fatal(err.Error(), 1)
} }
if context.Bool("attach") { if context.Bool("attach") {
restoreAndCloseStdin := func() {
if state != nil {
term.RestoreTerminal(os.Stdin.Fd(), state)
}
stdin.Close()
}
go func() { go func() {
io.Copy(stdin, os.Stdin) io.Copy(stdin, os.Stdin)
if _, err := c.UpdateProcess(netcontext.Background(), &types.UpdateProcessRequest{ if _, err := c.UpdateProcess(netcontext.Background(), &types.UpdateProcessRequest{
@ -422,6 +426,8 @@ var execCommand = cli.Command{
}, },
}, },
Action: func(context *cli.Context) { Action: func(context *cli.Context) {
var restoreAndCloseStdin func()
p := &types.AddProcessRequest{ p := &types.AddProcessRequest{
Id: context.String("id"), Id: context.String("id"),
Pid: context.String("pid"), Pid: context.String("pid"),
@ -441,6 +447,15 @@ var execCommand = cli.Command{
p.Stdin = s.stdin p.Stdin = s.stdin
p.Stdout = s.stdout p.Stdout = s.stdout
p.Stderr = s.stderr p.Stderr = s.stderr
restoreAndCloseStdin = func() {
if state != nil {
term.RestoreTerminal(os.Stdin.Fd(), state)
}
if stdin != nil {
stdin.Close()
}
}
defer restoreAndCloseStdin()
if context.Bool("attach") { if context.Bool("attach") {
if context.Bool("tty") { if context.Bool("tty") {
s, err := term.SetRawTerminal(os.Stdin.Fd()) s, err := term.SetRawTerminal(os.Stdin.Fd())
@ -462,12 +477,6 @@ var execCommand = cli.Command{
fatal(err.Error(), 1) fatal(err.Error(), 1)
} }
if context.Bool("attach") { if context.Bool("attach") {
restoreAndCloseStdin := func() {
if state != nil {
term.RestoreTerminal(os.Stdin.Fd(), state)
}
stdin.Close()
}
go func() { go func() {
io.Copy(stdin, os.Stdin) io.Copy(stdin, os.Stdin)
if _, err := c.UpdateProcess(netcontext.Background(), &types.UpdateProcessRequest{ if _, err := c.UpdateProcess(netcontext.Background(), &types.UpdateProcessRequest{

View file

@ -11,7 +11,20 @@ import (
const usage = `High performance container daemon cli` const usage = `High performance container daemon cli`
type Exit struct {
Code int
}
func main() { func main() {
// We want our defer functions to be run when calling fatal()
defer func() {
if e := recover(); e != nil {
if ex, ok := e.(Exit); ok == true {
os.Exit(ex.Code)
}
panic(e)
}
}()
app := cli.NewApp() app := cli.NewApp()
app.Name = "ctr" app.Name = "ctr"
if containerd.GitCommit != "" { if containerd.GitCommit != "" {
@ -50,5 +63,5 @@ func main() {
func fatal(err string, code int) { func fatal(err string, code int) {
fmt.Fprintf(os.Stderr, "[ctr] %s\n", err) fmt.Fprintf(os.Stderr, "[ctr] %s\n", err)
os.Exit(code) panic(Exit{code})
} }