github.com/apptainer/singularity@v3.1.1+incompatible/internal/pkg/util/signal/signal.go (about)

     1  // Copyright (c) 2018, Sylabs Inc. All rights reserved.
     2  // This software is licensed under a 3-clause BSD license. Please consult the
     3  // LICENSE.md file distributed with the sources of this project regarding your
     4  // rights to use or distribute this software.
     5  
     6  package signal
     7  
     8  import (
     9  	"fmt"
    10  	"strconv"
    11  	"strings"
    12  	"syscall"
    13  )
    14  
    15  var signalMap = map[string]syscall.Signal{
    16  	"SIGHUP":    syscall.SIGHUP,
    17  	"SIGINT":    syscall.SIGINT,
    18  	"SIGQUIT":   syscall.SIGQUIT,
    19  	"SIGILL":    syscall.SIGILL,
    20  	"SIGTRAP":   syscall.SIGTRAP,
    21  	"SIGABRT":   syscall.SIGABRT,
    22  	"SIGBUS":    syscall.SIGBUS,
    23  	"SIGFPE":    syscall.SIGFPE,
    24  	"SIGKILL":   syscall.SIGKILL,
    25  	"SIGUSR1":   syscall.SIGUSR1,
    26  	"SIGSEGV":   syscall.SIGSEGV,
    27  	"SIGUSR2":   syscall.SIGUSR2,
    28  	"SIGPIPE":   syscall.SIGPIPE,
    29  	"SIGALRM":   syscall.SIGALRM,
    30  	"SIGTERM":   syscall.SIGTERM,
    31  	"SIGSTKFLT": syscall.SIGSTKFLT,
    32  	"SIGCHLD":   syscall.SIGCHLD,
    33  	"SIGCONT":   syscall.SIGCONT,
    34  	"SIGSTOP":   syscall.SIGSTOP,
    35  	"SIGTSTP":   syscall.SIGTSTP,
    36  	"SIGTTIN":   syscall.SIGTTIN,
    37  	"SIGTTOU":   syscall.SIGTTOU,
    38  	"SIGURG":    syscall.SIGURG,
    39  	"SIGXCPU":   syscall.SIGXCPU,
    40  	"SIGXFSZ":   syscall.SIGXFSZ,
    41  	"SIGVTALRM": syscall.SIGVTALRM,
    42  	"SIGPROF":   syscall.SIGPROF,
    43  	"SIGWINCH":  syscall.SIGWINCH,
    44  	"SIGIO":     syscall.SIGIO,
    45  	"SIGPWR":    syscall.SIGPWR,
    46  	"SIGSYS":    syscall.SIGSYS,
    47  }
    48  
    49  const signalMax = syscall.SIGSYS
    50  
    51  // Convert converts a signal string to corresponding signal number
    52  func Convert(sig string) (syscall.Signal, error) {
    53  	var sigNum syscall.Signal
    54  
    55  	if strings.HasPrefix(sig, "SIG") {
    56  		if sigNum, ok := signalMap[sig]; ok {
    57  			return sigNum, nil
    58  		}
    59  	}
    60  
    61  	if sigNum, ok := signalMap["SIG"+sig]; ok {
    62  		return sigNum, nil
    63  	}
    64  
    65  	sigConv, err := strconv.ParseInt(sig, 10, 32)
    66  	if err == nil {
    67  		if sigConv <= int64(signalMax) && sigConv > 0 {
    68  			return syscall.Signal(sigConv), nil
    69  		}
    70  	}
    71  
    72  	return sigNum, fmt.Errorf("can't convert %s to signal number", sig)
    73  }