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  }