github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/signal/signal_common.go (about) 1 package signal 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 "syscall" 8 ) 9 10 // ParseSignal translates a string to a valid syscall signal. 11 // It returns an error if the signal map doesn't include the given signal. 12 func ParseSignal(rawSignal string) (syscall.Signal, error) { 13 s, err := strconv.Atoi(rawSignal) 14 if err == nil { 15 if s == 0 { 16 return -1, fmt.Errorf("invalid signal: %s", rawSignal) 17 } 18 return syscall.Signal(s), nil 19 } 20 sig, ok := signalMap[strings.TrimPrefix(strings.ToUpper(rawSignal), "SIG")] 21 if !ok { 22 return -1, fmt.Errorf("invalid signal: %s", rawSignal) 23 } 24 return sig, nil 25 } 26 27 // ParseSignalNameOrNumber translates a string to a valid syscall signal. Input 28 // can be a name or number representation i.e. "KILL" "9" 29 func ParseSignalNameOrNumber(rawSignal string) (syscall.Signal, error) { 30 basename := strings.TrimPrefix(rawSignal, "-") 31 s, err := ParseSignal(basename) 32 if err == nil { 33 return s, nil 34 } 35 for k, v := range signalMap { 36 if k == strings.ToUpper(basename) { 37 return v, nil 38 } 39 } 40 return -1, fmt.Errorf("invalid signal: %s", basename) 41 }