Browse code

Make docker use the signal pkg with strings

Docker-DCO-1.1-Signed-off-by: Guillaume J. Charmes <guillaume@charmes.net> (github: creack)

Guillaume J. Charmes authored on 2014/03/11 06:22:27
Showing 7 changed files
... ...
@@ -540,7 +540,17 @@ func (cli *DockerCli) forwardAllSignals(cid string) chan os.Signal {
540 540
 			if s == syscall.SIGCHLD {
541 541
 				continue
542 542
 			}
543
-			if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/kill?signal=%d", cid, s), nil, false)); err != nil {
543
+			var sig string
544
+			for sigStr, sigN := range signal.SignalMap {
545
+				if sigN == s {
546
+					sig = sigStr
547
+					break
548
+				}
549
+			}
550
+			if sig == "" {
551
+				utils.Errorf("Unsupported signal: %d. Discarding.", s)
552
+			}
553
+			if _, _, err := readBody(cli.call("POST", fmt.Sprintf("/containers/%s/kill?signal=%s", cid, sig), nil, false)); err != nil {
544 554
 				utils.Debugf("Error sending signal: %s", err)
545 555
 			}
546 556
 		}
... ...
@@ -7,7 +7,7 @@ import (
7 7
 
8 8
 func CatchAll(sigc chan os.Signal) {
9 9
 	handledSigs := []os.Signal{}
10
-	for _, s := range signalMap {
10
+	for _, s := range SignalMap {
11 11
 		handledSigs = append(handledSigs, s)
12 12
 	}
13 13
 	signal.Notify(sigc, handledSigs...)
... ...
@@ -4,37 +4,37 @@ import (
4 4
 	"syscall"
5 5
 )
6 6
 
7
-var signalMap = map[string]syscall.Signal{
8
-	"ABRT": syscall.SIGABRT,
9
-	"ALRM": syscall.SIGALRM,
10
-	"BUG": syscall.SIGBUS,
11
-	"CHLD": syscall.SIGCHLD,
12
-	"CONT": syscall.SIGCONT,
13
-	"EMT": syscall.SIGEMT,
14
-	"FPE": syscall.SIGFPE,
15
-	"HUP": syscall.SIGHUP,
16
-	"ILL": syscall.SIGILL,
17
-	"INFO": syscall.SIGINFO,
18
-	"INT": syscall.SIGINT,
19
-	"IO": syscall.SIGIO,
20
-	"IOT": syscall.SIGIOT,
21
-	"KILL": syscall.SIGKILL,
22
-	"PIPE": syscall.SIGPIPE,
23
-	"PROF": syscall.SIGPROF,
24
-	"QUIT": syscall.SIGQUIT,
25
-	"SEGV": syscall.SIGSEGV,
26
-	"STOP": syscall.SIGSTOP,
27
-	"SYS": syscall.SIGSYS,
28
-	"TERM": syscall.SIGTERM,
29
-	"TRAP": syscall.SIGTRAP,
30
-	"TSTP": syscall.SIGTSTP,
31
-	"TTIN": syscall.SIGTTIN,
32
-	"TTOU": syscall.SIGTTOU,
33
-	"URG": syscall.SIGURG,
34
-	"USR1": syscall.SIGUSR1,
35
-	"USR2": syscall.SIGUSR2,
7
+var SignalMap = map[string]syscall.Signal{
8
+	"ABRT":   syscall.SIGABRT,
9
+	"ALRM":   syscall.SIGALRM,
10
+	"BUG":    syscall.SIGBUS,
11
+	"CHLD":   syscall.SIGCHLD,
12
+	"CONT":   syscall.SIGCONT,
13
+	"EMT":    syscall.SIGEMT,
14
+	"FPE":    syscall.SIGFPE,
15
+	"HUP":    syscall.SIGHUP,
16
+	"ILL":    syscall.SIGILL,
17
+	"INFO":   syscall.SIGINFO,
18
+	"INT":    syscall.SIGINT,
19
+	"IO":     syscall.SIGIO,
20
+	"IOT":    syscall.SIGIOT,
21
+	"KILL":   syscall.SIGKILL,
22
+	"PIPE":   syscall.SIGPIPE,
23
+	"PROF":   syscall.SIGPROF,
24
+	"QUIT":   syscall.SIGQUIT,
25
+	"SEGV":   syscall.SIGSEGV,
26
+	"STOP":   syscall.SIGSTOP,
27
+	"SYS":    syscall.SIGSYS,
28
+	"TERM":   syscall.SIGTERM,
29
+	"TRAP":   syscall.SIGTRAP,
30
+	"TSTP":   syscall.SIGTSTP,
31
+	"TTIN":   syscall.SIGTTIN,
32
+	"TTOU":   syscall.SIGTTOU,
33
+	"URG":    syscall.SIGURG,
34
+	"USR1":   syscall.SIGUSR1,
35
+	"USR2":   syscall.SIGUSR2,
36 36
 	"VTALRM": syscall.SIGVTALRM,
37
-	"WINCH": syscall.SIGWINCH,
38
-	"XCPU": syscall.SIGXCPU,
39
-	"XFSZ": syscall.SIGXFSZ,
37
+	"WINCH":  syscall.SIGWINCH,
38
+	"XCPU":   syscall.SIGXCPU,
39
+	"XFSZ":   syscall.SIGXFSZ,
40 40
 }
... ...
@@ -6,7 +6,7 @@ import (
6 6
 	"syscall"
7 7
 )
8 8
 
9
-var signalMap = map[string]syscall.Signal{
9
+var SignalMap = map[string]syscall.Signal{
10 10
 	"ABRT":   syscall.SIGABRT,
11 11
 	"ALRM":   syscall.SIGALRM,
12 12
 	"BUF":    syscall.SIGBUS,
... ...
@@ -4,7 +4,7 @@ import (
4 4
 	"syscall"
5 5
 )
6 6
 
7
-var signalMap = map[string]syscall.Signal{
7
+var SignalMap = map[string]syscall.Signal{
8 8
 	"ABRT":   syscall.SIGABRT,
9 9
 	"ALRM":   syscall.SIGALRM,
10 10
 	"BUS":    syscall.SIGBUS,
... ...
@@ -6,4 +6,4 @@ import (
6 6
 	"syscall"
7 7
 )
8 8
 
9
-var signalMap = map[string]syscall.Signal{}
9
+var SignalMap = map[string]syscall.Signal{}
... ...
@@ -8,6 +8,7 @@ import (
8 8
 	"github.com/dotcloud/docker/dockerversion"
9 9
 	"github.com/dotcloud/docker/engine"
10 10
 	"github.com/dotcloud/docker/pkg/graphdb"
11
+	"github.com/dotcloud/docker/pkg/signal"
11 12
 	"github.com/dotcloud/docker/registry"
12 13
 	"github.com/dotcloud/docker/runconfig"
13 14
 	"github.com/dotcloud/docker/utils"
... ...
@@ -18,7 +19,7 @@ import (
18 18
 	"net/url"
19 19
 	"os"
20 20
 	"os/exec"
21
-	"os/signal"
21
+	gosignal "os/signal"
22 22
 	"path"
23 23
 	"path/filepath"
24 24
 	"runtime"
... ...
@@ -47,7 +48,7 @@ func InitServer(job *engine.Job) engine.Status {
47 47
 	}
48 48
 	job.Logf("Setting up signal traps")
49 49
 	c := make(chan os.Signal, 1)
50
-	signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT)
50
+	gosignal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT)
51 51
 	go func() {
52 52
 		sig := <-c
53 53
 		log.Printf("Received signal '%v', exiting\n", sig)
... ...
@@ -122,56 +123,30 @@ func (v *simpleVersionInfo) Version() string {
122 122
 // for the container to exit.
123 123
 // If a signal is given, then just send it to the container and return.
124 124
 func (srv *Server) ContainerKill(job *engine.Job) engine.Status {
125
-	signalMap := map[string]syscall.Signal{
126
-		"HUP":  syscall.SIGHUP,
127
-		"INT":  syscall.SIGINT,
128
-		"QUIT": syscall.SIGQUIT,
129
-		"ILL":  syscall.SIGILL,
130
-		"TRAP": syscall.SIGTRAP,
131
-		"ABRT": syscall.SIGABRT,
132
-		"BUS":  syscall.SIGBUS,
133
-		"FPE":  syscall.SIGFPE,
134
-		"KILL": syscall.SIGKILL,
135
-		"USR1": syscall.SIGUSR1,
136
-		"SEGV": syscall.SIGSEGV,
137
-		"USR2": syscall.SIGUSR2,
138
-		"PIPE": syscall.SIGPIPE,
139
-		"ALRM": syscall.SIGALRM,
140
-		"TERM": syscall.SIGTERM,
141
-		//"STKFLT": syscall.SIGSTKFLT,
142
-		"CHLD":   syscall.SIGCHLD,
143
-		"CONT":   syscall.SIGCONT,
144
-		"STOP":   syscall.SIGSTOP,
145
-		"TSTP":   syscall.SIGTSTP,
146
-		"TTIN":   syscall.SIGTTIN,
147
-		"TTOU":   syscall.SIGTTOU,
148
-		"URG":    syscall.SIGURG,
149
-		"XCPU":   syscall.SIGXCPU,
150
-		"XFSZ":   syscall.SIGXFSZ,
151
-		"VTALRM": syscall.SIGVTALRM,
152
-		"PROF":   syscall.SIGPROF,
153
-		"WINCH":  syscall.SIGWINCH,
154
-		"IO":     syscall.SIGIO,
155
-		//"PWR":    syscall.SIGPWR,
156
-		"SYS": syscall.SIGSYS,
157
-	}
158
-
159 125
 	if n := len(job.Args); n < 1 || n > 2 {
160 126
 		return job.Errorf("Usage: %s CONTAINER [SIGNAL]", job.Name)
161 127
 	}
162
-	name := job.Args[0]
163
-	var sig uint64
128
+	var (
129
+		name = job.Args[0]
130
+		sig  uint64
131
+		err  error
132
+	)
133
+
134
+	// If we have a signal, look at it. Otherwise, do nothing
164 135
 	if len(job.Args) == 2 && job.Args[1] != "" {
165
-		sig = uint64(signalMap[job.Args[1]])
166
-		if sig == 0 {
167
-			var err error
168
-			// The largest legal signal is 31, so let's parse on 5 bits
169
-			sig, err = strconv.ParseUint(job.Args[1], 10, 5)
170
-			if err != nil {
136
+		// Check if we passed the singal as a number:
137
+		// The largest legal signal is 31, so let's parse on 5 bits
138
+		sig, err = strconv.ParseUint(job.Args[1], 10, 5)
139
+		if err != nil {
140
+			// The signal is not a number, treat it as a string
141
+			sig = uint64(signal.SignalMap[job.Args[1]])
142
+			if sig == 0 {
171 143
 				return job.Errorf("Invalid signal: %s", job.Args[1])
172 144
 			}
145
+
173 146
 		}
174 147
 	}
148
+
175 149
 	if container := srv.runtime.Get(name); container != nil {
176 150
 		// If no signal is passed, or SIGKILL, perform regular Kill (SIGKILL + wait())
177 151
 		if sig == 0 || syscall.Signal(sig) == syscall.SIGKILL {