From cad6fb95abccee29ef429eb71d4a415e86b24b8a Mon Sep 17 00:00:00 2001 From: Kenfe-Mickael Laventure Date: Tue, 22 Mar 2016 09:47:35 -0700 Subject: [PATCH] Fix cases where ctr wouldn't properly restore the terminal termios Signed-off-by: Kenfe-Mickael Laventure --- ctr/container.go | 39 ++++++++++++++++++++++++--------------- ctr/main.go | 15 ++++++++++++++- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/ctr/container.go b/ctr/container.go index 809dfff..153e137 100644 --- a/ctr/container.go +++ b/ctr/container.go @@ -145,9 +145,10 @@ var startCommand = cli.Command{ fatal(err.Error(), 1) } var ( - tty bool - c = getClient(context) - r = &types.CreateContainerRequest{ + restoreAndCloseStdin func() + tty bool + c = getClient(context) + r = &types.CreateContainerRequest{ Id: id, BundlePath: bpath, Checkpoint: context.String("checkpoint"), @@ -157,6 +158,15 @@ var startCommand = cli.Command{ 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") { mkterm, err := readTermSetting(bpath) if err != nil { @@ -182,12 +192,6 @@ var startCommand = cli.Command{ fatal(err.Error(), 1) } if context.Bool("attach") { - restoreAndCloseStdin := func() { - if state != nil { - term.RestoreTerminal(os.Stdin.Fd(), state) - } - stdin.Close() - } go func() { io.Copy(stdin, os.Stdin) if _, err := c.UpdateProcess(netcontext.Background(), &types.UpdateProcessRequest{ @@ -422,6 +426,8 @@ var execCommand = cli.Command{ }, }, Action: func(context *cli.Context) { + var restoreAndCloseStdin func() + p := &types.AddProcessRequest{ Id: context.String("id"), Pid: context.String("pid"), @@ -441,6 +447,15 @@ var execCommand = cli.Command{ p.Stdin = s.stdin p.Stdout = s.stdout 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("tty") { s, err := term.SetRawTerminal(os.Stdin.Fd()) @@ -462,12 +477,6 @@ var execCommand = cli.Command{ fatal(err.Error(), 1) } if context.Bool("attach") { - restoreAndCloseStdin := func() { - if state != nil { - term.RestoreTerminal(os.Stdin.Fd(), state) - } - stdin.Close() - } go func() { io.Copy(stdin, os.Stdin) if _, err := c.UpdateProcess(netcontext.Background(), &types.UpdateProcessRequest{ diff --git a/ctr/main.go b/ctr/main.go index 2837e39..5dcfd24 100644 --- a/ctr/main.go +++ b/ctr/main.go @@ -11,7 +11,20 @@ import ( const usage = `High performance container daemon cli` +type Exit struct { + Code int +} + 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.Name = "ctr" if containerd.GitCommit != "" { @@ -50,5 +63,5 @@ func main() { func fatal(err string, code int) { fmt.Fprintf(os.Stderr, "[ctr] %s\n", err) - os.Exit(code) + panic(Exit{code}) }