123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- // Package signal provides helper functions for dealing with signals across
- // various operating systems.
- package signal
- import (
- "fmt"
- "os"
- "os/signal"
- "strconv"
- "strings"
- "syscall"
- )
- // CatchAll catches all signals and relays them to the specified channel.
- func CatchAll(sigc chan os.Signal) {
- handledSigs := []os.Signal{}
- for _, s := range SignalMap {
- handledSigs = append(handledSigs, s)
- }
- signal.Notify(sigc, handledSigs...)
- }
- // StopCatch stops catching the signals and closes the specified channel.
- func StopCatch(sigc chan os.Signal) {
- signal.Stop(sigc)
- close(sigc)
- }
- // ParseSignal translates a string to a valid syscall signal.
- // It returns an error if the signal map doesn't include the given signal.
- func ParseSignal(rawSignal string) (syscall.Signal, error) {
- s, err := strconv.Atoi(rawSignal)
- if err == nil {
- if s == 0 {
- return -1, fmt.Errorf("Invalid signal: %s", rawSignal)
- }
- return syscall.Signal(s), nil
- }
- signal, ok := SignalMap[strings.TrimPrefix(strings.ToUpper(rawSignal), "SIG")]
- if !ok {
- return -1, fmt.Errorf("Invalid signal: %s", rawSignal)
- }
- return signal, nil
- }
- // ValidSignalForPlatform returns true if a signal is valid on the platform
- func ValidSignalForPlatform(sig syscall.Signal) bool {
- for _, v := range SignalMap {
- if v == sig {
- return true
- }
- }
- return false
- }
|