Skip to content

Commit 9b0136d

Browse files
authored
Merge pull request #70 from thaJeztah/integrate_moby_signal_take2
migrate github.com/docker/docker/pkg/signal (take 2)
2 parents 40883be + 1e8ecd8 commit 9b0136d

13 files changed

Lines changed: 492 additions & 1 deletion

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
.SHELLFLAGS = -ec
2-
PACKAGES ?= mountinfo mount symlink
2+
PACKAGES ?= mountinfo mount signal symlink
33
BINDIR ?= _build/bin
44
CROSS ?= linux/arm linux/arm64 linux/ppc64le linux/s390x \
55
freebsd/amd64 openbsd/amd64 darwin/amd64 darwin/arm64 windows/amd64

signal/go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module github.com/moby/sys/signal
2+
3+
go 1.13
4+
5+
require golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c

signal/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
2+
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

signal/signal.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Package signal provides helper functions for dealing with signals across
2+
// various operating systems.
3+
package signal
4+
5+
import (
6+
"fmt"
7+
"os"
8+
"os/signal"
9+
"strconv"
10+
"strings"
11+
"syscall"
12+
)
13+
14+
// CatchAll catches all signals and relays them to the specified channel.
15+
// SIGURG is not handled, as it's used by the Go runtime to support
16+
// preemptable system calls.
17+
func CatchAll(sigc chan os.Signal) {
18+
var handledSigs []os.Signal
19+
for n, s := range SignalMap {
20+
if n == "URG" {
21+
// Do not handle SIGURG, as in go1.14+, the go runtime issues
22+
// SIGURG as an interrupt to support preemptable system calls on Linux.
23+
continue
24+
}
25+
handledSigs = append(handledSigs, s)
26+
}
27+
signal.Notify(sigc, handledSigs...)
28+
}
29+
30+
// StopCatch stops catching the signals and closes the specified channel.
31+
func StopCatch(sigc chan os.Signal) {
32+
signal.Stop(sigc)
33+
close(sigc)
34+
}
35+
36+
// ParseSignal translates a string to a valid syscall signal.
37+
// It returns an error if the signal map doesn't include the given signal.
38+
func ParseSignal(rawSignal string) (syscall.Signal, error) {
39+
s, err := strconv.Atoi(rawSignal)
40+
if err == nil {
41+
if s == 0 {
42+
return -1, fmt.Errorf("Invalid signal: %s", rawSignal)
43+
}
44+
return syscall.Signal(s), nil
45+
}
46+
signal, ok := SignalMap[strings.TrimPrefix(strings.ToUpper(rawSignal), "SIG")]
47+
if !ok {
48+
return -1, fmt.Errorf("Invalid signal: %s", rawSignal)
49+
}
50+
return signal, nil
51+
}
52+
53+
// ValidSignalForPlatform returns true if a signal is valid on the platform
54+
func ValidSignalForPlatform(sig syscall.Signal) bool {
55+
for _, v := range SignalMap {
56+
if v == sig {
57+
return true
58+
}
59+
}
60+
return false
61+
}

signal/signal_darwin.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package signal
2+
3+
import (
4+
"syscall"
5+
)
6+
7+
// SignalMap is a map of Darwin signals.
8+
var SignalMap = map[string]syscall.Signal{
9+
"ABRT": syscall.SIGABRT,
10+
"ALRM": syscall.SIGALRM,
11+
"BUG": syscall.SIGBUS,
12+
"CHLD": syscall.SIGCHLD,
13+
"CONT": syscall.SIGCONT,
14+
"EMT": syscall.SIGEMT,
15+
"FPE": syscall.SIGFPE,
16+
"HUP": syscall.SIGHUP,
17+
"ILL": syscall.SIGILL,
18+
"INFO": syscall.SIGINFO,
19+
"INT": syscall.SIGINT,
20+
"IO": syscall.SIGIO,
21+
"IOT": syscall.SIGIOT,
22+
"KILL": syscall.SIGKILL,
23+
"PIPE": syscall.SIGPIPE,
24+
"PROF": syscall.SIGPROF,
25+
"QUIT": syscall.SIGQUIT,
26+
"SEGV": syscall.SIGSEGV,
27+
"STOP": syscall.SIGSTOP,
28+
"SYS": syscall.SIGSYS,
29+
"TERM": syscall.SIGTERM,
30+
"TRAP": syscall.SIGTRAP,
31+
"TSTP": syscall.SIGTSTP,
32+
"TTIN": syscall.SIGTTIN,
33+
"TTOU": syscall.SIGTTOU,
34+
"URG": syscall.SIGURG,
35+
"USR1": syscall.SIGUSR1,
36+
"USR2": syscall.SIGUSR2,
37+
"VTALRM": syscall.SIGVTALRM,
38+
"WINCH": syscall.SIGWINCH,
39+
"XCPU": syscall.SIGXCPU,
40+
"XFSZ": syscall.SIGXFSZ,
41+
}

