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:
parent
54c213e8a7
commit
cad6fb95ab
2 changed files with 38 additions and 16 deletions
|
@ -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{
|
||||||
|
|
15
ctr/main.go
15
ctr/main.go
|
@ -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})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue