mirror of https://github.com/docker/cli.git
58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
|
package container
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
gosignal "os/signal"
|
||
|
|
||
|
"github.com/docker/cli/cli/command"
|
||
|
"github.com/docker/docker/pkg/signal"
|
||
|
"github.com/sirupsen/logrus"
|
||
|
)
|
||
|
|
||
|
// ForwardAllSignals forwards signals to the container
|
||
|
//
|
||
|
// The channel you pass in must already be setup to receive any signals you want to forward.
|
||
|
func ForwardAllSignals(ctx context.Context, cli command.Cli, cid string, sigc <-chan os.Signal) {
|
||
|
var s os.Signal
|
||
|
for {
|
||
|
select {
|
||
|
case s = <-sigc:
|
||
|
case <-ctx.Done():
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if s == signal.SIGCHLD || s == signal.SIGPIPE {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
// In go1.14+, the go runtime issues SIGURG as an interrupt to support pre-emptable system calls on Linux.
|
||
|
// Since we can't forward that along we'll check that here.
|
||
|
if isRuntimeSig(s) {
|
||
|
continue
|
||
|
}
|
||
|
var sig string
|
||
|
for sigStr, sigN := range signal.SignalMap {
|
||
|
if sigN == s {
|
||
|
sig = sigStr
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
if sig == "" {
|
||
|
fmt.Fprintf(cli.Err(), "Unsupported signal: %v. Discarding.\n", s)
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if err := cli.Client().ContainerKill(ctx, cid, sig); err != nil {
|
||
|
logrus.Debugf("Error sending signal: %s", err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func notfiyAllSignals() chan os.Signal {
|
||
|
sigc := make(chan os.Signal, 128)
|
||
|
gosignal.Notify(sigc)
|
||
|
return sigc
|
||
|
}
|