signal/signal_freebsd.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package signal
2+
3+
import (
4+
"syscall"
5+
)
6+
7+
// SignalMap is a map of FreeBSD signals.
8+
var SignalMap = map[string]syscall.Signal{
9+
"ABRT": syscall.SIGABRT,
10+
"ALRM": syscall.SIGALRM,
11+
"BUF": syscall.SIGBUS,
12+
"CHLD": syscall.SIGCHLD,
13+
"CONT": syscall.SIGCONT,
14+
"EMT": syscall.SIGEMT,
15+
"FPE": syscall.SIGFPE,
16+
"HUP": syscall.SIGHUP,
17+
"ILL": syscall.SIGILL,
18+
"INFO": syscall.SIGINFO,
19+
"INT": syscall.SIGINT,
20+
"IO": syscall.SIGIO,
21+
"IOT": syscall.SIGIOT,
22+
"KILL": syscall.SIGKILL,
23+
"LWP": syscall.SIGLWP,
24+
"PIPE": syscall.SIGPIPE,
25+
"PROF": syscall.SIGPROF,
26+
"QUIT": syscall.SIGQUIT,
27+
"SEGV": syscall.SIGSEGV,
28+
"STOP": syscall.SIGSTOP,
29+
"SYS": syscall.SIGSYS,
30+
"TERM": syscall.SIGTERM,
31+
"THR": syscall.SIGTHR,
32+
"TRAP": syscall.SIGTRAP,
33+
"TSTP": syscall.SIGTSTP,
34+
"TTIN": syscall.SIGTTIN,
35+
"TTOU": syscall.SIGTTOU,
36+
"URG": syscall.SIGURG,
37+
"USR1": syscall.SIGUSR1,
38+
"USR2": syscall.SIGUSR2,
39+
"VTALRM": syscall.SIGVTALRM,
40+
"WINCH": syscall.SIGWINCH,
41+
"XCPU": syscall.SIGXCPU,
42+
"XFSZ": syscall.SIGXFSZ,
43+
}

signal/signal_linux.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// +build !mips,!mipsle,!mips64,!mips64le
2+
3+
package signal
4+
5+
import (
6+
"syscall"
7+
8+
"golang.org/x/sys/unix"
9+
)
10+
11+
const (
12+
sigrtmin = 34
13+
sigrtmax = 64
14+
)
15+
16+
// SignalMap is a map of Linux signals.
17+
var SignalMap = map[string]syscall.Signal{
18+
"ABRT": unix.SIGABRT,
19+
"ALRM": unix.SIGALRM,
20+
"BUS": unix.SIGBUS,
21+
"CHLD": unix.SIGCHLD,
22+
"CLD": unix.SIGCLD,
23+
"CONT": unix.SIGCONT,
24+
"FPE": unix.SIGFPE,
25+
"HUP": unix.SIGHUP,
26+
"ILL": unix.SIGILL,
27+
"INT": unix.SIGINT,
28+
"IO": unix.SIGIO,
29+
"IOT": unix.SIGIOT,
30+
"KILL": unix.SIGKILL,
31+
"PIPE": unix.SIGPIPE,
32+
"POLL": unix.SIGPOLL,
33+
"PROF": unix.SIGPROF,
34+
"PWR": unix.SIGPWR,
35+
"QUIT": unix.SIGQUIT,
36+
"SEGV": unix.SIGSEGV,
37+
"STKFLT": unix.SIGSTKFLT,
38+
"STOP": unix.SIGSTOP,
39+
"SYS": unix.SIGSYS,
40+
"TERM": unix.SIGTERM,
41+
"TRAP": unix.SIGTRAP,
42+
"TSTP": unix.SIGTSTP,
43+
"TTIN": unix.SIGTTIN,
44+
"TTOU": unix.SIGTTOU,
45+
"URG": unix.SIGURG,
46+
"USR1": unix.SIGUSR1,
47+
"USR2": unix.SIGUSR2,
48+
"VTALRM": unix.SIGVTALRM,
49+
"WINCH": unix.SIGWINCH,
50+
"XCPU": unix.SIGXCPU,
51+
"XFSZ": unix.SIGXFSZ,
52+
"RTMIN": sigrtmin,
53+
"RTMIN+1": sigrtmin + 1,
54+
"RTMIN+2": sigrtmin + 2,
55+
"RTMIN+3": sigrtmin + 3,
56+
"RTMIN+4": sigrtmin + 4,
57+
"RTMIN+5": sigrtmin + 5,
58+
"RTMIN+6": sigrtmin + 6,
59+
"RTMIN+7": sigrtmin + 7,
60+
"RTMIN+8": sigrtmin + 8,
61+
"RTMIN+9": sigrtmin + 9,
62+
"RTMIN+10": sigrtmin + 10,
63+
"RTMIN+11": sigrtmin + 11,
64+
"RTMIN+12": sigrtmin + 12,
65+
"RTMIN+13": sigrtmin + 13,
66+
"RTMIN+14": sigrtmin + 14,
67+
"RTMIN+15": sigrtmin + 15,
68+
"RTMAX-14": sigrtmax - 14,
69+
"RTMAX-13": sigrtmax - 13,
70+
"RTMAX-12": sigrtmax - 12,
71+
"RTMAX-11": sigrtmax - 11,
72+
"RTMAX-10": sigrtmax - 10,
73+
"RTMAX-9": sigrtmax - 9,
74+
"RTMAX-8": sigrtmax - 8,
75+
"RTMAX-7": sigrtmax - 7,
76+
"RTMAX-6": sigrtmax - 6,
77+
"RTMAX-5": sigrtmax - 5,
78+
"RTMAX-4": sigrtmax - 4,
79+
"RTMAX-3": sigrtmax - 3,
80+
"RTMAX-2": sigrtmax - 2,
81+
"RTMAX-1": sigrtmax - 1,
82+
"RTMAX": sigrtmax,
83+
}

signal/signal_linux_mipsx.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// +build linux
2+
// +build mips mipsle mips64 mips64le
3+
4+
package signal
5+
6+
import (
7+
"syscall"
8+
9+
"golang.org/x/sys/unix"
10+
)
11+
12+
const (
13+
sigrtmin = 34
14+
sigrtmax = 127
15+
)
16+
17+
// SignalMap is a map of Linux signals.
18+
var SignalMap = map[string]syscall.Signal{
19+
"ABRT": unix.SIGABRT,
20+
"ALRM": unix.SIGALRM,
21+
"BUS": unix.SIGBUS,
22+
"CHLD": unix.SIGCHLD,
23+
"CLD": unix.SIGCLD,
24+
"CONT": unix.SIGCONT,
25+
"FPE": unix.SIGFPE,
26+
"HUP": unix.SIGHUP,
27+
"ILL": unix.SIGILL,
28+
"INT": unix.SIGINT,
29+
"IO": unix.SIGIO,
30+
"IOT": unix.SIGIOT,
31+
"KILL": unix.SIGKILL,
32+
"PIPE": unix.SIGPIPE,
33+
"POLL": unix.SIGPOLL,
34+
"PROF": unix.SIGPROF,
35+
"PWR": unix.SIGPWR,
36+
"QUIT": unix.SIGQUIT,
37+
"SEGV": unix.SIGSEGV,
38+
"EMT": unix.SIGEMT,
39+
"STOP": unix.SIGSTOP,
40+
"SYS": unix.SIGSYS,
41+
"TERM": unix.SIGTERM,
42+
"TRAP": unix.SIGTRAP,
43+
"TSTP": unix.SIGTSTP,
44+
"TTIN": unix.SIGTTIN,
45+
"TTOU": unix.SIGTTOU,
46+
"URG": unix.SIGURG,
47+
"USR1": unix.SIGUSR1,
48+
"USR2": unix.SIGUSR2,
49+
"VTALRM": unix.SIGVTALRM,
50+
"WINCH": unix.SIGWINCH,
51+
"XCPU": unix.SIGXCPU,
52+
"XFSZ": unix.SIGXFSZ,
53+
"RTMIN": sigrtmin,
54+
"RTMIN+1": sigrtmin + 1,
55+
"RTMIN+2": sigrtmin + 2,
56+
"RTMIN+3": sigrtmin + 3,
57+
"RTMIN+4": sigrtmin + 4,
58+
"RTMIN+5": sigrtmin + 5,
59+
"RTMIN+6": sigrtmin + 6,
60+
"RTMIN+7": sigrtmin + 7,
61+
"RTMIN+8": sigrtmin + 8,
62+
"RTMIN+9": sigrtmin + 9,
63+
"RTMIN+10": sigrtmin + 10,
64+
"RTMIN+11": sigrtmin + 11,
65+
"RTMIN+12": sigrtmin + 12,
66+
"RTMIN+13": sigrtmin + 13,
67+
"RTMIN+14": sigrtmin + 14,
68+
"RTMIN+15": sigrtmin + 15,
69+
"RTMAX-14": sigrtmax - 14,
70+
"RTMAX-13": sigrtmax - 13,
71+
"RTMAX-12": sigrtmax - 12,
72+
"RTMAX-11": sigrtmax - 11,
73+
"RTMAX-10": sigrtmax - 10,
74+
"RTMAX-9": sigrtmax - 9,
75+
"RTMAX-8": sigrtmax - 8,
76+
"RTMAX-7": sigrtmax - 7,
77+
"RTMAX-6": sigrtmax - 6,
78+
"RTMAX-5": sigrtmax - 5,
79+
"RTMAX-4": sigrtmax - 4,
80+
"RTMAX-3": sigrtmax - 3,
81+
"RTMAX-2": sigrtmax - 2,
82+
"RTMAX-1": sigrtmax - 1,
83+
"RTMAX": sigrtmax,
84+
}

0 commit comments

Comments
 (0)